利用一片20引脚单片机设计的极简电子钟电路Word文档下载推荐.docx
《利用一片20引脚单片机设计的极简电子钟电路Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《利用一片20引脚单片机设计的极简电子钟电路Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
按下min键对U3、U4的闹时分显示进行调整(每0.2秒递加1)。
4.闹时启/停设定:
通过模式设定键set选择为闹时启/停设定,按下min键U3的小数点点亮,闹时功能启动;
按下hour键U3的小数点熄灭,闹时功能关停。
由于电路设计得极其简单,因此丰富的功能只能由软件完成,这里软件设计成为了关键。
下面介绍软件设计要点。
图3为主程序状态流程。
运行时建立的主要状态标志如下:
flag-掉电标志。
掉电后,flag内为一随机数;
重新设定时间后flag内写入标志数55H.
set-工作模式设定标志。
hour-走时时单元。
min-走时分单元。
sec-走时秒单元。
dEDA-走时5mS计数单元
t_hour-闹时时单元。
t_min-闹时分单元。
d_05s-0.5秒位标志。
每秒钟的前0.5秒置1,后0.5秒置0,以使秒点闪烁。
o_f-闹时启/停位标志。
闹时启动置1,闹时关停置0.
另外将定时器T0设定为5mS的定时中断。
这里晶振频率为12MHz,因此5mS的初值为-5000,但实际上程序还要作其它运算,使得时间偏长,经调整为-4800后试验刚好。
计时单元deda每次中断均加1.走时函数判断deda》=200时即令秒单元sec加1.同理秒单元sec满60后令分单元min加1.分单元min满60后令时单元hour加1.时单元hour满24后清0.
上电后,首先进行初始化,对各状态标志、输入输出口及定时器T0进行初始化工作,以适应后面程序的要求。
随后程序判断有无set键按下,如按下,则set键值从0起加1.set键值只能从0加到3,然后又回到0.
接下来,根据键值进行散转。
若set=0,运行走时程序;
若set=1,进入调整闹时时间程序;
若set=2,进入调整走时时间程序;
若set=3,显示已调好的闹时时间,同时进入启/停闹时程序。
散转完后,进行判断掉电标志flag是否等于55H.若不等,说明刚开机上电或运行过程中掉过电,这时四个数码管以1Hz的频率闪烁四个8字,提示时间不准;
若相等,说明未掉电,RAM区内容未变化,时间准确。
再下来程序又转回到初始化之后进行循环运行。
由于使用了四只数码管密集排列,因此只能采用双面印刷板设计,图4、5分别为正面(元件面)、反面的印板图。
尺寸3000milx4000mil(7.62cmx10.16cm)。
图6为计算机输出的三维仿真印制板。
元件选用为了走时准确,晶振X最好选用温漂小的。
四个数码管U1~U4可选用发绿光的,这样光泽较柔和。
蜂鸣器Bz要购买绕线型的电动式蜂鸣器(市场上有一种加电压即工作的蜂鸣器这里不适用),因驱动信号为脉冲信号。
其它元件一般无特殊要求。
使用方法上电后,四个LED数码管闪烁四个8字。
按一下set键,闪烁现象消失(此时set=1),U1的小数点亮,说明此刻可以调整闹时时间。
按下hour键,U1、U2作加法;
按下min键,U3、U4作加法。
这些调整好的数据被同时送入RAM区的闹时记忆时单元t_hour和闹时记忆分单元t_min.
再按一下set键,set=2,U2的小数点亮,此刻可以调整走时时间。
这些调整好的数据也被同步送入RAM区的时记忆单元hour和分记忆单元min.
再按一下set键,set=3,显示刚才调整的闹时时间,此刻可以选择启动/关停闹时。
按下min键,o_f位标志置1,U3的小数点亮,闹时启动;
按下hour键,o_f位标志置0,U3的小数点灭,闹时关闭。
若再按一下set键,set=0,电路进入走时状态,U1、U2显示小时,U3、U4显示分。
U2的小数点作秒点闪烁。
在闹时启动的情况下,走时到达设定闹时,则蜂鸣器Bz鸣响一分钟进行提醒。
附:
用C51编写的源程序清单(已由实验板运行通过)
#include/*包含器件配置文件*/
#defineucharunsignedchar
#defineuintunsignedint
charDATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};
/*0~9的数码管段码*/
ucharhour=0,min=0,sec=0;
/*时、分、秒单元清零*/
uchardeda=0;
/*5mS计数单元清零*/
uchart_hour=0,t_min=0;
/*闹时时、分单元清零*/
bitd_05s=0;
/*0.5秒标志*/
bito_f=0;
/*闹时启/停标志*/
ucharset=0;
/*模式设定标志*/
ucharm=0;
ucharflag=0;
/*RAM掉电标志*/
voiddelay(uintk);
/*延时子函数*/
voidconv();
/*走时单元转换*/
voidp_out();
/*判别闹时到否子函数*/
voiddirve();
/*走时时间输出驱动子函数*/
voidt_dirve();
/*闹时时间输出驱动子函数*/
/*闹时启/停子函数*/
voidTIme1_of()
{ucharm;
if(P3_7==0)delay
(1);
if(P3_7==0)o_f=1;
for(m=0;
m《30;
m++)
{
t_dirve();
P1=DATA_7SEG[t_min/10];
P3=0xfd;
delay
(1);
if(P3_1==0){if(o_f==1)P1_7=0;
}elseP1_7=1;
}
if(P3_5==0)delay
(1);
if(P3_5==0)o_f=0;
elseP1_7=1;
/*走时函数*/
voidTIme()
conv();
dirve();
p_out();
/*定时器T05mS初始化*/
voidinit_TImer()
TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;
/*扫描按键子函数*/
voidsCAN_key()
if(P3_4==0)set++;
if(set》=4)set=0;
if(set==1)flag=0x55;
F0:
if(P3_4==0)gotoF0;
/*按键未释放,在此等候*/
/*延时子函数*/
voiddelay(uintk)
uinti,j;
for(i=0;
i
for(j=0;
j《121;
j++)
{;
}}
/*5mS定时中断服务子函数*/
voidzd(void)interrupt1
deda++;
/*调整走时时间*/
voidTIme_adj()
if(P3_5==0)hour++;
if(hour==24)hour=0;
if(P3_2==0)P1_7=0;
if(P3_7==0)min++;
if(min==60)min=0;
/*调整闹时时间*/
voidtime1_adj()
if(P3_5==0)t_hour++;
if(t_hour==24)t_hour=0;
if(P3_7==0)t_min++;
if(t_min==60)t_min=0;
/*时、分、秒单元及走时单元转换*/
voidconv()
if(deda《=100)d_05s=0;
elsed_05s=1;
if(deda》=200){sec++;
deda=0;
if(sec==60){min++;
sec=0;
if(min==60){hour++;
min=0;
if(hour==24){hour=0;
/*走时时间输出驱动子函数*/
voiddirve()
P1=DATA_7SEG[hour/10];
P3=0xf7;
P1=DATA_7SEG[hour%10];
P3=0xfb;
if(d_05s==1){if(P3_2==0)P1_7=0;
P1=DATA_7SEG[min/10];
if(o_f==1){if(P3_1==0)P1_7=0;
P1=DATA_7SEG[min%10];
P3=0xfe;
/*闹时时间输出驱动子函数*/
voidt_dirve()
P1=DATA_7SEG[t_hour/10];
if(P3_3==0)P1_7=0;
P1=DATA_7SEG[t_hour%10];
P3=0xf