单片机电子时钟报告Word下载.docx
《单片机电子时钟报告Word下载.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟报告Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
单片机电子时钟
摘要:
单片机即单片微型计算机。
(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
他体积小,成本低,功能强,广泛应用于工业自动化上和智能产品。
时钟,自从它被发明的那天起,就成为了人类的好朋友,但随着时间的推移,科学技术的不断发展,时钟的应用越来越广范,人们对时间计量的精度要求也越来越高。
怎样让时钟更好的为人民服务,怎样让我们的老朋友再次焕发青春呢?
这就要求我们不断设计出新型的时钟,来不断满足人们的日常生活需要。
然而市场上的时钟便宜的比较笨重,简单实用的又比较昂贵。
那么,有没有一款既简单实用价格又便宜的时钟呢?
我们课程设计小组设想:
可不可以利用单片机功能集成化高,价格又便宜的特点设计一款结构既简单,价格又便宜的单片机电子时钟呢?
基于这种情况,我们课程设计小组成员多方查阅资料,反复论证设计出了这款既简单实用,又价格便宜的——单片机电子时钟。
关键词:
单片机时钟计时
第一章系统设计要求
1.1、设计任务:
利用单片机的C语言、STC80C51单片机和八位LED数码管设计出电子时钟,且完成课程设计报告。
利用STC80C51单片机作为主控芯片,结合单片机自身时钟,利用单片机的C语言制作一个电子时钟,要求能够将年月日时分秒信息,通过按键控制分别显示在数码管上,并能够通过按键进行时间的调整
1.2设计要求:
1)能够显示时分秒
2)能够调整时分秒
3)用LED数码管显示
扩展功能
1)能够任意设置定时时间
2)实现了秒表功能
第二章硬件总体设计方案
本次设计时钟电路,使用了STC12C5A60S2单片机芯片控制电路,主要由STC12C5A16S2单片机,时钟和复位模块,八段数码管显示模块等组成。
单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,运用C语言来控制单片机STC12C5A16S2来实现动态数码显示等功能。
本设计中的STC12C5A60S2单片机是整个工作过程的核心,是整个设计的灵魂,它控制了脉冲时序的产生,显示信号的发送控制显示LED的选择。
2.1.1单片机介绍
STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051
2.工作电压:
STC12C5A60S2系列工作电压:
5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:
3.6V-2.2V(3V单片机)
3.工作频率范围:
0-35MHz,相当于普通8051的0~420MHz
4.用户应用程序空间8K/16K/20K/32K/40K/48K/52K/60K/62K字节......
5.片上集成1280字节RAM
6.通用I/O口(36/40/44个),复位后为:
准双向口/弱上拉(普通8051传统I/O口)可设置成四种模式:
准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片
8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)9.看门狗10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)
11.外部掉电检测电路:
在P4.6口有一个低压门槛比较器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%
12.时钟源:
外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内)1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:
5.0V单片机为:
11MHz~15.5MHz3.3V单片机为:
8MHz~12MHz精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准
13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器
14.2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟
15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,PowerDown模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2),CCP1/P1.4(也可通过寄存器设置到P4.3)
16.PWM(2路)/PCA(可编程计数器阵列,2路)---也可用来当2路D/A使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)
17.A/D转换,10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)
18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口
19.STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)
20.工作温度范围:
-40-+85℃(工业级)/0-75℃(商业级)21.封装:
PDIP-40,LQFP-44,LQFP-48I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
2.1.2单片机引脚介绍
图3-2STC12C5A60S2单片机引脚图
P0.0—P0.7(39—32):
P0口是一个漏极开路型准双向I/O口。
在访问外部存储器时,它是分时多路转换的地址(低8位)和数据总线,在访问期间激活了内部的上拉电阻。
在EPROM编程时,它接收指令字节,而在验证程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1.0—P1.7(1-8):
P1口是带内部上拉电阻的8位双向I/O口。
在EPROM编程和程序验证时,它接收低8位地址。
P2.0—P2.7(21-28):
P2口是一个带内部上拉电阻的8位双向I/O口。
在访问外部存储器时,它送出高8位地址。
在对EFROM编程和程序验证期间,它接收高8位地址。
P3.0—P3.7(10-17):
P3口是一个带内部上拉电阻的8位双向I/O口。
2.2系统功能实现总体设计思路
本方案完全用软件实现数字时钟。
原理为:
在单片机内部存储器设几个字节分别存放时钟的年、月、日、时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;
若秒值达到60,则将其清零,并将相应的分字节值加1;
若分值达到60,则清零分字节,并将时字节值加1;
若时值达到24,则将十字节清零,以此类推。
该方案具有硬件电路简单的特点。
此设计原理框图如图2-1所示,此电路包括以下三个部分:
单片机,校正电路及显示电路。
图2-1设计原理框图
经多方论证硬件我们小组采用STC51单片机和LED八位共阳极数码管等来实现单片机电子时钟的功能。
2.3系统工作原理图
设计的电路主要由三模块构成:
单片机控制电路,显示电路以及校正电路。
2.3.1单片机最小系统
图2、单片机最小系统
本设计晶振电路采用12M的晶振。
晶振的作用是给单片机正常工作提供稳定的时钟信号。
单片机的晶振并不是只能用12M,只要不超过20M就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M的就是好算时间,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us,那么定时器计一次数就是1us了,电容范围在20-40pF之间,这里连接的是22pF
的电容。
2.3.2时钟显示校正电路
本设计利用按键开关来校正时钟显示的数字。
当按钮按下时,将在相应的端口输入一个低电平,通过相应的程序来改变时钟显示。
其中S1按键开关用来选择要修改的数字;
S2按键用来增加所选数字的数值;
S3按键用来减少所选数字
的数值;
S4用来退出设置。
2.3.3详细硬件原理设计图
本设计采用C语言程序设计,使单片机控制数码管显示时、分、秒,当秒计数计满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。
时、分、秒的计数结果经过数据处理可直接送显示器显示。
当计时发生误差的时候可以用校时电路进行校正。
设计采用的是时、分、秒显示,单片机对数据进行处理同时在数码管上显示。
2.4电路功能使用说明
1)各个控制键的功能:
可对时间进行校准调节(只能加1);
按下设置键数字时钟进入闹钟设置状态,设置闹钟的时间;
时加1、分加1键是在校准时间时或设置闹钟时间对小时数或分钟数调节而设置的;
按下秒切换键就可以进入秒表模式,同时秒表也开始计时,按下秒表暂停、复位键就暂停、归零,如果要重新对秒计时则可以按秒表开始、复位。
STC89C51单片机,通过编写程序对数码显示进行控制。
(2)八个7段数码管显示时钟和秒表信号。
第三章软件总体设计方案
3.1程序设计
程序设计(Programming)是指设计、编制、调试程序的方法和过程。
它是目标明确的智力活动。
在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。
因此,软件设计在微机控制系统设计中占重要地位。
对于本系统,软件也占有重要的地位。
在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。
数据处理包括:
数据的采集、数字滤波、标度变换等。
过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便控制生产。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。
把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接在一起形成一个完整的程序,这样的程序设计方法称为模块化程序设计。
所谓“模块”,实质上就是能完成一定功能,并相对独立的程序段,这种程序设计方法称为模块程序设计法。
模块程序设计法的主要优点是:
(1)单个模块比起一个完整的程序易编写、调试及修改。
(2)程序的易读性好。
(3)程序的修改可局部化。
(4)模块可以共存,一个模块可以被多个任务在不同条件下调用。
(5)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。
本系统软件采用模块化结构,由主程序模块,键盘扫描及识别子程序,调电存储服务程序,显示子程序。
3.2主程序设计及流程图
(1)主程序模块
主程序主要完成初始化、设置中断向量、检查有无按键按下、以及调用显示等等。
当初始化就会自动等待输入密码,若操作有误便会报警提示并对各位进行清零,等待密码的再次输入;
若输入密码正确,在输完之后等待你按下Enter键,再判断密码是否正确,若错误便报警并再次将各位密码清零;
若输入密码正确就会自动开锁并亮灯。
主程序的流程图如下图所示。
第四章课程设计的调试及结果分析
4.1硬件调试:
给电路板通电,观察数码管的显示情况,若数码管全部稳定显示,则电路板合格;
若数码管显示不完全或者数码管忽亮忽灭,则可能是因为少锡、缺件、接触不良等原因造成的,这样我们就要检查整个电路板并且及时修整。
4.2软件调试:
电路板检查无误后,将编好的程序下载到电路板中,开始调试。
本次设计有四个按键S0、S1、S2、S3分别是复位、时间预置键(时间选位)、加、减。
具体按键说明如下:
1)S0复位键:
按下这个键后LCD液晶屏恢复初始态显示0:
0:
0。
如在正常时间显示状态下要想从0(初始态)开始从先调时间可按下此键。
2)S1时间预置键:
正常时间显示状态下,按下此键进入预置时间状态,秒、分、时、日、月、年设定完成后再按下此键退出进入正常走时状态。
3)S2加1键:
在调整年、月、日、时、分、秒时间数值时按下此键时相应的数值加一。
4)S3减1键:
在调整年、月、日、时、分、秒时间数值时按下此键时相应的数值减一。
4.3结果分析
第五章总结
经过一周的单片机课程设计,我组成员已基本完成课题要求。
功能上基本达标:
时钟的显示,秒表显示,定时功能,调时功能。
时钟显示功能,精确度完全可以满足日常生活显示时间的需要;
秒表功能,可以满足比赛计时的需要;
调时功能,方便快捷;
定时功能准确可靠,还有扩展成音乐闹钟的余地。
硬件设施合乎要求,软件设计可以配合硬件实现要求功能。
但是由于时间比较短,出现部分不足:
使用定时和秒表功能时时间显示功能停止运行。
经讨论只是软件部分还不完善。
不过,我们相信,如果时间充足,将软件改进,我们完全可以很好实现所有功能。
另外,在本次设计的过程中,我们发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我们觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
由于单片机是上学期所学习的内容,所以已经很久没复习,因此在设计的过程中遇到了很多困难,但是经过团队的讨论,论证和学习,我们克服了设计过程中的种种困难与艰辛,从中我认识到了团队力量的强大,正所谓”兄弟齐心,其力断金”.我们也发现理论和实际的差别,每次的电脑仿真都能顺利运行,但是当把实物焊接出来并导入程序都出现了很多问题.最终经过硬件调试,还是达到了我们的理想状态.
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。
参考文献
[1]李叶紫.王喜斌.胡辉.孙东辉.编著MCS_51单片机应用教程清华大学出版社.2008.6.
[2]陆剑.单片机应用技术指导书河南工业职业技术学院2005.12.
[3]汪道辉.单片机系统设计与实践.电子工业出版社
(50页时、分、秒计时器设计,59页键盘及接口技术).
[4]第二版.51系列单片机设计实例.北京航空航天大学出版社(81—89页数码管时钟电路的设计).
[5]辛友顺、胡永生、薛小玲.单片机应用系统设计与实现.福建科学技术出版社(184-186页LED显示接口,190-193页键盘接口).
[6]黄庆华、张永格.单片机开发与实例.电子工业出版社(127-162页数字式电子时钟的设计).
[7]闫玉德、俞红.MCS-51单片机原理与应用(C语言版).机械工业出版社(49-104页单片机的C程序设计).
[8]求是科技.单片机典型模块设计实例导航.人民邮电出版社(85-90页单片机数字时钟).
[9]刘守义,王静霞。
《单片机应用技术》.西安电子科技大学出版社,2002.3.1.2
控制电路的C语言源程序
#include<
reg52.h>
intrins.h>
unsignedchardatadis_digit;
unsignedcharkey_s,key_v;
unsignedcharcodedis_code[11]={0xc0,0xf9,0xa4,0xb0,//0,1,2,3
0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//4,5,6,7,8,9,—
unsignedchardatadis_buf[8];
unsignedchardatadis_index;
unsignedcharhour,min,sec;
unsignedcharsec100;
sbitK1=P1^1;
sbitK2=P1^2;
bitscan_key();
voidproc_key();
voidinc_sec();
voidinc_min();
voidinc_hour();
voiddisplay();
voiddelayms(unsignedcharms);
voidmain(void)
{
P2=0xff;
P3=0xff;
TMOD=0x11;
//定时器0,1工作模式1,16位定时方式
TH1=0xdc;
TL1=0;
TH0=0xFC;
TL0=0x17;
hour=12;
min=00;
sec=00;
sec100=0;
dis_buf[0]=dis_code[hour/10];
//时十位
dis_buf[1]=dis_code[hour%10];
//时个位
dis_buf[3]=dis_code[min/10];
//分十位
dis_buf[4]=dis_code[min%10];
//分个位
dis_buf[6]=dis_code[sec/10];
//秒十位
dis_buf[7]=dis_code[sec%10];
//秒个位
dis_buf[2]=0xbf;
//显示"
-"
dis_buf[5]=0xbf;
dis_digit=0xfe;
dis_index=0;
TCON=0x01;
IE=0x8a;
//使能timer0,1中断
TR0=1;
TR1=1;
key_v=0x03;
while
(1)
{
if(scan_key())
delayms(10);
key_v=key_s;
proc_key();
}
}
bitscan_key()
key_s=0x00;
key_s|=K2;
key_s<
<
=1;
key_s|=K1;
return(key_s^key_v);
voidproc_key()
EA=0;
if((key_v&
0x01)==0)//K1
inc_hour();
//JJ=1;
elseif((key_v&
0x02)==0)//K2
min++;
//JJ=0;
if(min>
59)
min=0;
EA=1;
voidtimer0()interrupt1
//定时器0中断服务程序,用于数码管的动态扫描
//dis_index---显示索引,用于标识当前显示的数码管和缓冲区的偏移量
//dis_digit---位选通值,传送到P2口用于选通当前数码管的数值,如等于0xfe时,
//选通P2.0口数码管
//dis_buf---显于缓冲区基地址
TH0=0xFC;
//先关闭所有数码管
P2=dis_buf[dis_index];
//显示代码传送到P0口
P3=dis_digit;
//
dis_digit=_crol_(dis_digit,1);
//位选通值左移,下次中断时选通下一位数码管
dis_index++;
dis_index&
=0x07;
//8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
voidtimer1()interrupt3
sec100++;
if(sec100>
=100)
sec100=0;
inc_sec();
voidinc_sec()
sec++;
if(sec>
sec=0;
inc_min();
//秒个位
voidinc_min()
voidinc_hour()
hour++;
if(hour>
23)
hour=0;
if(hou