公选课——《单片机基础及应用》设计实例1、用1个LED发光二极管,设计一个循环闪烁的指示灯。2、用8个LED发光二极管,设计一个循环闪烁的流水灯。3、通过设置中断,改变灯的循环方向,控制灯的亮灭。4、通过定时,精确控制P1.0闪烁500ms。5、以秒为单位,用LED数码管显示当前计数值。1、用1个LED发光二极管,设计一个循环闪烁的指示灯。如何设计硬件和软件?1.1硬件设计注意:在接下来的仿真中,省略时钟及复位电路。1.2软件设计1)初始化51头文件、宏定义2)主程序,即main()程序灯的亮灭控制3)延时功能延时子程序设计#includeat89X52.h#defineuintunsignedint#defineucharunsignedcharvoidmain(void){while(1){P1_0=0;delay(5000);P1_0=1;delay(5000);}}voiddelay(uintt)//延时0.1*t毫秒{uinti;do{for(i=0;i10;i++);}while(t--);}voiddelay(uintt);//声明函数2、用8个LED发光二极管,设计一个循环闪烁的流水灯。2.1硬件设计2.2软件设计1)初始化51头文件、宏定义2)主程序,即main()程序灯的循环闪亮控制3)延时功能延时子程序设计如何进行灯的循环闪亮控制?intrins.h内部函数库(包含变量循环移位、位操作等函数)需要将该函数包含进来,同时对函数原型进行声明。#includeINTRINS.Huchar_crol_(uchara,ucharn);/*函数原型,左循环*/uchar_cror_(uchara,ucharn);/*函数原型,右循环*/#includeINTRINS.Huchar_crol_(uchara,ucharn);/*函数原型*/uchar_cror_(uchara,ucharn);/*函数原型,右循环*/voidmain(void){uinta=0xfe;while(1){P1=a;delay(5000);a=_crol_(a,1);}}3、通过设置中断,改变灯的循环方向,控制灯的亮灭。3.1硬件设计1)中断的概念中断技术是计算机中一项很重要的技术。中断系统的功能是为了解决快速CPU和慢速外设间的矛盾,它由软件和硬件组成。有了中断系统,能使计算机的功能更强、效率更高、使用更灵活。51单片机系统有5个中断源。2)日常中断的例子你正在专心看书,突然电话铃响,于是你记下正在看的书的页数,去接电话,接完电话后再回来接着看书。3)计算机中的中断概念中断是指由于某种随机事件(甲方)的发生,计算机(乙方)暂停现行程序的运行,转去执行另一程序,以处理发生的事件,处理完毕后又自动返回原来的程序继续运行。将能引起中断的事件称为中断源。CPU现行运行的程序称为主程序。处理随机事件的程序称为中断服务子程序。4)相关的特殊功能寄存器TCONTF1TR1TF0TR0IE1IT1IE0IT0IE0/IE1:外部中断申请标志位:=0:没有外部中断申请;=1:有外部中断申请。IT0/IT1:外部中断请求的触发方式选择位:=0:在INT0/INT1端申请中断的信号低电平有效;=1:在INT0/INT1端申请中断的信号负跳变有效.EA—ET2ESET1EX1ET0EX0IEEX0/EX1位:分别是INT0/INT1的中断允许控制位:=0时禁止中断;=1时允许中断。EA:总的中断允许控制位(总开关):=0时禁止全部中断;=1时允许中断。3.2软件设计1)初始化51头文件、宏定义2)主程序,即main()程序灯的循环闪亮控制中断初始化3)延时功能4)中断服务程序设计3.2软件设计中断初始化触发方式设置中断允许控制中断服务程序设计中断初始化IT0=1;EA=1;EX0=1;中断服务程序函数名()interruptn[usingm]{}Voidint0(void)interrupt0/*外部中断0的服务函数定义,使用第二组工作寄存器组*/voidint0(void)interrupt0{uchara=0xfe,i=16;P1=0x0;delay(5000);P1=0x0ff;delay(5000);P1=0x0;delay(5000);P1=0x0ff;delay(5000);do{P1=a;delay(5000);a=_cror_(a,1);}while(i--);}4、通过定时,精确控制闪烁500ms。针对任务一进行操作。使用定时器T01)设置定时器工作方式2)计算初始值3)编写初始化程序4)编写中断服务程序1)设置定时器工作方式GATEC/TM1M0GATEC/TM1M0TMOD000000012)计算初始值晶振12Mhz1个机器周期:61Tp=1211210s35010500001定时50ms,需要计数:定时器初始值:655365000015536030xCB定时500ms,需要中断10次。3)编写初始化程序TMOD=0X01;TH0=0X3C;TL0=0XB0;EA=1;ET0=1;TR0=1;4)编写中断服务程序Voidtimer0(void)interrupt1{TH0=0x3c;TL0=0xb0;i++;if(i==9){i=0;P1_0=~P1_0;}}5、以秒为单位,用LED数码管显示当前计数值。LED数码管显示电路原理LED数码管的结构:(1)共阳(2)共阴@共阳数码管每个段笔画是用低电平(“0”)点亮,共阴数码管段笔画是用高电平(“1”)点亮公共阳极hgfedcbaabcdgefh公共阴极hgfedcbaabcdgefhhgf……ahgf……a高电平点亮低电平点亮接高电平接地要显示某个字形,就应使此字形的相应断码的二极管点亮,实际就是送一个用不同电平组合代表的数据字(显示码)来控制LED的显示,此数据称为字符的段码或字形码。共阴极和共阳极LED显示器段码不同。共阳LED数码管:公共端(字位)接高电平,笔划(字段)置为低电平就被点亮了☞比如要显示“0”须令abcdef为“0”电平,gh为“1”电平。共阳极hgfedcbaabcdgefhhgfedcba累加器A110000000C0H=“0”管脚识别小技巧:用万用表测一下就可以了。数码管分为共阴极和共阳极。以共阴极为例:先用万用表的正极(对于数字万用表为红色表笔)放在某一个管脚,另外一个负极依次去测量其他管脚。若没有一个管脚亮,说明正极接的是公共端(COM)。若亮,根据发光位置就可以判断引脚了,正极接的是相应的段码端(a,b,c,……,dp),负极为对应数码管的公共端(C1,C2)。4位一体共阴极LED数码管管脚分布如图所示:5.1硬件设计如果每个LED上要显示的数字不同,那么它在同一时刻是不能同时显示的。用这种数码管都是动态显示的。(可以到网上去看下动态显示)比如4个LED上要显示1234(假设是共阴极连接)4个LED上显示1234(假设共阴极连接)过程如下:首先选种第一个LED(即上面C1='0',C2='1',C3='1',C4='1')送LED要显示的数据(abcdefg=“0110000”),如果要显示小数点dp='1'再延时一段时间(注意不能过长,不然看到的连续显示的现象了,下面一样)再选择第二个LED(即上面C1='1',C2='0',C3='1',C4='1')送LED要显示的数据(abcdefg=1101101)如果要显示小数点dp='1'再延时一段时间接下来是第三、第四个LED也一样。5.2软件设计1)定时中断服务程序定时50ms,中断20次为1秒每中断20次,计数1次。2)显示程序将显示数值分为:个位、十位、百位、千位,分别查表显示。初始化:ucharcodea[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码组合,共阴极ucharm=0;//计数循环变量uintn=0;//计数值定时中断服务程序voidtimer0(void)interrupt1{TH0=0x3C;TL0=0xB0;m++;if(m==19){m=0;n++;P1_0=~P1_0;}}显示程序voiddisplay(void){P2=0xf7,P0=a[n%10];delay(20);P2=0xfb,P0=a[n%100/10];delay(20);P2=0xfd,P0=a[n/100%10];delay(20);P2=0xfe,P0=a[n/1000];delay(20);}