电子钟说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电子钟说明书
姓名:杨华碧
学号:1010401024
指导老师:赖友源
时间:2011年12月7日星期三
数字电子钟说明书
一、电子钟功能介绍
可调整运行的电子钟具有三种工作状态:“P.”状态、运行状态、调整状态。
(1)、“P.”状态,依靠上电或者复位键进入,在此状态下,按B 、C 、D 键均无效,按A 键有效,进入运行状态;
(2)、运行状态,按奇数次A 键进入,在此状态下,按B 、C 、D 键均无效,只有按A 键有效,按下A 键后,退出运行状态,进入调整状态;
(3)、调整状态,按偶数次A 键进入,在此状态下,按B 、C 、D 键均有效,如按下A 键,则推出调整状态,进入运行状态;B 、C 、D 分别为调时、分、秒,分别使之加1;调整后,按A 键退出调整状态。
二、实现时钟计时的基本方法
(1)计数初值计算:
把定时器设为工作方式1,定时时间为50ms ,则计数溢出20次即得时钟计时最小单位秒。
假设使用T/CO,方式1,50ms 定时,fosc=12MHz 。
则初值X 满足us us MHz X 5000012*12
1
*
)2(16=- H CB X 03110000001111001015536→→=
(2)采用中断方式进行溢出次数累计,计满20次为秒计时(1秒); (3)从秒到分和从分到时是通过累计加和数值比较实现。
三、电子钟的时间显示
电子钟的时钟时间在六位数码管上显示,因此,在内部RAM 中设置显示缓冲区共8个单元。
四、电子钟的启、停及时间调整
电子钟设置4个按键,通过程序控制来完成电子钟的启、停及时间调整。
A键控制电子钟的启、停;
B键调整时;
B键调整分;
B键调整秒。
五、电子钟电路仿真图:
六、电子钟元件清单:
七、电子钟程序流程框图
1、主程序流程图:
2、按键子程序流程图
3、中断服务子程序流程图
4、显示子程序流程图
八、电子钟程序清单
#include<reg52.h>
unsigned int start;
unsigned int count=0;
unsigned char fg;
unsigned char c[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char sec,min,hour;
sbit sec1=P2^7;
sbit sec2=P2^6;
sbit min1=P2^4;
sbit min2=P2^3;
sbit hour1=P2^1;
sbit hour2=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);
sec2=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;
}
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 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);
while(!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-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”。