电子时钟说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及系统课程设计
评语:
考勤10分守纪10分过程30分设计报告30分答辩20分总成绩100分
专业:电气工程及自动化
班级:电气1101
姓名:卢永春
学号:201109154
指导教师:李军丽
兰州交通大学自动化与电气工程学院
2014 年 1 月 13 日
基于单片机数字电子时钟设计
1.引言
数码电子时钟的电路由显示电路、复位电路、校时电路等构成,以AT89C51作为主控芯片,使用12MHz 的晶振,用八位七段共阳数码管显示输出信息。
可通过键盘对其进行调整。
系统具有以下功能:时、分、秒时间显示;复位;时、分、秒时间调整。
2.设计方案及原理
2.1设计方案简述
本次设计时钟电路,使用了AT89C51单片机芯片控制电路,并用软件实现数字时钟。
原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。
本设计采用动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速。
按钮1实现时钟复位,按钮2实现调整时、分、秒的模式选择,按钮3实现时、分、秒的加1调整,按钮4实现时、分、秒的减1调整。
2.2设计原理框图
总体硬件设计原理框图如图1所示。
复位电路
校时电路
晶振电路LED 显示
AT89C51
图1 总体硬件设计原理框图
3.硬件设计
本设计利用单片机内部的定时器/计数器来实现电子钟的正常走时功能,以单片机AT89C51、LED数码管为核心,辅以必要的电路,具体由复位电路、键盘电路、时钟电路、显示电路等构成了一个单片机电子时钟。
复位电路采用按键复位方式,键盘电路采用独立式键盘,时钟电路用12MHz的晶振。
利用七段共阳极数码管,通常接高电平,低电平有效,要构成八位LED显示时,除了需要段选线外,还需要位选线,以确定段选码对应的显示位。
它的计时周期为24小时,显示满刻度为23小时59分59秒,另外具有用按键实现复位,校时功能等特点。
如按钮1实现时钟复位,按钮2实现调整时、分、秒的模式选择,按钮3实现时、分、秒的加1调整,按钮4实现时、分、秒的减1调整。
此电路由1个AT89C51单片机,1个7个电阻的排阻,1个12MHz的晶振,1个八位七段共阳数码管,4个按钮开关,2个10pF电容,1个10μF电容等组成。
其在Proteus软件上仿真电路图如图2所示。
图2 Proteus软件仿真电路图
4.软件设计
利用AT89C51单片机的可编程定时/计数器、中断系统来实现时钟计数。
(1) 计数初值计算。
使用定时器T0,以工作方式1进行1ms的定时,fosc=12MHz,则
TH0=FCH TL0=18H
(2) 采用定时方式进行次数累计,计满1000次即得到秒计时。
(3) 从秒到分和从分到时的计时是通过累加和数值比较实现。
主程序流程图如图3所示。
开始
初始化
启动定时器T0分加1
秒到60
分到60
时加1
时到24
显示
有功能键按键
进入功能程序
结束否
是否
否
是
是是
图3 主程序流程图
5.系统仿真及实际调试
仿真结果图4所示。
图4 数字电子时钟仿真截屏图
6.总结
这次课设最大的收获是学会使用Keil uVision4和Proteus软件。
使用Keil uVision4时,由于上学期一直是生成.asm文件,思维定式把C语言编写的程序也那样子生成了,结果无法创建,仔细检查后发现应该是.c文件。
初次使用Proteus 感到很新奇,但在真正绘制电路图时才发现自己平时积累太少,根本无法找到所需要电子元气件,在网上搜到电子元器件的中英文对照表后才得以顺利进行。
原本以为这样子就可以实现仿真了,结果装入后秒针出现异常走法,经检查是定时初值设置错了。
自己所交文档初稿出现的很多错误,还好在老师的细心检查下得以改正,设计思路等遇到的问题也是在老师帮助下解决的,谢谢我的指导老师。
自己动手确实比书本教学收获更大。
参考文献
[1]王思明.单片机原理及应用系统设计[M].科学出版社,2012.
[2]王毓银.数字电路逻辑设计[M].高等教育出版社,2004.
附录
源程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code segcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar buffer[]={0,0,0,0,0,0,0,0};
uint hour,min,sec;
uint status;
void delayMS(uint t) ;
void keyprocess(unsigned char key);
void display();
void timer0();
main()
{
bit keyrelease;
uchar buf;
uchar keyinput;
keyrelease=1;
buf=0xff;
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
TR0=1;
IE=0x82;
status=0;
while(1)
{
keyinput=P1&0xf0;
if(keyinput!=0xf0)
{
delayMS(10);
if(keyinput!=0xf0)
{
buf=keyinput;
P1=0xff;
while(P1!=0xff)
P1=0xff;
keyprocess(buf);
buf=0xff;
}
display();
}
}
void delayMS(uint t)
{
uint i;
while(t--)
for(i=0;i<125;i++);
}
void keyprocess(unsigned char key) {
switch (key)
{
case 0xe0:status++;
if (status>=4) status = 0;
break;
case 0xd0:switch(status)
{
case 0x01:if(hour<23) hour++;
else hour=0; break;
case 0x02:if(min<59) min++;
else min=0;
break;
case 0x03:if(sec<59) sec++;
else sec=0;
break;
}
break;
case 0xb0:switch(status)
{
case 0x01:if(hour>0) hour--;
else hour=23;
break;
case 0x02:if(min>0) min--;
else min=59;
break;
case 0x03:if(sec>0) sec--;
else sec=59;
break;
}
default:break;
}
}
void display()
{
uchar i;
{
buffer[0]=hour/10;
buffer[1]=hour%10;
buffer[2]=10;
buffer[3]=min/10;
buffer[4]=min%10;
buffer[5]=10;
buffer[6]=sec/10;
buffer[7]=sec%10;
for(i=0;i<8;i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS(1);
P2=0x0;
}
}
}
void timer0() interrupt 1 using 2 {
static uint count;
TH0=0xFC;
TL0=0x18;
TR0=1;
count++;
if(count>=1000)
{
count=0;
sec++;
if(sec>= 60)
{
sec=0; min++;
if(min>= 60)
{
min=0; hour++;
if(hour>= 24)
{
hour=0;
}
}
}
}
}。