单片机电子时钟设计报告.docx
《单片机电子时钟设计报告.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
单片机电子时钟设计报告
电子时钟课程设计报告
设计课题:
单片机电子时钟设计
专业班级:
电子信息工程2011级2班
学生姓名:
蔡伟王一都
学号:
20110342009
20110342033
指导教师:
张文
设计时间:
2014年5月16日
一、设计题目及要求(根据题目填写)
1、设计题目
利用数字集成电路设计一数字电子钟。
2、设计要求
(1)基本要求
①制作数字时钟系统;
②可以控制时钟电路,P1.0选择时、分、秒,P1.1对时、分、秒进行自加;
③灯的亮灭显示控制端,P3.7口黄灯亮表示控制时,P3.3口红灯亮表示控制分,红灯、黄灯一起亮表示控制秒。
(2)发挥部分
①时间精度为0.5秒。
指导老师签名:
2014年月日
二、指导老师评语
指导老师签名:
2014年月日
三、成绩
理论(60%):
分,作品(40%):
分,总分:
分
验收盖章
2014年月日
目录
第一部分设计任务和要求4
1、设计题目4
2、设计要求4
第二部分设计方案4
1、总原理框图4
2、设计方案的选择5
第三部分主要器件及简介5
1、STC89C51单片机介绍6
2、SR410361K数码管7
第四部分电路原理8
1、硬件部分8
2、原件清单9
3、软件部分10
第五部分课程设计总结14
第六部分参考文献14
附录实物图14
单片机电子时钟设计
第一部分设计任务和要求
1、设计题目
利用单片机定时器制作数字时钟并可以实现时钟的控制。
2、设计要求
(1)基本要求
①制作数字时钟系统;
②可以控制时钟电路,P1.0选择时、分、秒,P1.1对时、分、秒进行自加;
③灯的亮灭显示控制端,P3.7口黄灯亮表示控制时,P3.3口红灯亮表示控制分,红灯、黄灯一起亮表示控制秒。
(2)发挥部分
①时间精度为0.5秒。
第二部分设计方案
本次设计数字钟,使用了ATC8951单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易。
1、总原理框图
总原理框图如下图所示:
2、设计方案的选择
1.计时方案
方案1:
采用实时时钟芯片
现在市场上有很多实时时钟集成电路,如DS1287、DS12887、DS1302等。
这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需要程序干预。
因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。
方案2:
使用单片机内部的可编程定时器。
利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,但程序设计较为复杂。
2.显示方案
对于实时时钟而言,显示显然是另一个重要的环节。
通常LED显示有两种方式:
动态显示和静态显示。
静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。
但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。
需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。
当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。
LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
本系统需要采用两个4位8段数码管来分别显示时、分、秒及分隔符号,因数码管个数较多,故本系统选择动态显示方式。
第三部分主要器件及简介
1、STC89C51单片机介绍
STC89S52单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计数器[5]。
STC89C51单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。
这些部件通过内部总线联接起来,构成一个完整的微型计算机。
VCC:
电源。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
2、SR410361K数码管
本次设计采用的SR410361K数码管是4位8段共阳数码管,其引脚图如下:
第四部分电路原理
1、硬件部分
(1)最小系统:
复位时单片机的初始化操作,只要给RST引脚加上两个机器周期以上的高电平信号,就可以使STC89C51单片机复位。
本次采用的是12M晶振,按钮复位电路。
(2)数码管显示电路:
P0口驱动数码管位选,P2口驱动数码管段选。
(3)键盘输入电路:
本次设计采用独立键盘,键盘按下时,相应的I/O口电平由高变低,一次检测按键是否被按下。
4个独立按键与单片机P1.0—P1.3口相连。
(4)LED灯电路:
LED灯作为加减时间控制指示灯,一共2个。
P3.7口黄灯亮表示控制时,P3.3口红灯亮表示控制分,红灯、黄灯一起亮表示控制秒。
整体电路原理图如下:
2、原件清单
PartTypeDesignatorFootprint
0.1uC6RAD0.2
10KR2AXIAL0.3
10kR5AXIAL0.3
10kR6AXIAL0.3
10kR9AXIAL0.3
10kR12AXIAL0.3
10kR7AXIAL0.3
10kR8AXIAL0.3
10kR4AXIAL0.3
10kR3AXIAL0.3
10uC4RB.1/.2
10uC5rb.1/.2
12MY1SRY
30pC7sip2
30pC8sip2
470R15AXIAL0.3
470R20AXIAL0.3
470R13AXIAL0.3
470R22AXIAL0.3
470R21AXIAL0.3
470R14AXIAL0.3
470R17AXIAL0.3
470R16AXIAL0.3
470R19AXIAL0.3
470R18AXIAL0.3
8550Q8S8050
8550Q3S8050
8550Q2S8050
8550Q1S8050
8550Q4S8050
8550Q7S8050
8550Q6S8050
8550Q5S8050
AT89S52U2dip40
CON2J2sip2
ISPISP2IDC10
LED-REDD3LED_1
LED-YELLOWD4LED_1
SR10302M3dip12
SR10302M4dip12
SW-PBS4SKEY
SW-PBS10SKEY
SW-PBS7SKEY
SW-PBS5SKEY
SW-PBS6SKEY
3、软件部分
根据本次课程设计的要求,软件设计可分为以下几个功能模块:
(1)主程序模块:
主程序主要用于系统初始化:
设置定时器的工作方式和计数初值等参数。
(2)计时模块,即定时器0中断子程序:
系统使用12MHz的晶振,假设定时器0工作在方式1,则定时器的最大定时时间为65.536ms,这个值远远小于1s。
因此本系统采用定时器与软件循环相结合的定时方法。
设定时器0工作在方式1,每隔50ms溢出中断一次,则循环中断20次延时时间是1s。
因定时器0工作在方式1,则50ms定时对应的定时器初值为:
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
(3)时间、日期设置模块:
该模块由键盘输入相应的数据来设置当前时间。
程序通过调用一个键盘设置子程序通过键盘扫描将键入的数值送到单片机中,在主函数中检测输入时间值的合法性,若键盘输入的时间、日期不合法,则初始值置为0,设置时间后,时钟要从这个时间开始计时。
(4)显示模块:
动态显示时分秒,以及中间的分割符。
编写具体程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitp10=P1^0;
sbitp11=P1^1;
sbitp12=P1^2;
sbitp13=P1^3;
sbitp34=P3^4;
sbitp37=P3^7;
ucharcodetable[]=
{0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//0~9字段
uintcount,shi,fen,miao,
s1=0,s2=0,f1=0,f2=0,
m1=0,m2=0,temp,flag=0;
voiddelay(uintz)
{
uintx,y;
for(x=88;x>0;x--)
for(y=z;y>0;y--);
}
voidinit()
{
TMOD=0x01;//选着定时器0
TH0=(65536-50000)/256;//给定时器赋初值定时50毫秒
TL0=(65536-50000)%256;
EA=1;//开启总中断
ET0=1;//开启定时器中断
TR0=1;//开始定时
}
voiddisplay(uints,uintf,uintm)//显示子程序
{
s1=s/10;//对时分秒取模
s2=s%10;
f1=f/10;
f2=f%10;
m1=m/10;
m2=m%10;
P2=0xff;
P0=0x01;
P2=table[s1];
delay
(1);
P2=0xff;
P0=0x02;
P2=table[s2];
delay
(1);
P2=0xff;
P0=0x08;
P2=table[f1];
delay
(1);
P2=0xff;
P0=0x10;
P2=table[f2];
delay
(1);
P2=0xff;
P0=0x40;
P2=table[m1];
delay
(1);
P2=0xff;
P0=0x80;
P2=table[m2];
delay
(1);
}
voidkey()
{
if(p10==0)//对时分秒进行选择
{
delay
(1);
if(p10==0)
{
TR0=0;
flag++;
if(flag==1)
{
p34=0;
p37=0;
}
if(flag==2)
{
p34=0;
p37=1;
}
if(flag==3)
{
p37=0;
p34=1;
}
if(flag==4)
flag=0;
while(!
p10)
desiply(shi,fen,miao);
}
}
if(flag==1)
{
if(p11==0)//对秒进行相加
{
delay
(1);
if(p11==0)
{
miao++;
if(miao==60)
miao=0;
while(!
p11)
display(shi,fen,miao);
}
}
if(p12==0)//对秒进行相减
{
delay
(1);
if(p12==0)
{
miao--;
if(miao==0)
miao=59;
while(!
p12)
display(shi,fen,miao);
}
}
}
if(flag==2)
{
if(p11==0)//对分进行相加
{
delay
(1);
if(p11==0)
{
fen++;
if(fen==60)
fen=0;
while(!
p11)
display(shi,fen,miao);
}
}
if(p12==0)//对分进行相减
{
delay
(1);
if(p12==0)
{
fen--;
if(fen==0)
fen=59;
while(!
p12)
display(shi,fen,miao);
}
}
}
if(flag==3)
{
if(p11==0)//对时进行相加
{
delay
(1);
if(p11==0)
{
shi++;
if(shi==24)
shi=0;
while(!
p11)
display(shi,fen,miao);
}
}
if(p12==0)//对时进行相加
{
delay
(1);
if(p12==0)
{
shi--;
if(shi==0)
shi=23;
while(!
p12)
display(shi,fen,miao);
}
}
}
if(p13==0)
{
TR0=1;
flag=0;
p34=1;
p37=1;
}
}
voidmain()
{
init();
while
(1)
{
key();
desiply(shi,fen,miao);
P2=0xff;
P0=0x24;
P2=0xbf;
delay
(1);
}
}
voidinter0()interrupt1//定时器0的中断向量号为1
{
TH0=(65536-50000)/256;//给定时器重装赋初值
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
第五部分课程设计总结
本次单片机课程设计,在我和我的组员的默契配合,以及知道老师和同学的帮助下顺利完成了。
在设计过程中,从电路的设计,源程序的书写和修改以及实物电路的焊接中都遇到了不少问题,但在我们的共同努力下解决了,并且从中学到了不少知识。
我们在设计过程中还不断提出自己的疑点以及新的想法,联系实际应用,将课本上学习的东西运用到实际中,这些都令我们受益匪浅。
课程设计需要很大的耐心,尤其是遇到困难的时候,这也是对我们的考验。
在设计过程中,我们遇到问题不是感到急躁,而是耐心地寻找解决的办法,与老师、同学进行交流讨论,寻求最佳的解决办法。
第六部分参考文献
[1]张毅刚。
单片机原理及应用(第二版)。
北京:
高等教育出版社。
2004
[2]郭天祥。
新概念51单片机C语言教程.北京:
电子工业出版社。
2007
附录实物图