1、 数字电子钟说明书 姓名:杨华碧 学号:1010401024 指导老师:赖友源 时间:2011年12月7日星期三 数字电子钟说明书 一、电子钟功能介绍 可调整运行的电子钟具有三种工作状态:“P.”状态、运行状态、调整状态。 (1)、“P.”状态,依靠上电或者复位键进入,在此状态下,按B、C、D键均无效,按A键有效,进入运行状态; (2)、运行状态,按奇数次A键进入,在此状态下,按B、C、D键均无效,只有按A键有效,按下A键后,退出运行状态,进入调整状态; (3)、调整状态,按偶数次A键进入,在此状态下,按
2、B、C、D键均有效,如按下A键,则推出调整状态,进入运行状态;B、C、D分别为调时、分、秒,分别使之加1;调整后,按A键退出调整状态。 二、实现时钟计时的基本方法 (1)计数初值计算: 把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒。 假设使用T/CO,方式1,50ms定时,fosc=12MHz。 则初值X满足 (2)采用中断方式进行溢出次数累计,计满20次为秒计时(1秒); (3)从秒到分和从分到时是通过累计加和数值比较实现。 三、电子钟的时间显示 电子钟的时钟时间在六位数码管上显示,因此,在内部RAM中设置显示缓冲区共8个单元。
3、LED8 LED7 LED6 LED5 LED4 LED3 LED2 LED1 37H 36H 35H 34H 33H 32H 31H 30H 时十位 时个位 分隔 分十位 分个位 分隔 秒十位 秒个位 四、电子钟的启、停及时间调整 电子钟设置4个按键,通过程序控制来完成电子钟的启、停及时间调整。 A键控制电子钟的启、停; B键调整时; B键调整分; B键调整秒。 五、电子钟电路仿真图: 六、电子钟元件清单: 元件名称 规格型号 数量(个) 单片机 AT89C52 1 显示驱动芯片
4、 74LS245 2 8位一体的共阳LED 显示器 7SEG-MPX8-CA-BLUE 1 晶振 12MHz 1 无极电容 1nF 2 有极电容 1n 1 按键 BUTTON 5 电阻 1K 1 电阻 10K 4 限流电阻 10K 8 排阻 RESPACK-8 1 万能板 小 1 七、电子钟程序流程框图 1、主程序流程图: 开始 系统初始化 p.显示 A键按下否 进入自动计时状态 检测到A键按下 进入时间设置状态 检测到A键按下 N Y Y Y
5、N N 2、按键子程序流程图 开始 有按键闭合 调显示子程序延时,去抖动 有键闭合 有键释放 保存键值 结束 Y Y Y N N N 调用显示子程序 3、中断服务子程序流程图 开始 重装初值 计数是否满20 计数清零,秒加1 满60秒? 秒清零,分加1 满60分? 分清零,时加1 满24小时? 时清零 结束 N N N N Y Y Y Y 4、显示子程序流程图 开始 查表取断码 送断码到P0口 送位码到P2口 延时1毫秒 8位LED显示完否 结束 Y N
6、
八、电子钟程序清单
#include
7、ur2=P2^0; sbit a=P2^5; sbit b=P2^2; sbit key_A=P1^0; sbit key_B=P1^1; sbit key_C=P1^2; sbit key_D=P1^3; void delay(unsigned int t) { for(t;t>0;t--); } void display() { P2=0xff; P0= c[sec%10]; sec1=0; delay(15); sec1=1; P0=c[sec/10]; sec2=0; delay(15); se
8、c2=1; P0=c[min%10]; min1=0; delay(15); min1=1; P0=c[min/10]; min2=0; delay(15); min2=1; P0=c[hour%10]; hour1=0; delay(15); hour1=1; P0=c[hour/10]; hour2=0; delay(15); hour2=1; P0=0x40; a=0; delay(10); a=1; P0=0x40; b=0; delay(10); b=1;
9、} void Intl() { unsigned char ts; P0=0xf3; P2=0xfe; for(ts=0;ts<12;ts++) delay(9999); sec=0,min=0,hour=0; } void keyA() { if(key_A==0) {display(); delay(30); if(key_A==1) { if(TR0==1)TR0=0; else TR0=1; } } } void
10、keyB() { if(key_B==0) {display(); if(key_B==1) sec++; } } void keyC() { if(key_C==0) {display(); if(key_C==1) min++; } } void keyD() { if(key_D==0) {display(); if(key_D==1) hour++; } } main() { P1=0xff; Intl(); while(key_A); wh
11、ile(!key_A); TMOD=0x01;//定时器0工作方式1// EA=1; //开CPU中断// ET0=1; //开定时器0中断// TR0=1; //启动定时器// while(1) {display(); keyA(); while(!TR0) {display(); keyA(); keyB(); keyC(); keyD(); } } } void tim0() interrupt 1 { TH0=(65536
12、49993)/256; TL0=(65536-49993)%256; count++; if(count>=20) {count=0; sec++; if(sec>=60) {sec=0; min++; if(min>=60) {min=0; hour++; if(hour>=24) {hour=0;} } } } } 九、程序不足与分析 1不足:有时差产生; 原因:在执行中断服务时,需要一定的时间,其长度难以测量准确。 2、不足:按键不够灵敏; 原因:在检测按键的同时,需要同时显示实时时间。 十、设计体会: 一个项目,要把它完成,很简单;但是,你如果要把它完善,那就难多了。如果再加点其他功能,那更是难上加难了。不过,很有意思! 附录:调试时的图片: 1、调整时间状态: 2、启动状态: 3、计时状态 4、显示“P”






