基于51的电子时钟设计.docx
- 文档编号:5178808
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:19
- 大小:588.23KB
基于51的电子时钟设计.docx
《基于51的电子时钟设计.docx》由会员分享,可在线阅读,更多相关《基于51的电子时钟设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于51的电子时钟设计
单片机电子时钟设计
设计报告
姓名:
高焕慧李艳苗
学号:
1342601513426041
专业:
电子信息工程
指导教师:
苏洪全
2016年5月31日
摘要:
基于51单片机的电子时钟的设计,从硬件和软件两个方面给出了具体实现过程。
该时钟的设计采用功能分块的思想方法,将硬件电路划分为开关电路,显示驱动电路和数码管电路等若干独立模块,而软件的实现则由闹钟
的声音程序、时间显示程序、日期显示程序,星期显示程序,秒表显示程序,时间调整程序、日期调整程序,闹钟调整程序、定时调整程序,延时程序等组成。
文中给出了各个模块的电路图,并用Proteus软件对电子时钟系统的各个功能进行了仿真,并给出了相应的仿真结果图像。
关键词:
电子时钟的设计
1 .设计要求
基于51单片机的电子时钟的设计
设计要求:
1具有年、月、日、星期、时、分、秒等功能;
2具备年、月、日、星期、时、分、秒校准功能;
3具有闹钟功能
4可使用protues
2 .硬件设计
2.1单片机开发板模块实物图
2.27段数码管原理图
2.33-8译码器数码管驱动电路
2.4单片机最小系统
2.程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineplayP0
sbitLSA=P2^0;
sbitLSB=P2^1;
sbitLSC=P2^2;
sbitled=P2^3;//闹钟检测
sbitk1=P2^7;//功能切换
sbitk2=P2^6;//设置加
sbitk3=P2^5;//设置减
sbitk4=P2^4;//设置位选
sbitbeet=P1^5;//蜂鸣器输出口
uchary;//按键松开
ucharkai;//闹钟开启标志
ucharshe;//设置标志
uchart;//时间计数
ucharnum;//功能切换
ucharfen;
ucharshi;
ucharxingqi;
ucharmiao;
ucharyue;
ucharnian;
ucharri;
ucharshijian[8];
ucharshi1;//闹铃时
ucharfen1;//闹铃分
unsignedcharcodeshuma[12]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//数码管显示数组0到9
0x7f,0x6f,0x40,0x00};
ucharbrunyue[12]={31,28,31,30,31,30,31,31,30,31,30,31};
ucharrunyue[12]={31,29,31,30,31,30,31,31,30,31,30,31};
voidzhongshe();
voidqishe();
voidnaoshe();
voidxingqishe();
voidshezhi();
voiddelay10ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
voidnaozhong()
{uinta,m;
if((shi1==shi)&&(fen1==fen)&&(kai%2))
{for(m=20;m>0;m--)
for(a=10;a>0;a--)
if((k1==0)||(k2==0)||(k3==0)||(k4==0))
{kai=0;break;}
else
beet=~beet;
}
}
voidplays()//输出显示
{
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
{
switch(i)//位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;break;//显示第0位
case
(1):
LSA=1;LSB=0;LSC=0;break;//显示第1位
case
(2):
LSA=0;LSB=1;LSC=0;break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0;break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1;break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1;break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1;break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1;break;//显示第7位
}
play=shuma[shijian[i]];
if(t>50)
{switch(she)
{
case(3):
if((i==0)||(i==1))
play=0x00;break;
case
(2):
if((i==3)||(i==4))
play=0x00;break;
case
(1):
if((i==6)||(i==7))
play=0x00;break;
}
}
j=10;//扫描间隔时间设定
while(j--);
play=0x00;//消隐
}
}
voidnao()//闹钟赋值
{shijian[7]=kai;
shijian[6]=11;
shijian[5]=11;
shijian[4]=fen1%10;
shijian[3]=fen1/10;
shijian[2]=10;
shijian[1]=shi1%10;
shijian[0]=shi1/10;
}
voidxingq()//xingqi赋值
{shijian[7]=xingqi&7;
shijian[6]=xingqi/10;
shijian[5]=11;
shijian[4]=11;
shijian[3]=11;
shijian[2]=11;
shijian[1]=11;
shijian[0]=11;
}
voidrili()//日期赋值
{shijian[7]=ri%10;
shijian[6]=ri/10;
shijian[5]=10;
shijian[4]=yue%10;
shijian[3]=yue/10;
shijian[2]=10;
shijian[1]=nian%10;
shijian[0]=nian/10;
}
voidzhong()//电子钟赋值
{shijian[7]=miao%10;
shijian[6]=miao/10;
shijian[5]=10;
shijian[4]=fen%10;
shijian[3]=fen/10;
shijian[2]=10;
shijian[1]=shi%10;
shijian[0]=shi/10;
}
voidInitTimer0(void)
{
TMOD=0x01;
TH0=0x0D8;
TL0=0x0F0;
EA=1;
ET0=1;
TR0=1;
}
voidshezhi()//功能设置函数
{if((she!
=0)&&((k2==0)||(k3==0)))
{delay10ms();
if((she!
=0)&&((k2==0)||(k3==0)))
{
switch(num)
{case(0):
zhongshe();break;
case
(1):
qishe();break;
case
(2):
naoshe();break;
case(3):
xingqishe();break;
}
}
}
}
voidmain()
{
num=0;kai=1;she=0;
fen1=1;shi1=0;
miao=0;fen=0;shi=0;
ri=29;yue=5;nian=16;
xingqi=7;
InitTimer0();
while
(1)
{
if(k1==0)
{delay10ms();
if(k1==0)
{num=(num+5)%4;
she=0;}
led=~led;
while(!
k1);}
if(k4==0)
{delay10ms();
if(k4==0)
she=(she+5)%4;
while(!
k4);
}
shezhi();
naozhong();
plays();
}
}
voidTimer0Interrupt(void)interrupt1
{
TH0=0x0D8;
TL0=0x0F0;
t++;
if(t==100)
{t=0;
miao++;
if(miao>59)
{miao=0;
fen++;
if(fen>59)
{
fen=0;
shi++;
if(shi>23)
{
shi=0;
ri++;
xingqi++;
if(nian%4==0)
{if(ri>runyue[yue-1])
{ri=1;
yue++;}
if(yue>12)
{yue=1;
nian++;}
}
else
{if(ri>brunyue[yue-1])
{
ri=0;
yue++;
}
if(yue>12)
{
yue=0;
nian++;
}
}
}
}
}
}
switch(num)
{
case(0):
zhong();break;
case
(1):
rili();break;
case
(2):
nao();break;
case(3):
xingq();break;
default:
zhong();
}
}
voidzhongshe()
{switch(she)
{
case
(1):
miao=0;InitTimer0();break;
case
(2):
if(k2==0)
fen=(fen+61)%60;
else
fen=(fen+59)%60;
break;
case(3):
if(k2==0)
shi=(shi+25)%24;
else
shi=(shi+23)%24;
break;
}
while((!
k2)||(!
k3));
}
voidnaoshe()
{switch(she)
{
case
(1):
if(kai==1)
kai=0;
elsekai=1;break;
case
(2):
if(k2==0)
fen1=(fen1+61)%60;
else
fen1=(fen1+59)%60;
break;
case(3):
if(k2==0)
shi1=(shi1+25)%24;
else
shi1=(shi1+23)%24;
break;
}
while((!
k2)||(!
k3));
}
voidqishe()
{switch(she)
{
case
(1):
if(k2==0)
{if(nian%4==0)
ri=(ri+runyue[yue-1]+2)%(runyue[yue-1]+1);
else
ri=(ri+brunyue[yue-1]+2)%(brunyue[yue-1]+1);
}
else
{if(nian%4==0)
ri=(ri+runyue[yue-1])%(runyue[yue-1]+1);
else
ri=(ri+brunyue[yue-1])%(brunyue[yue-1]+1);
}
break;
case
(2):
if(k2==0)
yue=(yue+14)%13;
else
yue=(yue+12)%13;
break;
case(3):
if(k2==0)
nian++;
else
nian--;
}
while((!
k2)||(!
k3));}
voidxingqishe()
{switch(she)
{
case
(1):
if(k2==0)
{if(xingqi>=7)
xingqi=1;
else
xingqi++;
}
else
if(k3==0)
{if(xingqi<=1)
xingqi=7;
else
xingqi--;
}
break;
}
while((!
k2)||(!
k3));
}
4. proteus软件仿真
年月日
闹钟
星期
5.调试及结果
5.1显示年月日为2016年5月29日
5.2显示为5月30日时为星期天
5.3校准年月日为2016年5月31日
5.4校准日期后对应为星期二
5.5设置闹钟为0时0分启动
时钟到0时0分后闹钟成功启动
6.心得体会
本次实验课题设计是用89C52RC单片机完成的电子时钟设计。
通过软件仿真和硬件调试我组已基本完成课题要求,功能上基本达标:
时钟的显示,日期显示,星期显示,闹钟设置,以及各项的调试校准功能。
这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我们在次课程设计中的最大收获。
参考文献
[1]李叶紫.王喜斌.胡辉.孙东辉.编著MCS_51单片机应用教程清华大学出版社.2008.6.
[2]陆剑.单片机应用技术指导书河南工业职业技术学院2005.12
[3]刘守义,王静霞。
《单片机应用技术》.西安电子科技大学出版社,2002.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 电子 时钟 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)