数字钟万年历设计Word文件下载.docx
- 文档编号:22856254
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:26
- 大小:78.79KB
数字钟万年历设计Word文件下载.docx
《数字钟万年历设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字钟万年历设计Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
系统硬件电路如图一所示,单片机的P2口作为数码管段选口,P3口作为位选口。
由于采用共阴极数码管,因此P3口输出低电平选中相应的位,P2口输出高电平则点亮相应的段。
单片机的P0口为按键输入口,由于其内部无上拉电阻,所以在外部必须接上拉电阻。
单片机的P1.0接蜂鸣器,P1.5-P1.7和RST接ISP下载座。
图一数字钟/电子万年历硬件设计电路
四、系统软件设计
明确设计要求,完成方案设计和硬件电路制作后,进入系统软件设计阶段,我们采用子等向下、逐步细化的模块化设计方法。
(1)模块划分:
A.主函数:
完成系统初始化,包括时钟、闹钟、时制、日期初始参数及初始标志的设定,I/O端口、定时器初始状态的设定;
更新显示时间,循环扫描按键,根据按键执行相应子程序。
B.LED显示函数:
根据显示单元首地址显示,实现6位LED的动态显示功能。
同时,当出现修改标志位时,只显示当前修改位置。
C.键盘检测函数和查键值函数:
这两个函数都属于键盘扫描模块,前者判断是否右键按下,后者检测按键值并返回。
D.时钟、闹钟、日期、时制设置函数:
根据按键设置相应的标志位。
E.闹钟判断启动函数:
判断闹钟启动时间到否,若时间到,则启动闹钟,延时10S后自动关闭闹钟,同时清除闹钟标志位。
F.加1、减1修改函数:
根据按键对相应的修改标志位加1或减1。
G.定时器中断函数:
定时修改时间参数中断服务子程序。
五、系统调试与运行
系统调试包括硬件调试与软件调试两部分,硬件调试一般需要利用调试软件来进行,软件调试也需要通过对硬件的测试和控制来进行,软、硬件调试是不可能绝对分开的。
(1)硬件调试:
硬件调试的主要任务是排除硬件故障,其中包括设计错误和工艺性故障。
使用万用表,按照电路原理图,检查印制电路板,检查元器件是否焊接出错;
同时通过一些简单的测试软件来查看接口电路工作是否正常。
(2)软件调试:
利用开发工具进行仿真调试,发现和纠正程序错误。
(3)脱机运行:
软硬件调试成功后,可将程序固化到AT89S52的Flash存储器中,接上电源脱机运行。
数字钟/电子万年历程序
#pragmaSMALL
#include<
reg51.h>
absacc.h>
intrins.h>
//******************************************************************编译预处理
voiddisplay(unsignedchar*p);
//显示函数,P为显示数据首地址
unsignedcharkeytest();
//按键检测函数
unsignedcharsearch();
//按键识别函数
voidalarm();
//闹钟判断启动函数
voidftion0();
//始终修改函数
voidftion1();
//闹钟修改函数
voidftion3();
//日期修改函数
voidcum();
//加1修改函数
voidminus();
//减1修改函数
voidjinzhi();
//进制修改函数
voidriqi();
//****************************************************************函数声明
sbitP1_0=P1^0;
//****************************************************************端口定义
unsignedcharclockbuf[3]={0,0,0};
unsignedcharbellbuf[3]={0,0,0};
unsignedchardate[3]={1,1,1};
//日期存放数组
unsignedcharmsec1,msec2;
unsignedchartimdata,rtimdata,dtimdata;
unsignedcharcount;
unsignedchar*dis_p;
unsignedcharor;
//12进制控制标志
unsignedcharri;
//日期显示控制标志位
bitarm,rtim,rhour,rmin,hour,min,sec,day,mon,year;
//定义位变量
//**************************************************************全局变量定义
voidmain()
{
unsignedchara;
or=0;
//12进制修改标志清零
ri=0;
P1_0=0;
arm=0;
msec1=0;
msec2=0;
timdata=0;
rtimdata=0;
count=0;
TMOD=0x02;
TL0=0x06;
TH0=0x06;
EA=1;
ET0=1;
TR0=1;
dis_p=clockbuf;
while
(1)
{
a=keytest();
if(a==0x70)//判断是否有键按下
{
display(dis_p);
if(arm==1)alarm();
}
else
a=keytest();
if(a!
=0x70)
{
a=search();
switch(a)
{
case0x00:
ftion0();
break;
case0x01:
ftion1();
case0x02:
cum();
case0x06:
jinzhi();
case0x03:
riqi();
case0x04:
ftion3();
case0x05:
minus();
default:
}
}
}
}
//********************************************主函数【完】
voiddisplay(unsignedchar*p)
unsignedcharbuffer[]={0,0,0,0,0,0};
unsignedchark,i,j,m,temp;
unsignedcharled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
buffer[0]=p[0]/10;
buffer[1]=p[0]%10;
buffer[2]=p[1]/10;
buffer[3]=p[1]%10;
buffer[4]=p[2]/10;
buffer[5]=p[2]%10;
if((sec==0)&
&
(min==0)&
(hour==0)&
(rmin==0)&
(rhour==0)&
(day==0)&
(mon==0)&
(year==0))//没有修改标志,正常显示
for(k=0;
k<
3;
k++)
{
temp=0x01;
for(i=0;
i<
6;
i++)
P2=0x00;
//段选端口
j=buffer[i];
P2=led[j];
P3=~temp;
//位选端口
temp<
<
=1;
for(m=0;
m<
200;
m++);
else//若有修改标志,则按以下标志分别显示
if(sec==1||day==1)
P3=0x1f;
i=buffer[5];
P2=led[i];
P3=0x2f;
j=buffer[4];
if(min==1||rmin==1||mon==1)
P3=0x3b;
i=buffer[2];
P2=led[i];
for(m=0;
P3=0x37;
j=buffer[3];
P2=led[j];
if(hour==1||rhour==1||year==1)
P3=0x3e;
i=buffer[0];
P3=0x3d;
j=buffer[1];
//**********************************LED显示函数【完】
unsignedcharkeytest()
unsignedcharc;
P0=0x70;
//检测是否有键按下
c=P0;
c=c&
0x70;
return(c);
//******************************************键盘检测函数【完】
unsignedcharsearch()
unsignedchara,b,c,d,e;
c=0xfe;
//H1输入低电平
a=0;
//行号
P0=c;
d=P0;
d=d&
//屏蔽无关位H1-H3
if(d==0x60){b=0;
}//列号
elseif(d==0x50){b=1;
elseif(d==0x30){b=2;
a++;
//行号+1
c<
if(a==4){a=0;
c=0xfe;
}//控制移位到H4
e=a*3+b;
do{display(dis_p);
while((d=keytest())!
=0x70);
//松键检测
return(e);
//***********************************************查键值函数【完】
voidalarm()
if((clockbuf[0]==bellbuf[0])&
(clockbuf[1]==bellbuf[1]))
P1_0=1;
rtim=1;
if(count==10)
count=0;
P1_0=0;
arm=0;
rtim=0;
//****************************************闹钟判断启动函数【完】
voidftion0()
TR0=0;
rhour=0;
rmin=0;
timdata++;
switch(timdata)
case0x01:
sec=1;
case0x02:
sec=0;
min=1;
case0x03:
min=0;
hour=1;
case0x04:
timdata=0;
hour=0;
TR0=1;
default:
//*********************************************时钟设置函数【完】
voidftion1()
sec=0;
min=0;
hour=0;
dis_p=bellbuf;
rtimdata++;
switch(rtimdata)
rmin=1;
rmin=0;
rhour=1;
rtimdata=0;
rhour=0;
arm=1;
dis_p=clockbuf;
//*********************************************闹钟设置函数【完】
voidftion3()
day=0;
mon=0;
year=0;
dis_p=date;
dtimdata++;
switch(dtimdata)
day=1;
day=0;
mon=1;
mon=0;
year=1;
dtimdata=0;
year=0;
//*************************************************日期修改函数【完】
voidminus()
if(sec==1)
if(0==clockbuf[2])clockbuf[2]=59;
elseclockbuf[2]--;
elseif(min==1)
if(0==clockbuf[1])clockbuf[1]=59;
elseclockbuf[1]--;
elseif(hour==1)
if(or==0)//判断进制
if(0==clockbuf[0])clockbuf[0]=23;
elseclockbuf[0]--;
if(or==1)
if(1==clockbuf[0])clockbuf[0]=12;
elseif(rmin==1)
if(bellbuf[1]==0)bellbuf[1]=59;
elsebellbuf[1]--;
elseif(rhour==1)
if(or==0)
if(bellbuf[0]==0)bellbuf[0]=23;
elsebellbuf[0]--;
if(or==1)
if(bellbuf[0]==1)bellbuf[0]=12;
elseif(day==1)
if(date[2]==1)date[2]=31;
elsedate[2]--;
elseif(mon==1)
if(date[1]==1)date[1]=12;
elsedate[1]--;
elseif(year==1)
if(date[0]==1)date[0]=99;
elsedate[0]--;
//*************************************减1修改功能函数【完】
voidcum()
if(59==clockbuf[2])clockbuf[2]=0;
elseclockbuf[2]++;
if(59==clockbuf[1])clockbuf[1]=0;
elseclockbuf[1]++;
if(23==clockbuf[0])clockbuf[0]=0;
elseclockbuf[0]++;
if(12==clockbuf[0])clockbuf[0]=1;
if(bellbuf[1]==59)bellbuf[1]=0;
elsebellbuf[1]++;
if(bellbuf[0]==23)bellbuf[0]=0;
elsebellbuf[0]++;
if(bellbuf[0]==12)bellbuf[0]=1;
if(date[2]==31)date[2]=1;
elsedate[2]++;
if(date[1]==12)date[1]=1;
elsedate[1]++;
if(date[0]==99)date[0]=1;
elsedate[0]++;
//*************************************加1修改功能函数【完】
voidjinzhi()
if(or==0)or=1;
elseor=0;
//***********************************进制修改控制函数【完】
voidriqi()
{
if(ri==0)
dis_p=date;
if(ri==1)
dis_p=clockbuf;
ri++;
if(ri==2)ri=0;
//********************************日期控显示函数【完】
voidclock()interrupt1
EA=0;
if(msec1!
=0x14)msec1++;
//6MHz晶振定时10ms
else
msec1=0;
if(msec2!
=100)msec2++;
//定时1s
if(rtim==1)count++;
//闹钟启动标志计时10s
msec2=0;
if(clockbuf[2]!
=59)clockbuf[2]++;
else
clockbuf[2]=0;
if(clockbuf[1]!
=59)clockbuf[1]++;
else
clockbuf[1]=0;
if(or==0)
{
if(clockbuf[0]!
=23)clockbuf[0]++;
else
{
clockbuf[0]=0;
if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12))
{
if(date[2]!
=30)date[2]++;
else
{
date[2]=1;
if(date[1]!
=11)date[1]++;
else
{
date[1]=1;
date[0]++;
}
}
}
if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11))
=29)date[2]++;
if(date[1]==2)
if((((date[0]%4==0)&
(date[0]%100!
=0))||(date[0]%400==0)))
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 万年历 设计