1、 由电路图可知,LED灯左侧阳极与电阻相连接高电平,右侧阴极与P1相连。因此:当P1为低电平(即P1=0)时,电路连通,LED灯亮,当P1为高电平时(即P1=1)时,电路不通,LED灯不亮。所以,可以通过控制P1的值控制LED灯的亮与不亮。而因为八个LED灯与P1口上八个引脚相连,因此可以控制每个接口的值控制每个LED灯的亮灭。比如当P1=0x04时,第五个灯不亮。2、蜂鸣器的控制 由电路图可知,蜂鸣器一侧与三极管相连,另一侧与高电平相连,而三极管与电阻相连后接P2_1口。因此当P2_1=1时,蜂鸣器响;当P2_1=0时,蜂鸣器不响。3、键盘的控制 (1) 由电路图可知,P3_2到P3_5这四
2、个引脚分别与四个开关相连,开关与地相连,所以当开关闭合时,P3_2=0,当开关断开时,P3_2=1,所以可以根据查看P3_2等值的0或1来判断开关是否闭合。 (2) 要达到通过键盘控制数码管显示数字的目的,可以将P3_2为0时,表示要修改数字,而用P3_3到P3_5为0时分别对应时分秒等进行数值的加1。 (3) 由电路图可知,开关S1闭合时,电路断开。4、 电子钟的显示(1) 电子钟上数字的显示原理 由电路图可知, P2_7到P2_2这六个引脚分别与六个数码管相连,中间有一10k的电阻,还有一三极管,通过三极管的特性可知,当P2_7等接高电平时,电路连通,数码管亮,既可以显示数字。同样可以看到
3、,P0口的八个引脚都与六个数码管相连,控制数码管中八个的亮灭,以达到显示09这10个数字的目的。(2)电子钟的上显示的数字之间的联系 1、六个数码管每两个一组,分别显示时,分,秒。判断当显示秒的数字,达到59时,将显示数字变为00,显示分钟的数字加1;当显示分钟的数字,达到59时,将显示的数字变为00,显示小时的数字加1;当显示小时的数字,达到23时,将显示的数字变为00。 2、六个数码管分为三组,前两个显示月份,后两位显示日期,中间两位作为分隔符号。5、中断函数模块 这个程序运用了两个中断函数,分别为定时器0和定时器1的中断,定时器0是用来计时,定时器1是用来动态扫描,这样使得电子钟的性能更
4、稳定。6、实验电路图总电路图:数码管: 二极管:蜂鸣器:按键:单片机:7.系统的元器件清单表2.1 系统元器件表器件型号数量单片机12C5A60S21个按键普通5个三极管8个开关6脚双路排阻A103J,A427J,A102J1个,1个,二极管灯电容10F2个 数码管 CPS056AR6个电阻若干下载接口4针接口蜂鸣器压电式单排针三、主要功能模块流程图:main函数流程图四、拓展功能: (1) LED灯的花样设计:可根据自己的喜好设计出各种各样的LED灯 (2) 利用数码管实现日期的显示:显示月份与日期,根据月份判断每月天数五、参考文献: 新编单片机原理及应用、c语言程序设计、51单片机C语言教
5、程、51实验指导、数据结构、算法设计与分析六、源程序及系统文件使用说明:#include #define uchar unsigned char uchar num=0xbd,0x90,0xa7,0xb6,0x9a,0x3e,0x3f,0xb0,0xbf,0xbe; /09uchar hour=12,min=0,second=0,flag,time1,month=12,day=1; /给各个数附初值uchar set_hour=12,set_min=1,set_switch=1,key1_time,function;uchar bell=0x17,0x13,0x2b; /显示开与关,ON,OF
6、 uchar temp;unsigned char led10=0x00,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xaa;sbit key1=P32;sbit key2=P33;sbit key3=P34;sbit key4=P35;sbit bell_ring=P21;int i;#define uint unsigned int uint count=0;void timer() interrupt 1 using 0 /秒表控制函数 TH0 = (65536 - 50000)/256; TL0 = (65536 - 50000)%256; tim
7、e1 +;void delay(uchar i) /延迟函数 uchar j,k; for(j=0;ji;j+) for(k=0;k125;k+);void Beep() /钟表滴答声控制函数 P2_1=0; delay(1); P2_1=1; void time() / 时间进行函数 if(time1=20) time1=0; for(i=0;i=30) month+; day=1; else if(month=4)|(month=6)|(month=9)|(month=11)&(day=31) else if(day=32) if(month=13) month=1;void set_ti
8、me() /调节时间函数 P3=0xff; if(key2=0) /调节小时 delay(200); if(key2=1) if(hour=25) hour=0; if(key3=0) /调节分钟 if(key3=1) if(min=60) min=0; if(key4=0) /调节秒 if(key4=1) if(second=60) second=0;void set_date() /调节日期 if(key2=0) / 调节月份 month+; if(month=13) month=1; if(key3=0) /调节日份 if(month=2& day=1; else if(month=4)
9、|(month=6)|(month=9)|(month=11)& else if(dayvoid show_bell() /显示设置的闹铃时间 P2=0x04; /显示ON,OF if(set_switch%2=0) P0=bell2; /OF delay(6); else P0=bell1; /ON P2=0x08; P0=bell0; delay(6); P2=0x10; P0=numset_min%10; P2=0x20; P0=numset_min/10; P2=0x40; P0=numset_hour%10; P2=0x80; P0=numset_hour/10;void set_b
10、ell() /设置闹铃函数 / P3=0xff; if(key2=0) delay(200); if(key2=1) set_hour+; if(set_hour=24) set_hour=0; if(key3=0) if(key3=1) set_min+; if(set_min=60) set_min=0; if(key4=0) if(key4=1) set_switch+;void show_time() /显示时间 P2=0x04; P0=numsecond%10; P0=numsecond/10; P0=nummin%10; P0=nummin/10; P0=numhour%10; P
11、0=numhour/10;void show_date() /日期显示 P0=numday%10; P0=numday/10; P0=0x02; /显示数码管为- P0=nummonth%10; P0=nummonth/10;void walk_up_bell() /响铃设置 if(min=set_min)&(hour=set_hour) temp=1; else temp=0; if(temp=1)&(set_switch%2=1)&(second=5) for(i=0;2; Beep(); else bell_ring=0; void key_board() / 功能选择 P3=0xff;
12、 if(key1=0) if(key1=1) key1_time+; function=key1_time%4; switch(function) case 0 : show_time();break; case 1 :set_time(); case 2 : show_date();set_date(); case 3 : show_bell();set_bell();void main() TMOD = 0x01; EA=1; ET0=1; TR0=1; while(1) key_board(); time(); date(); walk_up_bell();七、总结在组装单片机硬件设备时要细心,要有耐心,在实验时要注意安全。在编译软件时,程序刚开始没有什么头绪,通过各种资料的搜集后发现调用各种函数来实现比较容易,整个过程中出现了很多小问题,各个函数的调用比较混乱。通过一系列的梳理后慢慢清晰,发现比较的容易。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1