基于单片机电子时钟课程设计.docx
《基于单片机电子时钟课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机电子时钟课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
基于单片机电子时钟课程设计
单片机课程设计
基于单片机电子时钟的设计
摘要
3
1设计课题任务、基本原理及方案
4
1.1设计课题任务
4
1.2软时钟的基本原理
4
1.3设计课题总体方案
4
2设计课题硬件系统的设计
5
2.1设计课题硬件系统各主要器件简要介绍
5
2.2设计课题硬件系统各模块功能简要介绍
7
硬件电路连接图
10
2.3设计课题元器件清单
11
3设计课题软件系统的设计
11
3.1设计课题使用单片机资源的情况
11
3.2设计课题软件系统个模块功能简要介绍
11
3.3设计课题软件系统程序流程框图
12
3.4课程设计各部分程序介绍
14
4课程设计结论、误差分析、心得体会
19
4.1设计课题的设计结论
19
4.2设计课题的误差分析
19
4.3设计体会
20
5参考文献
20
摘要
单片机即单片微型计算机,由RAM、ROM、CPU构成,定时、计数和多种接口于一体的微控制器。
它体积小、成本低、功能强,广泛应用于智能产业和工业自动化上。
这次课程设计通过对它的学习、设计、开发软、硬的能力。
1957年,Ventura发明了世界上的第一个电子表,从而奠定的电子时钟的基础,电子时钟开始迅速发展起来。
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒进一分,满六十分进一小时,满二十四小时自动清零,从而达到计时的功能。
电子时钟是人民生活中不可缺少的工具。
通常通过用单片机设计电子时钟有两种方法:
一是通过单片机内部的定时器/计数器,采用软件编程的方法实现时钟计时,一般称为软时钟。
这种方法硬件电路简单,系统的功能一般与软件的设计有关;二是采用时钟芯片,它的功能强大,功能部件集成在芯片的内部,自动产生时钟等相关的功能。
这种方案硬件成本相对较高,软件编程简单,通常用在对时钟精度要求较高的场合。
本次课程设计采用深圳宏晶公司的STC89C52RC单片机为核心,使用12MHz晶振与单片机STC89C52RC相连接,通过软件编程的方法实现以24小时为一个周期的计时功能,并通过8位7段LED数码管显示当前的时间,显示的格式为:
时—分—秒(如12-25-09)。
该电子时钟电路中有四个按键:
K0,K1,K2,RST。
对按键进行相应的操作可以达到调时、复位的功能。
整个过程就是先设计和焊接好硬件电路,再通过汇编语言编写应用程序并下载到单片机上实现我们需要的功能。
由于本实验的硬件电路的结构简单、直观,所以软件的编程及调试是本次课程设计的重点和难点。
1设计课题任务、基本原理及方案介绍
1.1设计课题任务
设计一个具有特定功能的电子钟。
具有时间显示、并具有时间设定,时间调整,复位重置的功能。
1.2软时钟的基本原理
软时钟是利用了单片机内部的定时器/计数器来实现的,它的处理过程如下:
首先设定单片机内部的的一个定时器/计数器工作于定时方式,对机器周期计数形成基准时间(如10ms),然后用另一个定时器/计数器后软件计数的方法对基准时间计数形成秒(对10ms计数100次),对秒计数60次形成分,对分计数60次形成小时,对小时计数24次则表示计满了一天,单片机可以自动清零重新计时。
在计时的过程中可以通过数码管把技术的内容在相应的位置显示出来。
数码管显示可以采用静态显示方法和动态显示方法。
静态显示方法需要数据锁存器等硬件,接口复杂,时钟显示一般用6个或8个数码管。
由于系统没有其他的复杂的任务需要处理,而且显示的时钟信息随时都可以变化,一般采用动态显示方法。
动态显示方法,线路相对简单,但需要动态扫描,扫描的频率要大于人眼的视觉暂留频率(每秒24次),信息看起来才稳定。
译码方式可分为软件译码和硬件译码,软件译码通过译码程序查询显示信息的字段码;硬件译码通过硬件译码器得到显示信息的字段码,实际中通常采用软件译码。
在具体处理中,定时器/计数器采用中断方式工作,对时钟的形成在在中断服务程序中实现。
在主程序中只需要对定时器/计数器初始化、调用显示自程序和控制子程序。
另外,为了使用方便,设计了简单的按键,可以通过按键实现对时、分的调整,这样在主程序中就要加入键盘设置的子程序。
1.3设计课题总体方案
图1.1总体设计方案图
2设计课题硬件系统的设计
2.1设计课题硬件系统各主要器件简要介绍
本设计的硬件系统主要采用以下电子元器件:
单片机STC89C52RC,锁存器HD74LS373P,数码管(共阴极),NPN型三极管2N5551,电阻,电容,晶振,按键。
【1】单片机STC89C52RC为本次课程设计的核心器件。
图2.1STC89C52RC封装图
在单片机STC89C52RC中,有256KB的片内数据存储器和8KB的片内程序存储器,因此在组建单片机的最小应用系统时,不需要在单片机的外部扩展片外存储器。
单片机STC89C52RC中有四个8位的并行I/O接口:
P0、P1、P2、P3。
这四个接口,既可以作输入,也可以作输出,既可以按8位处理,也可以按位处理。
P0口也可以作数据/地址线使用,在本次课程设计中,P0作数据线使用,向锁存器输出8位的字段码。
P2口也可以作地址线使用,在本次实验中,P2口作位选码输出端。
P1口中选三个端口作按键输入端。
单片机控制线介绍:
RST:
上电复位端,当单片机振荡工作时,在该引脚上出现两个机器周期的高电平,单片机就可实现复位操作,使单片机回到初始状态。
XTAL1、XTAL2:
外接晶振引脚。
/EA:
片外程序存储器选用端,低电平有效。
本次实验中不需要扩张存储器,因此,在电路中此端口接高电平。
/PSEN:
片外程序存储器读选通信号输出端,低电平有效。
本次试验中无片外程序存储器,故此功能不需要,此端口接高电平或悬空。
ALE:
地址锁存信号输出端。
本次试验中没有用到16位地址线,故此端口悬空处理。
VCC:
电源端,接+5V电源正端。
GND:
接地端,接+5V电源地端。
【2】锁存器HD74LS373P
图2.274LS373的结构图
HD74LS373P是一个带输出三态们的8位锁存器,具有8个输入端D0~D7,8个输出端Q0~Q7,G位数据锁存控制端,G位高电平,则把输入的数据存入锁存器中,/OE位输出允许端,低电平是把锁存器中的内容通过输出端输出。
图2.374LS373的功能表
【3】数码管(共阴极)
图2.4数码管封装图
2.2设计课题硬件系统各模块功能简要介绍
本设计的硬件系统主要采用以下基本模块来实现:
单片机最小系统模块,输入模块、输出模块。
(1)单片机最小系统模块:
包括单片机STC89C52RC、复位电路、晶振电路。
本本模块STC89C52RC系统控制核心,单片机系统复位由复位电路完成,单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端位位引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器和两只电容。
这样就构成一个稳定的自激振荡器。
图2.5晶振电路
图2.6复位电路
当复位键K3未按下时,RST端是低电平。
当复位键K3按下时,RST端瞬间上升到电源电压,及为高电平,电路中电源对电容快速充电。
当复位键弹起时,电容通过电阻向地端放电,RST端电压逐渐下降。
在保证RST端能得到大于两个机器周期的高电平时,单片机完成复位初始化操作。
图2.7单片机的最小系统
(2)输入模块:
本模块共用到了3个按键独立式按键:
K0键是选择功能键,K1加一功能,K2减一功能。
单片机通过计数K0、K1、K2键被按下的次数,做出相应的反应:
没有按键,则时钟正常走时。
当按下K0键,进入调分状态,时钟停止走动;按K1或K2键可进行加1或减1操作;继续按K0键可分别进行分和小时的调整;最后按K0键将退出调整状态,时钟开始继续计时运行。
图2.8输入模块
(3)输出模块:
本次设计显示为8位,采用八位七段式数码管(共阴极)作为显示窗口.由于显示过程是采用了动态显示的方法,一次单片机只让一位数码管显示,但以高频率连续扫描八位数码管,使得人看到的是稳定的数字。
每一次显示时,单片机的P0口作为数据线,输出一个数码管显示所需的八位字段码,并通过锁存器74LS373与数码管相连。
P2口作为位选码输出端,分别通过NPN型三极管与共阴极的数码管的公共端相连。
P2口的八位输出端每次只有一个端口输出高电平,使得相对应的NPN型三极管导通,从而使得相连的数码管公共端接地,则此公共端接地的数码管可以显示相应的字符。
图2.9输出模块
图2.10硬件电路路
2.3设计课题元器件清单
序号
产品名称
规格型号
数量
1
单片机
STC89C52RC
1
2
晶振
12MHz
1
3
独石电容
30pF
2
4
电解电容
47μF
2
5
电解电容
10μF
1
6
按钮
4
7
RJ电阻
10KΩ
4
8
RJ电阻
510Ω
8
9
RJ电阻
4.7K
8
10
三极管
2N5551NPN
8
11
锁存器
74LS373
1
12
8段式LED数码管
8
图2.11元器件清单
3设计课题软件系统的设计
3.1设计课题使用单片机资源的情况
单片机资源使用的情况如下:
P0口作为段码输出口,输出数码管显示的段码信号;P1口作为按键输入口,将按键上的信号输入到单片机内部;P3口作为位码输出口,输出数码管的位显示,输出数码管位选信号;晶振11.0592M;
3.2设计课题软件系统个模块功能简要介绍
本设计的软件系统模块大致分为:
主程序模块,中断服务程序,数码驱动显示程序,键扫程序。
主程序:
用于对程序进行全局控制,包括信号的输入输出,调用各个功能的子模块,调配按键的使用。
中断服务程序:
用于产生1S的脉冲信号。
键盘扫描模块:
用于及时校正计时状态。
数码驱动模块:
用于驱动数码管的正确显示计时。
3.3设计课题软件系统程序流程框图
主程序执行流程如下图:
主程序先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有按键按下,则转入相应的功能程序.
图3.1
定时器/计数器T0用于时间计时,选择方式1,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加1,秒单元加到60则对分单元加1,同时秒单元清零;分单元加到60则对时单元加1,同时分单元清零;时单元加到24则对时单元清零,标志一天时间计满。
在对各单元计数的同时,把它们的值放到存储单元的指定位置。
定时器/计数器T0中断服务程序流程图如下图:
图3.2
按键扫描部分流程图:
按键K0的扫描流程图如下,单片机在工作的过程中部端的对按键K0经行扫描,一旦发现K0按下,就开始作出一系列的连续反应。
按键K1、K2的扫描方法与按键K0的方法相似,单片机中一个储存单元记录K0的按下的此时,K1、K2对记录着分或小时的计数单元内的数值经行加或者减的处理。
图3.3按键扫描流程图
3.4课程设计各部分程序介绍
//采用8位LED软件译码动态显示程序。
//使用STC89C52RC单片机,12MHz晶振。
//P0口输出字段码,P2口输出位选码,用共阴极LED数码管,key0为调时位选择键,key1为加1键,key2为减1键。
【1】程序头文件部分及各储存单元的定义:
#include"reg52.h"
#include"stdio.h"
#definecharunsignedchar
charcodedis_7[12]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极LED数码管0~9、灭和-的字段码
charcodescan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选择码
chardatadis[8]={0x00,0x00,0x0b,0x00,0x00,0xb0,0x00,0x00};//显示缓冲区,时、分、秒初始为0,0x0b为-的编码
chardatatimedata[3]={0x00,0x00,0x00};//分别为秒、分和小时的值
chardatams50=0x00,con=0x00,con1=0x00,con2=0x00;//计数次数初值
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
【2】1ms延时程序部分:
//1ms延时函数
delay1ms(intt)
{
inti,j;
for(i=0;ifor(j=0;j<120;j++)
;
}
【3】按键扫描,处理部分:
//按键处理函数
keyscan()
{
EA=0;
if(key0==0)//按下K0
{
delay1ms(10);//K0去抖
while(key0==0)
con++;
TR0=0;
ET0=0;
if(con>=3)
{
con=0;TR0=1;ET0=1;
}
}
if(con!
=0)
{
if(key1==0)
{
delay1ms(10);//K1去抖
while(key1==0);
timedata[con]++;
if(con==2)con1=24;elsecon1=60;
if(timedata[con]>=con1)
{timedata[con]=0;}
}
}
if(con!
=0)
{
if(key2==0)
{
delay1ms(10);//K2去抖
while(key2==0);
timedata[con]--;
if(con==2)con2=23;elsecon2=59;
if(timedata[con]<=0){timedata[con]=con2;}
}
}
EA=1;
}
【4】数码管显示部分:
//数码管显示函数
scan()
{
chark;
dis[0]=timedata[0]%10;
dis[1]=timedata[0]/10;//秒
dis[3]=timedata[1]%10;
dis[4]=timedata[1]/10;//分
dis[6]=timedata[2]%10;
dis[7]=timedata[2]/10;//时
for(k=0;k<8;k++)
{
P0=dis_7[dis[k]];P2=scan_con[k];delay1ms
(1);P2=0x00;
}
}
【5】主程序部分:
对定时器/计数器T0经行初始化。
调用显示子程序和扫描子程序。
//主函数
main()
{
TH0=0x3c;TL0=0xb0;//T0定时50ms
TMOD=0x01;ET0=1;TR0=1;EA=1;
while
(1)
{
scan();
keyscan();
}
}
【6】定时器/计数器T0中断,形成秒,分,时:
//定时器、计数器T0中断服务函数
voidtime_intt0(void)interrupt1
{
ET0=0;TR0=0;TH0=0x3c;TL0=0xb0;TR0=1;
ms50++;
if(ms50==20)//循环20次,计1s
{
ms50=0x00;timedata[0]++;//秒+1
if(timedata[0]==60)
{
timedata[0]=0;timedata[1]++;//分+1
if(timedata[1]==60)
{
timedata[1]=0;timedata[2]++;//小时+1
if(timedata[2]==24)
{
timedata[2]=0;
}
}
}}
ET0=1;
}
4课程设计结论、误差分析、心得体会
4.1设计课题的设计结论
本设计为基于单片机的电子钟的设计。
本设计用八个共阳数码管做为显示器,它显示时间值;设计中有四个按键,其中K0为启动/选择调整位置,K1为加控制键、K2为减控制键,K3位复位键。
上电之后,电子时钟可以自动开始计时,通过按键K0、K1、K2可以对电子时钟经行调整,通过复位键K3可以让电子时钟重新开始计时,这样的结果与设计要求完全相符,本设计成功。
完成了设计任务。
4.2设计课题的误差分析
该电子钟在运行中存在一定的误差,误差产生有三种可能:
首先是采用的计时方案是软件计时的,计时优势利用中断来实现。
而当电子钟运行时间1秒时,又得去执行中断程序,这个过程是需要时间的,所以就产生了一定的误差,当然这个误差是避免不了的;
其次还有硬件系统也有一定的影响;
第三,设计用到11.0592MHz的晶振,计算是满20次为一秒钟,但实际会慢很多。
4.3设计体会
经过为期一周的忙碌,终于完成了单片机的课程设计实验。
在此期间,我不仅把课堂上学习到的东西经行了巩固和强化,而且在实践过程中各方面的能力也有所提高。
当然,这里少不了老师和小组中的其他成员的帮组和指导。
在经行课程设计之前,老师给我们详细的讲解了本次课程设计的各部分电路的原理,也提前告诉我们一些在实践过程中需要注意的细节,可能出现的问题以及相应的解决方法。
由于本次课程设计是针对我们已经学过的知识。
在此之前,我们也经行过硬件电路的焊接实验和单片机软件编程方面的训练。
自己觉得这一次的课程设计应该很简单。
拿到元器件时,发现其中有我以前没有见过的原件。
对原件的了解不充分就贸然开始焊接工作十有八九会出问题,因此根据报告要求和实际需要,在资料书和互联网上查找相应的资料。
通过学习查找的资料,我又对一些新的元器件的使用方法和功能有了初步的了解,扩展了我的知识面。
在研读查找到的资料的过程中,通过与书本上的知识的比较和联系,我对学习过的知识又有了新的更深的了解。
在焊接硬件电路是,做到小心谨慎,一步一查,及早地发现问题并解决掉出现的问题。
单片机的程序先在Keil软件上编写并编译,编译成功后下载到单片机上。
把单片机插入到焊接好的硬件电路上,上电,调试,查看电路是否工作正常。
我们在完成了硬件电路和程序编译和下载步骤后,在最后的调试过程中,发现电路可以正常工作,但有一个数码管上的一段不能正常的被点亮。
用万用表测量,发现那个数码管的一个引脚可能出现的虚焊。
在解决虚焊问题后,整个电路可以正常工作。
通过发现问题和解决问题,我懂得了要完成一个完美的系统,那这个系统中的每一个步骤都必须是完美的,是没有任何的错问和漏洞的。
而对于一个单片机系统而言,必须把硬件电路和软件程序结合在一起,这个系统才能正常的工作。
只有硬件电路,单片机将不知道该怎样工作。
只有程序,没有硬件,程序没有了执行的载体,那这样的程序只是一堆字码,毫无价值。
5参考文献
1.杨光友,朱宏辉,《单片微型技术及原理及接口技术》,水利水电出版社,2009.9
2.谢维成,杨家国,《单片机原理与应用及C51程序设计》,清华大学出版社,2006.8