1TM成都理工大学工程技术学院电子信息工程系第5章以单片机为核心的智能型电子系统设计授课人:石坚(讲师)2TM2《电子系统设计》成都理工大学工程技术学院石坚1、AT89S5x单片机开发板应用3TM3《电子系统设计》成都理工大学工程技术学院石坚1、AT89S5x单片机开发板设计及应用(1)任务:点亮LED灯在Keil软件编辑窗口输入以下程序:#includeAT89x51.HsbitP3_0=P3^0;voidmain(void){while(1){P3_0=0;}}4TM4《电子系统设计》成都理工大学工程技术学院石坚Easy51Prov2.0软件的使用——硬件连接5TM5《电子系统设计》成都理工大学工程技术学院石坚Easy51Prov2.0软件的使用——软件操作6TM6《电子系统设计》成都理工大学工程技术学院石坚(2)AT89S51单片机最小系统介绍单片机要工作必须具备以下条件:(1)+5V电源;(2)起振电路;(3)复位电路;(4)一块正常的单片机。注意:另外P0口要加上拉电阻,才有足够的驱动能力驱动外围器件工作;EA接高电平,表示单片机使用的是片内FLASHROM。7TM7《电子系统设计》成都理工大学工程技术学院石坚(3)任务:闪烁灯#includeAT89X51.Hvoiddelay02s(void){unsignedchari,j,k;for(i=20;i0;i--)for(j=20;j0;j--)for(k=248;k0;k--);}voidmain(void){while(1){P3_0=0;delay02s();P3_0=1;delay02s();}}要求:前面例子是让LED灯亮,现在实现LED灯的闪烁。8TM8《电子系统设计》成都理工大学工程技术学院石坚(4)任务:流水灯要求:做广告灯的左移右移,八个发光二极管分别接在单片机的P3.0-P3.7接口上,输出“0”时,发光二极管亮,左移右移按D1→D2→D3→D4→┅→D8→D7→D6→┅→D1亮,重复循环。9TM9《电子系统设计》成都理工大学工程技术学院石坚(4)任务:流水灯程序:#includeAT89X52.Hunsignedchari;unsignedchartemp;voiddelay(void)//延时子程序{unsignedcharm,n,s;for(m=20;m0;m--)for(n=20;n0;n--)for(s=248;s0;s--);}voidmain(void)//主程序{while(1)//循环条件永远为真,以下程序一直执行下去。{10TM10《电子系统设计》成都理工大学工程技术学院石坚续前页:temp=0x7f;P3=temp;//直接对I/O口P3赋值,使P3.0输出低点平。delay();//延时for(i=1;i8;i++)//实现广告灯的从D1到D7移动{temp=(temp1)|0x80;P3=temp;delay();}temp=0xfe;P3=temp;delay();for(i=1;i8;i++)//实现广告灯的从D7到D1移动{temp=(temp1)|0x01;P3=temp;delay();}}}11TM11《电子系统设计》成都理工大学工程技术学院石坚思考:如何实现更为复杂的花样灯?参考程序:#includereg51.h#defineucharunsignedcharconstuchartab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//下移0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,//上移0xef,0xbd,0xdb,0xfe,//两边向中间移0xdb,0xbd,0xef,//中间向两边移0xaa,0x55,0xaa,0x55,0xaa,0x55,//1357,2468交替3次0xf0,0x0f,0xf0,0x0f,//1234,5678交替2次0x33,0xcc,0x33,0xcc,0x33,0xcc,//1256,3478交替3次0x00};//结束码uchart=0;////以下初始化子函数////voidsys_init(void){TMOD=0x01;TH0=0xd8;12TM12《电子系统设计》成都理工大学工程技术学院石坚续前页:TL0=0xef;ET0=1;EA=1;TR0=1;}////以下主函数////voidmain(void){uchari=0;P3=tab[i];i++;sys_init();while(1){while(t100);t=0;if(tab[i]==0x00){i=0;}P3=tab[i];i++;}}续左页:////以下定时器0中断函数////voidtimer0(void)interrupt1{TR0=0;TH0=0xd8;TL0=0xef;t++;TR0=1;}13TM13《电子系统设计》成都理工大学工程技术学院石坚(5)任务:按键识别要求:通过按下一次按键INT0,使小灯D1亮灭交替变换。实验原理:只要判断P3.2的电平就可以知道按键是否被按下;而在按键按下的过程中,由于机械抖动,将产生干扰,电平高低变化。可以采用软件滤波的方法去除这些干扰信号,在程序设计时,一旦发现P3.2为低电平,进入按键判断状态,软件延时10-20ms,从而避开了干扰信号区域,再重新检测P3.2状态,看按键是否真的已经按下。14TM14《电子系统设计》成都理工大学工程技术学院石坚参考程序:includeAT89X52.HsbitINT_0=P3^2;//定义按键的输入端sbitD1=P3^0;//D1小灯定义voiddelay10ms(void)//延时程序{unsignedchari,j;for(i=20;i0;i--)for(j=248;j0;j--);}key()//按键判断程序{if(INT_0==0)//判断是否按下键盘{delay10ms();//延时,软件去干扰if(INT_0==0)//确认按键按下{D1=!D1;//D1亮灭交替变化}while(INT_0==0);//按键锁定,每按一次D1只变化一次}15TM15《电子系统设计》成都理工大学工程技术学院石坚续前页:}main(){while(1)//永远循环,扫描判断按键是否按下{key();//对于此处CPU只按键判断一直扫描;}}课后请实践:1.用两个按键来控制D1的亮灭;2.使用一个按键,控制小灯亮的顺序D1→D2→D3→D4→┅→D8→D7→→┅D0亮重复循环;16TM16《电子系统设计》成都理工大学工程技术学院石坚(6)任务:数码管静态显示要求:用数码管LED的个位,静态显示数字“4”字样;注意:因采用共阴数码显示管,故此图P0口还应接1K或10K的排阻作为上拉电阻。17TM17《电子系统设计》成都理工大学工程技术学院石坚参考程序:#includeAT89X52.HsbitGE=P1^3;codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码main(){unsignedchardisplay_date=4;//定义并赋值要显示的数据while(1){P0=seg7code[display_date];//查表,输出GE=0;//P1^3为低电平,相当于把数码管的4H端接地}}课后请实践:1.让显示的数据动起来,比如做一个0到9的秒表(用软件延时);2.和按键判断程序结合,用按键控制数字变化;18TM18《电子系统设计》成都理工大学工程技术学院石坚(7)任务:数码管动态显示要求:用数码管LED的显示四位数据,比如显示数字“1234”;参考程序:#includeAT89X52.Hsbitqian=P1^0;sbitbai=P1^1;sbitshi=P1^2;sbitge=P1^3;codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码voidDelay(unsignedinttc)//延时程序{while(tc!=0)//如果tc为0则终止延时{unsignedinti;//局部正整数变量ifor(i=0;i100;i++);//执行400次将耗时1毫秒tc--;//tc计数减一}}19TM19《电子系统设计》成都理工大学工程技术学院石坚续前页:voidLed(intdate)//显示函数{qian=0;//P1.0输出低电平,选通千位数P0=seg7code[date/1000];//取出千位数,查表,输出。Delay(10);//延时qian=1;//销隐bai=0;//P1.1输出低电平,选通百位数P0=seg7code[date%1000/100];//取出百位数,查表,输出。Delay(10);//延时bai=1;//销隐shi=0;//P1.2输出低电平,选通十位数P0=seg7code[date%100/10];//取出十位数,查表,输出。Delay(10);//延时shi=1;//销隐ge=0;//P1.3输出低电平,选通十位数P0=seg7code[date%10];//取出个位数,查表,输出。Delay(10);ge=1;}20TM20《电子系统设计》成都理工大学工程技术学院石坚续前页:main(){intdisplay_date=1234;//定义并赋值要显示的数据while(1){Led(display_date);//调用显示函数显示数据display_date}}21TM21《电子系统设计》成都理工大学工程技术学院石坚上述数码管动态显示程序的另一种写法参考程序:#includeAT89X51.Hunsignedchardatebit[]={0xfe,0xfd,0xfb,0xf7};//存储数码管的位选值unsignedchartvdate[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};unsignedintdisdata;//定义要显示的数据unsignedchardisdat[4];//存储要显示的四位数据voiddelay(time){unsignedchari,j;for(j=0;jtime;j++)for(i=0;i250;i++);}display(void){unsignedchark;disdata=1234;//显示123422TM22《电子系统设计》成都理工大学工程技术学院石坚续前页:disdat[0]=disdat/1000;//取出千位disdat[1]=disdat%1000/100;//取出百位disdat[2]=disdat%100/10;//取出十位disdat[3]=disdat%10;//取出个位for(k=0;k4;k++)//显示四位数据{P0=tvdate[disdat[k]];//送出要显示数据的段码P1=datebit[k];//P2位选delay(10);//延时}}main(){while(1){display();}}这种写法比上一种复杂,占用空间要多一些.但是使用方便,可以在此基础上方便的加上比如显示小数点,指定某位数码管闪烁等。课后思考:如何用软件延时来做一个0到60秒的计数器吗?23TM23《电子系统设计》成都理工大学工程技术学院石坚(8)任务:4X4矩阵键盘识别要求:用AT89S51的并行口P2接4×4矩阵键盘,以P3.0-P3.3作输入线,以P3.4-P3.7作输出线;在每一个数码管上显示每个按键的“0-F”序号。[实验原理]每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘处理程序的任务是:确定有无键按下,判