资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
电子时钟设计及程序电子时钟设计简介该设计主要由单片机 AT89C51 和液晶显示器组成,实现常用的实时电子钟 功能。 利用可编程芯片 AT89C51 强大的功能,我们了实现日历功能、时钟功能。 该时钟使用液 晶显示器作为显示模块,使用 3 个弹性小按键作为输入模块,调 节年、月、日、星期、 时、分、秒。一. 方案比较与论证根据设计要求,该时钟系统可分输入部分、处理部分和显示数据部分。其中 输入部 分是键盘输入数据调整要显示的内容,处理部分单片机接收并通过算法 处理键盘输入的 信息变成显示模块所能接受的信息,显示部分是用来实时显示 处理部分处理后的数据。处理 显示输入模块我们选用三个独立弹性小按键来实现,选用矩阵式键盘则太浪费资 处理模块我们选用了 STC 公司的 STC89C52 芯片来,与 Atmel 公司生产的 AT89S52 一样,也是40 脚双列直插式封装,这里芯片对刚学单片机的人来说容 易入 手,其功能也很强大,用来实现一个电子钟完全足够了。显示部分我们可有两种选择:数码管和 1602 液晶显示器。实现一个电子钟 若用数码管则需6 个,所占空间相对大了些,而且我们还要实现日历的功能, 需要更多 的数码管,所点空间翻倍,而且还会造成单片机 I/O 引脚滥用甚至不 够用,用液晶显示器来实现则方便得多,界面也相对友好,但液晶显示器有个 缺点就是 价格比较贵。因此我们最终选择了 1602 液晶显示器。另处独立弹性小 按键具有价格便宜、容易获得、容易控制等特点。二. 系统理论分析、计算与电路仿真1 、定时器与中断原理电子钟主要是利用单片机的定时器/计数器和中断来实现。定时器实际是加 1 计数 器,单片机每运行一个机器周期定时器就自动加1,当计到所定的数N时,单片机就产生 一次中断,停下所做的工作,转而去执行中断服务程序。单片机2、proteus仿真结果LCD1-2VI2-OT-0S SAI 12ISSISI a.saiiBi Ti 7 心匸 * I & I* I#j* - Ji *rvWAI*r-m.7HunFPITiBPM rrFiPM Mf liflWPl 1i*FTIL 二卫 nHpjJjwiiS .7冲口 FTD :RlillVZ I .If 鼻旳轴导J|卜|I* | W I . $比记仔利J: r1H i-i. .ih: MJk=-iiii每个机器周期等于外部晶振的12个振荡周期,当外部晶振是12MHz时,则每个 机器周 期的时间是T= 12 X 1/12=1 um (2-1 )cy定数器设为N时,即每计到N时产生一次中断,而一次中断的时间为:t = N X T u m(2-2)cy当产生X (x根据N来设置,两者之积为1000000)次中断后我就知道过了 Is,再通过 液晶显示出来,这样就达到了让液晶每隔一秒跳一下的目的了。3、液晶部分液晶1、2端口分别是工作电源的负、正极,15、16是液晶背光灯电源正负极,R4 起限流作用,避免电流过大烧坏背光灯。第3端口还可接一电位器,调节液晶显示对比 度。无标号的8个端口是数据端,通过一上拉电阻接到单片机的系统的软件设计(如必要,含有流程图)1、程序流程图rt、 1丿期、年、月、日中的任一个扫描键盘是否门往液晶送、分、时、星图5-1主程序流程图图5-2扫描键盘的子程序流程厶士四. 系统测试及结果测试结果总的来说很满意,比预计的还要好。但由于中断函数中代码较长,故存 在一定程度的误差,用秒表测试大约为每5分钟慢了一秒,这个问题是用单片机定时 器来数时所无法解决的,中断函数必定会较长,处理这一函数会花费一定的时间这就无 法做到让时钟走得很精确。解决方法是用一时钟芯片来实现,由于时钟芯片不好买又比 较贵(新的20几块一片),暂时就不考虑了,有机会再尝试。1.源程序主函数放在最后面#in elude #defi ne uchar un sig ned char#define uint unsigned intsbit rs=P2人4;定义液晶数据命令选择端sbit Icden二P2 八 5;/液晶使能端sbit s1=P2a0;/ 按键 1sbit s2=P2A1; / 按键 2sbit s3=P2A2;/ 按键 3uchar count,s1num;char shi,fen,miao; /时、分、秒char year,month,day,week;/ 年月 日星期void delay(uint x)/ 延时子程序uint j,k;for(j=x;j0;j-)for(k=110;k0;k-); /-液晶写命令功能 -void write_com(uchar com) rs=0;lcden=0;P0=com;delay(5); lcden=1;delay(5); lcden=0;/- 液晶写数据功能void write_date(uchar date)rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;/ 写入时、分、秒 ?void write_sfm(uchar add,uchar date) uchar shi,ge; shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi); write_date(0x30+ge);/ 写入年、月、日 void write_nyr(uchar add,uchar date) uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);/ 写入星期 X void write_week(uchar we)write_com(0x80+12);switch(we)case 1: write_date(M);delay(5); write_date(O);delay(5); write_date(N); break;case 2: write_date(T);delay(5); write_date(U);delay(5); write_date(E);break;case 3: write_date(W);delay(5); write_date(E);delay(5); write_date(D);break;case 4: write_date(T);delay(5); write_date(H);delay(5); write_date(U); break;case 5: write_date(F);delay(5); write_date(R);delay(5); write_date(I);break;case 6: write_date(S);delay(5);write_date(A);delay(5); write_date(T);break;case 7: write_date(S);delay(5);write_date(U);delay(5); write_date(N);break;/- 实现初始化功能 -void init()lcden=0;shi=1;fen=1;miao=1;day=1;month=1;year=1;week=1;write_com(0x38);write_com(0x06);write_com(0x80+1);count=0; s1num=0;write_com(0x0c);write_com(0x01);write_date(2);write_com(0x80+2);write_date(0);write_com(0x80+5);write_date(-);write_com(0x80+8); write_date(-);write_nyr(9,day);write_nyr(6,month); write_nyr(3,year);write_week(week);write_com(0x80+0x40+6); write_date(:);write_com(0x80+0x40+9); write_date(:);write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;/ 键盘扫描功能void keyscan()if(s仁二0)/键盘1是否被按下delay(5);/如果检测到键盘被按下,延时约if(s1=0)/5毫秒看是否为键下,这样可越过按/ 键盘时的抖动时间,防止误判s1num+;while(!s1);if(s1num=1)TR0=0; write_com(0x80+0x40+10);write_com(0x0f);if(s1num=2) write_com(0x80+0x40+7);if(s1num=3)write_com(0x80+0x40+4);if(s1num=4)write_com(0x80+12); if(s1num=5) w r i t e com(0x80+9) if(s1num=6)wcom(0x80+6) if(s1num=7)writom(0x80+3) if(s1num=8) s1num=0; write_com(0x0c); TR0=1;if(s1num!=0)/ 键盘 2 是否被按下if(s2=0)delay(5);if(s2=0)while(!s2);if(s1num=1)miao=0;miao+; if(miao=60) write_sfm(10,miao); write_com(0x80+0x40+10);if(s1num=2)fen+;if(fen=60)fen=0; write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号