基于c51的电子钟设计文档格式.docx
《基于c51的电子钟设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于c51的电子钟设计文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
该模块的功能实现是将s_hou、g_hou、s_min、g_min、s_sec和g_sec中的值译码为相应的8段数码管的位选,使8段数码管能正确显示出s_hou、g_hou、s_min、g_min、s_sec和g_sec中对应的时间数值。
并在不同时刻通过dig选中相应的数码管,使相应时间值能正确显示在8个数码管中相应的为上。
c、调时模块设计:
图4-3按键功能模块
当调时功能模块启动时随即将时间计时模块关闭。
在计时模块工作时,按下set键即可进入调时模式,此时计时停止,相应调整位实现0.5ms闪烁。
在该模块中按下add则相应调时位加1,按下sub则相应调时位减1。
再次按下set可进入下一位的时间调整,当累计按下6次set后即处于十位时调时状态下,再按下一次set便退出调时功能,重新返回计时功能。
3、总电路图
图4-4总电路图
上图为本次设计的总体电路图,展示了个器件的电气连接。
五、软件设计
1、总体设计
单片机上电后自动进入计时功能开始计时,并调用显示函数,实现计时在8个8段数码管上的显示,计时范围从00-00-00到23-59-59,当计时到23-59-59后自动返回00-00-00并重新开始计时。
在计时过程中不断检测按键,看是否有按键按下。
当在计时功能执行时set键被按下,则停止计时并启动调试功能,此时按下add和sub键可对当前调整值进行加1和减1操作。
在调试模式下累计按6次set后便退出调时功能,重新返回计时功能。
在计时功能下按下add和sub键不执行任何操作。
2、程序流程图:
T0中断函数
主函数流程图T1中断函数
3、部分程序代码:
#include"
reg51.h"
#defineucharunsignedchar
uchardatag_sec=0x00,s_sec=0x00,g_min=0x00,s_min=0x00,g_hous_hou=0x00;
=0x00,
uchardatadig=0x00,seg=0x00,time=0x00,count0=0x00,count2=0x00;
uchardatai=0x00,reg0=0x00,bar=0x40,value=0x00,sbitled_dat=P2^0;
sbitseg_sel=P2^1;
sbitpos_sel=P2^2;
sbitkey_in=P2^3;
sbitkey_out=P2^4;
sbitlcd_dat=P2^5;
sbitlcd_con=P2^6;
begin()
{
led_dat=0;
seg_sel=0;
pos_sel=0;
key_in=0;
key_out=0;
lcd_dat=0;
lcd_con=0;
TH0=0x3C;
TL0=0xB0;
TH1=0x3C;
TL1=0xB0;
TMOD=0x11;
ET0=1;
TR0=1;
ET1=0;
TR1=0;
EA=1;
}
delay(intx)
inty,z;
for(y=0;
y<
x;
y++)
for(z=0;
z<
120;
z++);
display()
for(i=0;
i<
9;
i=i+1)
switch(i)
case1:
dig=0xFE;
time=g_sec;
break;
case2:
dig=0xFD;
time=s_sec;
case3:
dig=0xFB;
time=0x40;
case4:
dig=0xF7;
time=g_min;
case5:
dig=0xEF;
time=s_min;
count1=0x00,key_dat=0x00;
case6:
dig=0xDF;
case7:
dig=0xBF;
time=g_hou;
case8:
dig=0x7F;
time=s_hou;
}
switch(time){case0:
seg=0x3F;
case1:
seg=0x06;
case2:
seg=0x5B;
case3:
seg=0x4F;
seg=0x66;
case5:
seg=0x6D;
case6:
seg=0x7D;
seg=0x07;
seg=0x7F;
case9:
seg=0x6F;
case0x40:
seg=0x40;
break;
pos_sel=1;
P0=dig;
pos_sel=0;
seg_sel=1;
P0=seg;
delay
(1);
pos_sel=1;
P0=0x00;
}}
voidtimer(void)interrupt1{ET0=0;
TR0=0;
TH0=0x3C;
TR0=1;
count1=count1+1;
if(count1==20){count1=0;
g_sec=g_sec+1;
if(g_sec>
9)
g_sec=0;
s_sec=s_sec+1;
if(s_sec>
5)
s_sec=0;
g_min=g_min+1;
if(g_min>
g_min=0;
s_min=s_min+1;
if(s_min>
s_min=0;
g_hou=g_hou+1;
if(g_hou>
g_hou=0;
s_hou=s_hou+1;
=4&
&
s_hou>
=2){
s_hou=0;
keyscan(){
EA=0;
seg_sel=0;
key_in=1;
P0=0xF7;
key_out=1;
key_dat=P0;
key_dat=key_dat&
0x0F;
if(key_dat==7)
delay(10);
count0=count0+1;
switch(count0)
ET0=0;
TR0=0;
ET1=1;
TR1=1;
value=g_sec;
reg0=g_sec;
g_sec=bar;
bar=reg0;
g_sec=value;
bar=0x40;
value=s_sec;
reg0=s_sec;
s_sec=bar;
s_sec=value;
value=g_min;
reg0=g_min;
g_min=bar;
case4:
g_min=value;
value=s_min;
reg0=s_min;
s_min=bar;
s_min=value;
value=g_hou;
reg0=g_hou;
g_hou=bar;
g_hou=value;
value=s_hou;
reg0=s_hou;
s_hou=bar;
case7:
ET1=0;
TR1=0;
s_hou=value;
reg0=0x00;
count0=0;
if(count0!
=0)
if(key_dat==0x0B)
s_sec=s_sec+1;
5){s_sec=0;
}value=s_sec;
g_min=g_min+1;
if(g_min>
9){g_min=0;
}value=g_min;
s_min=s_min+1;
if(s_min>
5){s_min=0;
}value=s_min;
g_hou=g_hou+1;
if(g_hou>
9){g_hou=0;
}value=g_hou;
s_hou=value;
s_hou=s_hou+1;
if(s_hou>
2){s_hou=0;
}value=s_hou;
elseif(key_dat==0x0D)
if(key_dat==0x0D)
s_sec=s_sec-1;
if(g_sec<
0){s_sec=5;
g_min=g_min-1;
if(g_min<
0){g_min=9;
s_min=s_min-1;
if(s_min<
0){s_min=5;
g_hou=g_hou-1;
if(g_hou<
0){g_hou=9;
s_hou=s_hou-1;
if(s_hou<
0){s_hou=2;
voidblinky()interrupt3
TH1=0x3C;
TR1=1;
ET1=1;
count2=count2+1;
if(count2==5)
count2=0;
reg0=g_sec;
reg0=s_sec;
reg0=g_min;
reg0=s_min;
reg0=g_hou;
reg0=s_hou;
main()
begin();
while
(1)
display();
keyscan();
六、试验箱上功能测试
图6-1试验箱上实现(未加按键)
七.问题分析
没加按键之前,数码管能正常显示,在加按键之后,数码管出现闪烁。
后来经过多次修改并在proteus上进行软件仿真,也没能解决该问题,希望在以后的学习中能够解决这个问题。
通过本次课程设计,对硬件设计流程有了更深的了解!