版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务1-2一个LED发光二极管的闪烁控制《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务要求任务要求用单片机控制一个LED,并将其点亮。二、任务分析单片机点亮一个LED系统是最简单的单片机应用系统,包括硬件电路、电路板制作、控制程序设计、程序下载并运行等步骤。三、硬件电路硬件电路D1I。+5V510Ω限流电阻R?电流控制型器件D1LED导通压降UD=1.7VLED工作电流范围ID=3mA-20mAR上压降UR=5V-1.7V=3.3VR最大=3.3V/3mA=1.1KΩ
R最小=3.3V/20mA=165Ω
I。+5VR=200Ω-1KΩ元件名称参数数量元件名称参数数量IC插座DIP401弹性按键
1单片机DIP40封装的51单片机1电阻R11KΩ1晶体振荡器6M或12M1电阻R210KΩ1瓷片电容30pf2电解电容C322µf1发光二极管D1
1
单片机控制LED系统器件清单
发光二级管LightEmittingDiode——LED+-正极负极+-正极负极直插式LED贴片LED正极负极电流控制型器件I电流控制型器件I。+5V3mA到20mA电流控制型器件I。+5V限流电阻R=200Ω-1KΩ+5VGND×四、电路板制作五、控制程序#include<reg51.h>//包含头文件reg51.h,定义了51单片机的专用寄存器sbitLED=P1^0; //定义位名称voidmain()//主函数{LED=0; //点亮LEDwhile(1){}}六、下载运行连接下载线,打开实验板的电源,下载程序步骤1:选择芯片类型步骤2:波特率设置步骤3:选择低速下载步骤4:打开HEX文件步骤5:下载程序感谢您的观看Thanks
for
your
attention.
实例2控制1个LED闪烁《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务要求任务要求通过单片机控制一个LED发光二极管闪烁系统的制作二、任务分析LED闪动的过程是亮灭交替的过程。所以,程序不仅能点亮LED,还要能熄灭LED。同时,注意LED闪动的时间控制。三、控制程序//程序:ex2.c//功能:LED闪烁控制#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitLED=P1^0; //定义P1.0引脚位名称为LED//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
while(1)//无限循环{ LED=0;//点亮LED delay(20000); //软件延时 LED=1;//点亮LED delay(20000); //软件延时}}感谢您的观看Thanks
for
your
attention.
实例3控制1个LED闪烁《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务要求任务要求用单片机控制8个LED同时闪烁。二、任务分析单片机有4个并行I/O口P0~P3,每个I/O口包括8条I/O口线。例1中,采用P1口的P1.0引脚实现了1个LED的控制。本例要求控制8个LED,使用P1口的8个I/O口线P1.0~P1.7分别控制1个LED,正好实现了对8个LED的控制。三、硬件电路
8位LED控制电路(采用P1口的8个I/O引脚控制8个LED)四、控制程序//程序:ex3.c//功能:控制8个LED同时闪烁#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
while(1)//无限循环{ P1=0x00;//采用字节操作,点亮8个LED delay(20000); //软件延时 P1=0xff;//采用字节操作,熄灭8个LED delay(20000); //软件延时}} 感谢您的观看Thanks
for
your
attention.
实例4单片机控制蜂鸣器发声《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求
用单片机控制蜂鸣器发出声音。在计算机中,简单的提示音,是什么器件发出来的呢?——它就是我们经常用到的一个能发出声音的器件,叫做蜂鸣器。蜂鸣器蜂鸣电路符号按照驱动方式来划分蜂鸣器有源蜂鸣器无源蜂鸣器电源×振荡源有源蜂鸣器:一通电就会响,直流信号驱动无源蜂鸣器:方波驱动,频率一般在2kHz到5kHz之间有源蜂鸣器无源蜂鸣器9mm8mm有源蜂鸣器无源蜂鸣器+-有源蜂鸣器V不能超过标注的额定值+-无源蜂鸣器频率一般在2kHz~5kHz,频率越高,音调也就越高无源蜂鸣器,内部不带振荡源,用高低电平交错的方波来驱动它发声。二、任务分析单片机的并行I/O口不仅可以控制LED,还可以用来控制许多简单器件,本例中的蜂鸣器就是其中之一。硬件设计驱动电路三、硬件电路P1.0硬件电路图单片机控制蜂鸣器电路(采用P1口的P1.0引脚控制蜂鸣器,PNP型三极管9012起驱动作用。)资源分配单片机接口电路P1.0蜂鸣器驱动器件清单序号名称型号/参数数量151单片机STC90516RD+12晶振12MHz13电容30pF24电解电容10uF15按键弹性按键16蜂鸣器无源17三极管9012/PNP18电阻10KΩ19电阻100Ω110电阻3.3KΩ1四、单片机控制蜂鸣器程序设计//程序:ex4.c//功能:蜂鸣器发声控制程序#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitBEEP=P1^0; //定义P1.0引脚位名称为BEEP//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
while(1)//无限循环{ BEEP=0;//蜂鸣器控制引脚产生低电平 delay(100);//软件延时 BEEP=1;//蜂鸣器控制引脚产生高电平 delay(100);//软件延时}} 程序中,给蜂鸣器控制引脚BEEP循环交替清0和置1,就会产生一定频率的方波信号。调整调用delay函数时的实际参数,可以产生不同频率的方波或矩形波,从而可以改变蜂鸣器声音的音调。感谢您的观看Thanks
for
your
attention.
实例5开关控制LED亮灭《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求
用2个开关分别控制2个LED的亮灭。什么是按键开关呢?按钮开关常用按键符号机械式按键开关有一个最大的特点,那就是它是有弹性的。消除抖动方法增加硬件电路软件延时二、任务分析前面例子中,采用单片机并行I/O口控制LED和蜂鸣器,都是输出功能。此例采用单片机并行I/O口来连接开关等输入器件,这时单片机I/O口用作输入功能。三、硬件电路单片机控制LED和开关电路(单片机P1口的P1.0和P1.1作为输出口控制LED显示,P0口的P0.0和P0.1作为输入口连接开关)四、控制程序利用P0.0和P0.1引脚上的高低电平来分别控制LED的亮灭,控制程序如下。//程序:ex5.c//功能:开关控制LED亮灭#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitLED1=P1^0; //定义P1.0引脚位名称为LED1sbitLED2=P1^1; //定义P1.1引脚位名称为LED2sbitS1=P0^0; //定义P0.0引脚位名称为S1sbitS2=P0^1; //定义P0.1引脚位名称为S2voidmain() //主函数{
while(1)//无限循环{ LED1=S1;//开关S1连接的引脚电平状态赋给LED1,控制其亮灭 LED2=S2;//开关S1连接的引脚电平状态赋给LED1,控制其亮灭}}思考题:怎么修改上面程序,实现模拟汽车左右转向灯的功能?参考程序如下。//程序:ex6.c//功能:模拟汽车左右转向灯程序#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitLED1=P1^0; //定义P1.0引脚位名称为LED1,左转向灯sbitLED2=P1^1; //定义P1.1引脚位名称为LED2,右转向灯sbitS1=P0^0; //定义P0.0引脚位名称为S1,S1闭合,左转向灯闪烁sbitS2=P0^1; //定义P0.1引脚位名称为S2,S2闭合,右转向灯闪烁
//如果S1和S2同时闭合则双闪,表示汽车故障//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
while(1)//无限循环{ LED1=S1; //读取S1引脚的命令状态并赋值给左转向灯LED1LED2=S2; //读取S2引脚的命令状态并赋值给右转向灯LED2delay(20000); //软件延时LED1=1; //将LED1引脚置1,熄灭LED1LED2=1; //将LED2引脚置1,熄灭LED2delay(20000); //软件延时}} 感谢您的观看Thanks
for
your
attention.
实例6开关控制LED交替亮灭《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求
用1个开关控制2个LED交替亮灭。二、任务分析控制下,2个LED1、LED2交替亮灭,无论开关SW是闭合还是断开,同一时刻只能有1个LED点亮,另1个LED不亮。
三、硬件电路开关SW控制2个LED交替亮灭的电路(单片机的P1口引脚P1.0和P1.1作为输出口分别连接LED1、LED2,P0口的P0.0引脚作为输入口连接开关SW)四、控制程序当开关SW断开时,LED1亮、LED2灭;当开关SW闭合时,LED1灭而LED2亮,程序如下。//程序:ex7.c//功能:用一个开关SW控制2个LED交替亮灭#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitLED1=P1^0;//定义P1.0引脚位名称为LED1sbitLED2=P1^1;//定义P1.1引脚位名称为LED2sbitSW=P0^0;//定义P0.0引脚位名称为SWvoidmain() //主函数{
while(1)//无限循环
{
LED1=SW;//采用位操作,开关断开时P0.0引脚接高电平,点亮LED1
LED2=~SW;//采用位操作,开关闭合时将接低电平的P0.0引脚状态取反,点亮LED2
}} 感谢您的观看Thanks
for
your
attention.
实例7顺序程序结构实现流水灯《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用顺序程序结构设计控制程序使单片机控制8个LED以流水灯的方式点亮。二、任务分析求用单片机控制8个LED以流水灯的方式依照排列顺序依次逐个点亮,即先点亮LED1,延时一段时间后熄灭;再点亮LED2,延时一段时间后熄灭……;如此依次点亮每一个LED,直到点亮LED8,再从头开始8个LED按流水灯点亮示意图三、硬件电路8位LED控制电路(采用P1口的8个I/O引脚控制8个LED)四、控制程序
顺序程序结构控制流水灯流程图程序演示思考题:怎么修改上面程序,采用位操作方式实现流水灯。感谢您的观看Thanks
for
your
attention.
实例8选择程序结构实现开关控制LED显示《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用一个开关控制8个LED,在全亮和闪烁方式之间切换。二、任务分析按照设计要求,单片机的I/O口上连接8个LED和一个开关SW,单片机通过判断SW的闭合(ON)或断开(OFF)状态,来选择控制8个LED闪烁或全亮。三、硬件电路一个开关控制选择8个LED点亮方式的控制电路(采用P1口的8个I/O引脚控制8个LED,P0.0引脚接收开关电平控制)四、控制程序一个开关控制选择8个LED点亮方式的程序流程图//程序:ex9.c//功能:用开关SW选择8个LED的点亮方式#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR#define
ON0//定义符号常量ONsbit
SW=P0^0;//定义P0.0引脚位名称为SW//函数名:delay //函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
while(1)//无限循环
{
if(SW==ON) //判断开关SW闭合/断开 { P1=0x00;//采用字节操作,点亮8个LED
delay(20000); //软件延时 P1=0xff;//采用字节操作,熄灭8个LED
delay(20000); //软件延时
}
else
P1=0x00;//采用字节操作,8个LED常亮
}}
思考题:怎么修改上面程序,用4个开关选择不同的点亮方式控制8个LED的亮灭。如果4个开关分别连接在单片机的P0.0~P0.3引脚上,参考程序如下。//程序:ex10.c//功能:用4个开关选择控制8个LED的点亮方式#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRvoidmain() //主函数{
unsignedcharsw;//定义字符变量sw while(1)//无限循环
{
sw=P0&0x0f;//sw保存接在P0口上低4位的开关状态
switch(sw)//根据开关状态选择不同的点亮方式 {
case
0x0e:P1=0xfc;break;//P0.0引脚上的开关闭合时,点亮第1、2个LED
case
0x0d:P1=0xf3;break;//P0.1引脚上的开关闭合时,点亮第3、4个LED
case
0x0b:P1=0xcf;break;//P0.2引脚上的开关闭合时,点亮第5、6个LED
case
0x07:P1=0x3f;break;//P0.3引脚上的开关闭合时,点亮第7、8个LED
default:P1=0xff;break; //4个开关断开或同时闭合时,8个LED熄灭
}
}}
进行C51编程时,常用按位与运算对某些位进行清0或保留某些位,例如,在程序ex10.c中,语句“sw=P0&0x0f;”将P0的低4位保留、高4位清0后赋值到变量sw中。还可以用按位或运算进行指定位置1、其余位不变的操作,按位异或运算进行指定位取反、其余位不变的操作。感谢您的观看Thanks
for
your
attention.
实例9移位操作实现流水灯《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用左移“<<”或右移“>>”运算编程控制8个LED以流水灯的方式点亮。二、任务分析控制8个LED按流水灯的方式点亮时,单片机P1口先输出11111110的逻辑电平组合,点亮连接P1.0引脚上的LED,延时一段时间后P1口将0左移1位,即输出11111101,这时点亮连接P1.1引脚上的LED,再延时。以此类推,P1口将0依次左移1位,顺序输出11111011、11110111、11101111、11011111、10111111、01111111,显然,可以采用移位操作实现流水灯效果。三、硬件电路8位LED控制电路(采用P1口的8个I/O引脚控制8个LED)四、控制程序移位运算和循环结构实现流水灯的程序流程图//程序:ex11.c//功能:采用移位操作和循环程序结构实现流水灯的控制#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
unsignedcharaa,i;
//定义字符变量aa,i while(1)//无限循环
{
aa=0x01;//给变量aa赋值0x01,即二进制数00000001
for(i=0;i<8;i++)//用for循环控制移位8次 { P1=~aa;//将aa的值按位取反后送到P1口输出
delay(20000); //软件延时
aa<<=1;//将aa的二进制数值左移一位
} //结束for循环 } }感谢您的观看Thanks
for
your
attention.
实例10库函数实现流水灯《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用C51的库函数进行移位操作编程控制8个LED以流水灯的方式点亮。二、任务分析C51的编译器提供的内部函数库头文件intrins.h中包含有移位操作函数。_crol_函数是循环左移,_cror_()函数是循环右移,我们可以使用这些移位库函数来实现8个LED按流水灯的方式点亮三、硬件电路8位LED控制电路(采用P1口的8个I/O引脚控制8个LED)四、控制程序使用库函数实现流水灯的程序流程图//程序:ex12.c//功能:采用库函数实现流水灯的控制#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR#include
<INTRINS.H>//包含内部函数库INTRINS.H//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
P1=0xfe;//P1口输出0xfe,即11111110 while(1)//无限循环
{
P1=_crol_(P1,1);
//调用内部函数_crol_,将P1的二进制数值左移一位
delay(20000); //软件延时
} }思考题:怎么修改控制程序,使用循环右移库函数实现流水灯。感谢您的观看Thanks
for
your
attention.
实例11延时函数的定义及调用《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求设计有形参的可控时长延时函数delay()与不带形参的固定时长延时函数delay1()用一个开关来控制选择流水灯以2种不同的速度轮流点亮。二、任务分析设计时,使用一个开关SW来控制流水灯的速度,当开关SW断开(OFF)时,选择流水灯以速度1(延时delay)点亮;开关SW闭合(ON)时,选择流水灯以速度2(延时delay1)点亮。三、硬件电路8位LED控制电路(采用P1口的8个I/O引脚控制8个LED)四、控制程序开关控制流水灯速度的程序流程图程序演示感谢您的观看Thanks
for
your
attention.
实例12数组实现流水灯《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求将流水灯的显示状态存放在数组,编程实现流水灯效果。二、任务分析8个LED按流水灯的方式点亮时,单片机P1口顺序输出11111110(0xfe)、11111101(0xfd)、11111011(0xfb)、11110111(0xf7)、11101111(0xef)、11011111(0xdf)、10111111(0xbf)、01111111(0x7f)的逻辑电平组合。设计时,将这些状态数据存放在数组LED中,然后顺序将LED数组中的数组元素送到P1口输出,可以实现流水灯效果。三、硬件电路采用数组实现流水灯的硬件电路四、控制程序采用数组实现流水灯的程序流程图程序演示//程序:ex14.c//功能:采用数组实现流水灯的控制程序#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
unsignedcharcodeLED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//定义字符数组LED,存放流水灯8种显示状态,存放在程序存储区 unsignedchari;//定义字符变量i
while(1)//无限循环
{
for(i=0;i<8;i++)//用for循环控制8次循环次数 {
P1=LED[i];//将循环变量i作为数组下标,送LED[i]送P1口输出
delay(20000); //软件延时
} } }思考题:怎么修改控制程序,让8个LED能分别点亮2、3、4……个LED,或更多种不同组合方式点亮。感谢您的观看Thanks
for
your
attention.
实例13花样霓虹灯《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求
本设计要求单片机控制8个LED按照单灯左移流动、单灯右移流动、双灯从两端向中间流动、双灯从中间向两边流动等多种效果显示,并能不断轮流重复各个显示效果。二、任务分析定义左移流动函数为move_l()、右移流动函数为move_r()、从两端向中间流动函数为move_to_m()、从中间向两端流动函数为move_from_m(),在单片机控制程序的主函数main()中调用这些显示函数,就可以实现各种花样霓虹灯控制。三、硬件电路花样霓虹灯的硬件电路四、控制程序
花样霓虹灯主函数流程图程序演示//程序:ex15.c//功能:花样霓虹灯控制程序#include<REGX51.H>#include<INTRINS.H>//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}//函数名:move_l//函数功能:实现循环左移1位//形式参数:无符号整型变量p,花样霓虹灯显示初值//返回值:无
void
move_l(unsignedcharp)
{
unsignedchari;//定义字符变量i
P1=p; //显示初值送到P1口 for(i=0;i<8;i++)//用for循环控制8次循环次数 {delay(20000); //软件延时 P1=_crol_(P1,1);
//调用内部函数_crol_,将P1的二进制数值左移一位
}}程序演示//函数名:move_r//函数功能:实现循环右移1位//形式参数:无符号整型变量p,花样霓虹灯显示初值//返回值:无
void
move_r(unsignedcharp)
{
unsignedchari;//定义字符变量i
P1=p; //显示初值送到P1口 for(i=0;i<8;i++)//用for循环控制8次循环次数 { delay(20000); //软件延时 P1=_cror_(P1,1);
//调用内部函数_cror_,将P1的二进制数值右移一位
}}//函数名:move_to_m//函数功能:实现从两端向中间移动1位//形式参数:无符号整型变量p,花样霓虹灯显示初值//返回值:无
void
move_to_m(unsignedcharp)
{
unsignedchari;//定义字符变量i for(i=0;i<4;i++)//用for循环控制4次循环次数 { P1=((p<<i)&0x0F)|(0xF0&(p>>i));
//i为移动位数,完成左移、右移后再按位或
delay(20000); //软件延时
}}程序演示//函数名:move_from_m//函数功能:实现从中间向两端移动1位//形式参数:无符号整型变量p,花样霓虹灯显示初值//返回值:无
void
move_from_m(unsignedcharp)
{
unsignedchari;//定义字符变量i for(i=0;i<4;i++)//用for循环控制4次循环次数 { P1=((p&0xF0)<<i)|((p&0x0F)>>i);
//i为移动位数,完成左移、右移后再按位或
delay(20000); //软件延时
}}voidmain(){
while(1){move_l(0xfe);//单灯左移move_r(0x7f);//单灯右移 move_l(0xfc);//双灯左移move_r(0x3f);//双灯右移move_to_m(0x7e);//双灯由两端向中间移动move_from_m(0xe7);//双灯由中间向两端移动}}感谢您的观看Thanks
for
your
attention.
实例14贪吃蛇《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求贪吃蛇显示效果图二、任务分析按照设计要求,显示贪吃蛇效果的8个LED中,最左边的LED总是点亮的,而右边的LED总是执行左移一位的操作,每执行完8次左移一位操作后,就增加一位LED灯的点亮。设计时,将每一遍要左移的8位LED初始位置状态保存在字符数组led中,每次左移一位的贪吃蛇位置状态都与0x7f(即最左边点亮的食物灯)进行按位与操作,组合为完整的贪吃蛇显示状态再送到P1口输出。三、硬件电路现贪吃蛇显示效果的硬件电路四、控制程序贪吃蛇主函数流程图程序演示//程序:ex16.c//功能:贪吃蛇控制程序
#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR//函数名:delay//函数功能:实现软件延时voiddelay(unsignedinti){
while(i--);//i次空操作}voidmain() //主函数{
unsignedcharn,i;//定义字符变量n,i
unsignedcharled[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f}; //定义贪吃蛇显示初值,对应7遍移位
while(1) {
for(n=0;n<7;n++)//控制7次循环 { P1=(~led[n])&0x7f;//P1初值,按位与操作点亮食物灯
for(i=1;i<9;i++)//左移次数 { delay(30000); //延时 P1=(~(led[n]<<i))&0x7f; //左移 } } }}思考题:修改程序,实现右移贪吃蛇游戏效果。感谢您的观看Thanks
for
your
attention.
实例15倒车警示器《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求要求用一个开关做为“倒车”挡控制开关,2个黄色的LED做为汽车尾部倒车警示灯,控制电路中再接入一个蜂鸣器。当“倒车”开关闭合时,汽车发出倒车警示信号——通过蜂鸣器发出警示音,并且2个LED不停地闪烁发出黄色警示灯光。二、任务分析使用单片机做为控制器实现倒车警示器设计。将“倒车”挡控制开关SW接入P0.0引脚,2个黄色LED1、LED2分别接入P1.1、P1.2引脚,一个蜂鸣器BEEP接入P1.0引脚。倒车时,开关SW闭合(ON),LED1和LED2闪烁,BEEP发声。三、硬件电路倒车警示器单片机控制电路四、控制程序倒车警示灯主函数流程图
beep_alarm()函数流程图程序演示//程序:ex17.c //功能:倒车警示器控制程序
#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR
#define
ON
0//定义符号常量ON
#define
OFF
1//定义符号常量OFF
sbitBEEP=P1^0;//定义位变量BEEP,蜂鸣器BEEP接P1.0引脚
sbitLED1=P1^1;//定义位变量LED1,警示灯LED1接P1.1引脚
sbitLED2=P1^2;//定义位变量LED2,警示灯LED2接P1.2引脚
sbitSW=P0^0;//定义位变量SW,倒车开关SW接P0.0引脚
//函数名:delay//函数功能:实现软件延时//形式参数:无符号整型变量i,控制空循环的循环次数//返回值:无voiddelay(unsignedinti){
while(i--);//i次空操作}程序演示//函数名:light_alarm//函数功能:实现倒车光警示//形式参数:无//返回值:无voidlight_alarm(){
LED1=~LED1;//LED1闪动
LED2=~LED2;//LED2闪动}//函数名:beep_alarm//函数功能:实现蜂鸣器发“嘀嘀……”声警示//形式参数:无//返回值:无voidbeep_alarm(){
unsignedinti;
for(i=0;i<100;i++) { BEEP=~BEEP; //BEEP发声
delay(100);
}
for(i=0;i<100;i++) { BEEP=OFF;//BEEP不发声
delay(100);
}
}程序演示voidmain() //主函数{
while(1) //无限循环 {
if(SW==ON) //判断倒车开关SW是不是闭合 { light_alarm(); //倒车状态,倒车灯闪烁
beep_alarm(); //倒车状态,倒车蜂鸣器发声
} else
{ LED1=OFF;//非倒车状态,倒车灯LED1熄灭 LED2=OFF; //非倒车状态,倒车灯LED2熄灭 BEEP=OFF;//非倒车状态,蜂鸣器BEEP关闭
}
}}感谢您的观看Thanks
for
your
attention.
实例16LED循环闪烁控制《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用单片机控制8个LED循环闪烁,第1个LED点亮0.5s熄灭1s,闪动10次;然后,第2个LED点亮0.5s熄灭1s,闪动10次;循环8次,第8个LED闪动10次结束,再从第1个开始,如此循环下去。假定晶振频率为12MHz。二、任务分析这里采用定时器/计数器来完成0.5s和1s精确定时,是用硬件加1计数器直接对机器周期进行计数。三、硬件电路单片机控制8个LED电路四、控制程序程序演示//程序:ex18.c//功能:8个LED循环闪烁控制程序#include
<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR#include<INTRINS.h>//包含头文件INTRINS.h,定义了移位函数//函数名:time50ms//函数功能:在T1工作方式1下定时50ms,采用查询方式实现//形式参数:无符号整型变量i,控制定时时间,i*50ms//返回值:无voidtime50ms(unsignedchari){
unsignedchark;for(k=0;k<i;k++){ //循环i次
TH1=(65536-50000)/256;//重新设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256;//重新设置T1计数初值低8位
TR1=1; //启动T1
while(!TF1);//查询计数是否溢出,即定时50ms时间到,TF1=1
TF1=0; //50ms定时时间到,将T1溢出标志位TF1清0
}}程序演示voidmain() //主函数{
unsignedchari,k,w;TMOD=0x10;//设置T1为工作方式1,定时功能P1=0xff; //熄灭8个LED
while(1)//无限循环{w=0xfe; //用来控制显示的位
for(i=0;i<8;i++){ //控制8个LED循环
for(k=0;k<10;k++){//控制每个LED闪烁10次
P1&=w; //点亮指定的LED
time50ms(10);//定时0.5s
P1=0xff; //熄灭8个LED
time50ms(20);}//定时1s
w=_crol_(w,1);} //闪烁的LED循环左移1位
}} 定时时间计算系统采用12MHz晶振,所以机器周期为1µs。程序中,T1工作在定时功能、工作方式1(16位计数器)下,从初值开始,加1计数到计数溢出,共计50000个计数脉冲,即50000个机器周期,所以,定时时间计算如下。t定时=50000×1µs=50ms定时器/计数器编程步骤这里计数溢出处理采用的是查询方式,CPU循环等待TF1标志位由0变1,语句如下。while(!TF1);//查询计数是否溢出,即定时50ms时间到,TF1=1思考题。①如果采用T0的工作方式1进行定时,应该怎么修改程序。②如果采用T1的工作方式0或工作方式2进行定时,应该怎么修改程序。感谢您的观看Thanks
for
your
attention.
实例17简易计数报警《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求模拟银行取款吞卡报警系统,用1个按键模拟密码输入错误,按一下表示密码输入错误一次;用一个LED来模拟吞卡报警。系统要求:当输入密码错误5次,则吞卡报警指示灯点亮3s。假定晶振频率为12MHz。二、任务分析本例中的计数和定时都可以采用定时器/计数器来实现。模拟密码输入错误的按键,接在外部计数脉冲的输入端;定时3s采用定时功能实现。三、硬件电路简易计数报警系统电路(按键K连接在定时器/计数器T1的外部脉冲输入端,用来模拟密码输入错误动作,LEDD1用来模拟吞卡动作。)四、控制程序程序演示//程序:ex19.c//功能:简易计数报警系统控制程序#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitLED=P1^0; //定义P1.0引脚的位名称为LED//函数名:time50ms//函数功能:在T0工作方式1下定时50ms,采用查询方式实现//形式参数:无符号整型变量i,控制定时时间,i*50ms//返回值:无voidtime50ms(unsignedchari){
unsignedchark;
for(k=0;k<i;k++){ //循环i次
TH0=(65536-50000)/256;//重新设置T0计数初值高8位,定时时间50ms
TL0=(65536-50000)%256;//重新设置T0计数初值低8位
TR0=1; //启动T0
while(!TF0);//查询计数是否溢出,即定时50ms时间到,TF0=1
TF0=0; //50ms定时时间到,将T0溢出标志位TF0清0
}}程序演示voidmain() //主函数{LED=1;//熄灭LEDTMOD=0x61; //设置T0为工作方式1,定时;T1为工作方式2,计数TL1=256-5; //设置T1的计数初值,计数个数为5(5次错误)TH1=256-5;//初值缓冲器赋值,具有初值自动重载功能TR1=1;//启动T1,K每按下一次,则加1计数
while(1)//无限循环{
while(!TF1);//查询T1计数是否溢出,即TF1=1 TF1=0; LED=0;//5次计数,计数溢出,则点亮LED time50ms(60); //定时3s LED=1;//熄灭LED}}思考题:系统加上蜂鸣器,怎么修改程序,使得吞卡报警灯亮时,蜂鸣器发出“嘟嘟”声。感谢您的观看Thanks
for
your
attention.
实例18正脉冲宽度测量《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求利用定时器/计数器的门控位GATE测量正脉冲宽度。假定晶振频率12MHz,正脉冲宽度不超过256µs,将测量结果以二进制数形式(00~FF)显示在8个LED上。二、任务分析三、硬件电路四、控制程序程序演示//程序:ex20.c//功能:正脉冲宽度测量程序#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitINPUT=P3^2; //定义P3.2引脚的位名称为INPUTvoidmain() //主函数{TMOD=0x0a; //设置T0:GATE=1,定时功能,工作方式2TL0=0; //设置T0的计数初值为0TH0=0; //初值缓冲器赋值,具有初值自动重载功能
while(INPUT==1); //等待输入脉冲变0TR0=1; //将运行控制位置1,尚未启动计数
while(INPUT==0); //等待输入脉冲变1,真正启动计数
while(INPUT==1); //等待输入脉冲变0,计数器停止计数TR0=0; //将运行控制位清0P1=TL0; //将计数结果显示在P1控制的8个LED上while(1); //停机}思考题:怎么利用GATE门控位设计一个简易频率计,用于测量占空比为50%的方波频率。感谢您的观看Thanks
for
your
attention.
实例19定时器输出PWM可调光台灯《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用1个LED模拟台灯的灯泡(用8个LED模拟效果更好),用1个开关控制灯的亮度;灯泡有较亮和较暗2个亮度,开关闭合时灯泡较亮,开关断开时灯泡较暗。二、任务分析PWM技术,是一种周期一定而高低电平可调的方波信号。当输出脉冲的频率一定时,输出脉冲的占空比越大,其高电平持续的时间越长。
高电平持续的时间与信号周期的比值,称为占空比。只要改变和的值,也就改变波形的占空比,则高低电平持续的时间就改变了,达到PWM脉宽调制的目的。三、硬件电路定时器输出PWM可调光台灯电路(也可以用8个LED模拟台灯灯泡)四、程序设计采用定时器/计数器T0的定时功能亮灭时间的定时。控制灯泡较亮状态和较暗状态的波形控制灯泡较亮状态和较暗状态的波形(a)占空比为1/4的PWM波形(灯泡较亮)(b)占空比为3/4的PWM波形(灯泡较暗)程序演示//程序:ex21.c//功能:定时器输出PWM可调光台灯控制程序#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFRsbitLED=P1^0; //定义P1.0引脚的位名称为LEDsbitS1=P0^0; //定义P0.0引脚的位名称为S1//函数名:time5ms//函数功能:在T0工作方式0下定时5ms,采用查询方式实现//形式参数:无符号整型变量i,控制定时时间,i*5ms//返回值:无voidtime5ms(unsignedchari){unsignedchark;for(k=0;k<i;k++) //循环i次{TH0=(8192-5000)/32;//重新设置T0计数初值高8位,定时时间5msTL0=(8192-5000)%32;//重新设置T0计数初值低8位TR0=1; //启动T0while(!TF0);//查询计数是否溢出,即定时5ms时间到,TF0=1TF0=0; //5ms定时时间到,将T0溢出标志位TF0清0}}程序演示voidmain() //主函数{
TMOD=0x00; //设置T0,定时,方式0
while(1) //无限循环
{
while(S1==0) //开关闭合,占空比为1/4,较亮(低电平亮灯) {
LED=0; //点亮LED time5ms(3); //定时15ms LED=1; //熄灭LED time5ms(1); //定时5ms
}
LED=0; //开关断开,占空比为3/4,较暗 time5ms(1); //定时5ms
LED=1; //熄灭LED
time5ms(3); //定时15ms
}} 思考题:改变定时时间,从而改变PWM输出波形,使得灯泡亮度发生变化。感谢您的观看Thanks
for
your
attention.
实例20中断实现LED闪烁控制《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求二、任务分析8位LED流水灯、LED闪烁和交替亮灭时间可以采用定时器/计数器实现精确定时。2个按键实现外部中断源的中断申请,中断过程和中断编程是本例的关键。三、硬件电路中断实现LED闪烁控制电路(P1口控制8个LED,按键K1和K2分别连接2个外部中断输入端)四、程序设计程序演示//程序:ex22.c//功能:中断实现LED闪烁控制程序#include<REGX51.H>//包含头文件REGX51.H,定义了51单片机的所有SFR#include<INTRINS.H>sbitK1=P3^2; //定义P3.2引脚的位名称为K1sbitK2=P3^3; //定义P3.3引脚的位名称为K2//函数名:delayms//函数功能:延时处理程序,单位毫秒//形式参数:无符号整型数,延时的毫秒数//返回值:无voiddelayms(unsignedintms) {unsignedinti;while(ms--){ for(i=0;i<120;i++);//12MHz晶体}}程序演示//函数名:time50ms//函数功能:在T0工作方式1下定时50ms,采用查询方式实现//形式参数:无符号整型变量i,控制定时时间,i*50ms//返回值:无voidtime50ms(unsignedchari){unsignedchark;for(k=0;k<i;k++) //循环i次
{
TH0=(65536-50000)/256;//重新设置T0计数初值高8位,定时时间50ms
TL0=(65536-50000)%256;//重新设置T0计数初值低8位
TR0=1; //启动T0
while(!TF0);//查询计数是否溢出,即定时5ms时间到,TF0=1
TF0=0; //50ms定时时间到,将T0溢出标志位TF0清0
}}程序演示voidmain() //主函数{TMOD=0x01; //设置T0,定时,方式1EX0=1; //外部中断0允许位IT0=1; //设置外部中断0为下降沿触发方式PX0=1;//设置外部中断0为高优先级EX1=1; //外部中断1允许位IT1=0; //设置外部中断1为低电平触发方式EA=1;//允许所有中断P1=0xfe; //设置左移流水灯初值while(1) //无限循环{ time50ms(20);//延时1s
P1=_crol_(P1,1); //P1左移1位控制流水灯效果}}程序演示voidmain() //主函数{TMOD=0x01; //设置T0,定时,方式1EX0=1; //外部中断0允许位IT0=1; //设置外部中断0为下降沿触发方式PX0=1;//设置外部中断0为高优先级EX1=1; //外部中断1允许位IT1=0; //设置外部中断1为低电平触发方式EA=1;//允许所有中断P1=0xfe; //设置左移流水灯初值while(1) //无限循环{ time50ms(20);//延时1s
P1=_crol_(P1,1); //P1左移1位控制流水灯效果}}程序演示程序演示思考题:(1)如果删除main()函数中的语句PX0=1;,请问K1还可以中断K2实现中断嵌套吗?(2)函数int_0()和int_1()是什么时候调用的,与函数time50ms()的调用有什么不同。提示:低优先级不可以中断高优先级实现中断嵌套;同一级别的2个中断源,也不可以实现中断嵌套。感谢您的观看Thanks
for
your
attention.
实例21唱响音符《单片机基础与应用(C语言版)》高等教育出版社深圳职业技术大学一、任务导入任务要求用单片机控制蜂鸣器,唱响7个基本音符1-2-3-4-5-6-7,晶振频率为12MHz。二、任务分析通过对蜂鸣器输出不同频率的方波信号,就可以发出不同音调的声音,常用的七个基本音符1、2、3、4、6、7(do-re-mi-fa-so-la-si),就是7个频率由低到高排列的自然音。音符1234567频率(Hz)262294330349392440494基本音符对应频率关系表基本音符基本音符以262Hz频率方波为例:周期:T=1/262s=3817us将此周期除以2,即为半周期的时间,也就是高、低电平的持续时间为1908us利用单片机定时器/计数器T0来定时1908us假如采用12MHz晶振:T机器周期=1us工作方式1,最大计数值M=65536,根据公式:t定时=(M-T初值)*T机器周期T初值=M-1908/T机器周期=65536-1908/1=63628基本音符与定时器/计数器初值的对应关系表基本音符频率周期半周期初值Do2623817190863628Re2943401170163835Mi3303030151564021Fa3492865143364103So3922551127664260La4402273113664400Si4942024101264524备注:采用12MHz晶振,T机器周期=1us,工作方式1,最大计数值M=65536三、硬件电路单片机控制蜂鸣器的硬件电路四、程序设计设计思路设置单片机定时器T0定时功能,工作方式1,定时溢出采用中断处理,在中断服务函数中,重新赋初值,进入下一个音符,同时翻转蜂鸣器控制信号,产生规定频率方波,让蜂鸣器发出对应音符的声音。那每个音符持续多长时间呢?每个音符持续固定时间,采用软件延时。如果需要每个音符用不同的节拍演唱,可以把程序中的delay(30000);语句中的常量30000用一个表达式代替,在一个数组中定义每个音符对应的节拍数,例如:unsignedcharjiepai[]={1,4,2,1,3,1,4};//7个基本音符对应的时长控制然后修改delay(30000);如下:delay(10000*jiepai[i]);//不同音符对应不同时长,即节拍功能扩展思考题修改程序,演奏出一首完整的乐曲,比如:小星星。感谢您的观看Thanks
for
your
attention.
实例22
LED静态显示2位秒表《单片机基础与应用(C语言版)》高等教育出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创意设计师项目成果评估绩效考核表
- 2026辽宁沈阳航空产业集团有限公司及所属子企业校园招聘2人笔试备考试题及答案详解
- 道路巡视养护工安全知识宣贯考核试卷含答案
- 行李计划员安全培训效果评优考核试卷含答案
- 2026广东茂名市直属学校招聘教职员256人(编制校医2人)考试备考题库及答案详解
- 保安员岗前内部控制考核试卷含答案
- 2026年西安全路通号器材研究有限公司(西器公司)招聘笔试备考题库及答案详解
- 铝电解操作工诚信模拟考核试卷含答案
- 2026年中国地质调查局局属单位公开招聘80人(第三批)笔试模拟试题及答案详解
- 2026浙江嘉兴市海盐县国有资本投资有限公司招聘副总经理(职业经理人)1人笔试模拟试题及答案详解
- 2026年深度解析九州通法务专员面试技巧与答案
- TB 10811-2024 铁路基本建设工程设计概(预)算费用定额
- 支教面试课件内容
- 建筑行业人才需求调研及分析报告
- 光伏电站运行维护规程
- 中医健康减肥养生知识培训课件
- 2025至2030年中国笔记本无线网卡行业市场发展现状及投资战略咨询报告
- 大客户制管理办法
- 旅游直播培训课件
- 既有建筑幕墙检查及安全性鉴定技术标准
- 十岁那年的试题及答案
评论
0/150
提交评论