数字钟万年历设计.docx
- 文档编号:9672096
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:26
- 大小:78.79KB
数字钟万年历设计.docx
《数字钟万年历设计.docx》由会员分享,可在线阅读,更多相关《数字钟万年历设计.docx(26页珍藏版)》请在冰豆网上搜索。
数字钟万年历设计
数字钟/电子万年历电路及程序设计
学校:
四川交通职业技术学院
系别:
自动化工程系
专业:
交通安全与智能控制
班级:
2012级2班
姓名:
陈云阳、冯佳里
学号:
、
目录
一、设计要求-2-
二、系统方案选择-3-
三、硬件电路设计-4-
四、系统软件设计-5-
五、系统调试与运行-6-
附一:
-7-
一、设计要求
(1)电路启动时,自动计时,由6位LED显示器显示时、分、秒;
(2)具备校准功能,可以设置当前时间;
(3)具备定时启闹功能,可以设置启闹时间,启闹10秒后自动关闭闹铃。
(4)能选择数字钟的计时制式,即可以选择为12小时制或24小时制;
(5)具备电子万年历功能,由6位LED显示年、月、日;
(6)能自由切换数字钟和电子万年历两种功能;
(7)可以设置当前日期。
二、系统方案选择
(1)单片机选型:
选用MCS-51系列主流芯片AT89S52,内部带有8KB的FlashROM,无须外扩程序存储器。
(2)计时方案:
软件控制。
利用AT89S52内部定时器进行中断定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本。
(3)显示方案:
由于时、分、秒的显示用6位LED数码管,为节省硬件成本,我们采用动态扫描显示方式。
该方案硬件电路相对简单,但编程较复杂。
(4)按键控制方式:
由于该电路涉及到7个按键的使用,故我们采用4*3矩阵式键盘,多余的按键可作为功能扩展键。
(其中#0-#6键分别为时钟修改键、闹钟修改键、加1修改键、日期显示键—按第二次返回、日期修改键、减1修改键、时制修改键)
三、硬件电路设计
系统硬件电路如图一所示,单片机的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
#include
#include
//******************************************************************编译预处理
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
{
display(dis_p);
a=keytest();
if(a!
=0x70)
{
a=search();
switch(a)
{
case0x00:
ftion0();break;
case0x01:
ftion1();break;
case0x02:
cum();break;
case0x06:
jinzhi();break;
case0x03:
riqi();break;
case0x04:
ftion3();break;
case0x05:
minus();break;
default:
break;
}
}
}
}
}
//********************************************主函数【完】
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];
for(m=0;m<200;m++);
P3=0x2f;
j=buffer[4];
P2=led[j];
for(m=0;m<200;m++);
}
if(min==1||rmin==1||mon==1)
{
P3=0x3b;
i=buffer[2];
P2=led[i];
for(m=0;m<200;m++);
P3=0x37;
j=buffer[3];
P2=led[j];
for(m=0;m<200;m++);
}
if(hour==1||rhour==1||year==1)
{
P3=0x3e;
i=buffer[0];
P2=led[i];
for(m=0;m<200;m++);
P3=0x3d;
j=buffer[1];
P2=led[j];
for(m=0;m<200;m++);
}
}
}
//**********************************LED显示函数【完】
unsignedcharkeytest()
{
unsignedcharc;
P0=0x70;//检测是否有键按下
c=P0;
c=c&0x70;
return(c);
}
//******************************************键盘检测函数【完】
unsignedcharsearch()
{
unsignedchara,b,c,d,e;
c=0xfe;//H1输入低电平
a=0;//行号
while
(1)
{
P0=c;
d=P0;
d=d&0x70;//屏蔽无关位H1-H3
if(d==0x60){b=0;break;}//列号
elseif(d==0x50){b=1;break;}
elseif(d==0x30){b=2;break;}
a++;//行号+1
c<<=1;
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;
dis_p=clockbuf;
rtimdata=0;
timdata++;
switch(timdata)
{
case0x01:
sec=1;break;
case0x02:
sec=0;min=1;break;
case0x03:
min=0;hour=1;break;
case0x04:
timdata=0;hour=0;TR0=1;break;
default:
break;
}
}
//*********************************************时钟设置函数【完】
voidftion1()
{
sec=0;
min=0;
hour=0;
dis_p=bellbuf;
timdata=0;
rtimdata++;
switch(rtimdata)
{
case0x01:
rmin=1;break;
case0x02:
rmin=0;rhour=1;break;
case0x03:
rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;
default:
break;
}
}
//*********************************************闹钟设置函数【完】
voidftion3()
{
day=0;
mon=0;
year=0;
dis_p=date;
timdata=0;
rtimdata=0;
dtimdata++;
switch(dtimdata)
{
case0x01:
day=1;break;
case0x02:
day=0;mon=1;break;
case0x03:
mon=0;year=1;break;
case0x04:
dtimdata=0;year=0;dis_p=clockbuf;break;
default:
break;
}
}
//*************************************************日期修改函数【完】
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;
elseclockbuf[0]--;
}
}
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;
elsebellbuf[0]--;
}
}
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(sec==1)
{
if(59==clockbuf[2])clockbuf[2]=0;
elseclockbuf[2]++;
}
elseif(min==1)
{
if(59==clockbuf[1])clockbuf[1]=0;
elseclockbuf[1]++;
}
elseif(hour==1)
{
if(or==0)//判断进制
{
if(23==clockbuf[0])clockbuf[0]=0;
elseclockbuf[0]++;
}
if(or==1)
{
if(12==clockbuf[0])clockbuf[0]=1;
elseclockbuf[0]++;
}
}
elseif(rmin==1)
{
if(bellbuf[1]==59)bellbuf[1]=0;
elsebellbuf[1]++;
}
elseif(rhour==1)
{
if(or==0)
{
if(bellbuf[0]==23)bellbuf[0]=0;
elsebellbuf[0]++;
}
if(or==1)
{
if(bellbuf[0]==12)bellbuf[0]=1;
elsebellbuf[0]++;
}
}
elseif(day==1)
{
if(date[2]==31)date[2]=1;
elsedate[2]++;
}
elseif(mon==1)
{
if(date[1]==12)date[1]=1;
elsedate[1]++;
}
elseif(year==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
else
{
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))
{
if(date[2]!
=29)date[2]++;
else
{
date[2]=1;
if(date[1]!
=11)date[1]++;
else
{
date[1]=1;
date[0]++;
}
}
}
if(date[1]==2)
{
if((((date[0]%4==0)&&(date[0]%100!
=0))||(date[0]%400==0)))
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 万年历 设计