基于单片机的电子时钟设计和实现.docx
- 文档编号:11675854
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:21
- 大小:317.53KB
基于单片机的电子时钟设计和实现.docx
《基于单片机的电子时钟设计和实现.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子时钟设计和实现.docx(21页珍藏版)》请在冰豆网上搜索。
基于单片机的电子时钟设计和实现
陕西电子科技职业技术学院
Shaanxielectronicscienceandtechnologyvocationalcollege
课程设计报告
题目基于单片机的电子时钟设计和实现
班级电子信息1507
姓名张聪
指导教师聂弘颖
时间2017年10月30日
第一章系统设计要求
1.1基本功能
(1)能够显示时分秒
(2)能够调整时分秒
1.2扩展功能
(1)能够任意设置定时时间
(2)定时时间到闹铃能够报警
(3)实现了秒表功能
第二章硬件总体设计方案
本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:
键盘、芯片、扬声器、显示屏即可满足设计要求。
2.1系统功能实现总体设计思路
此设计原理框图如图2-1所示,此电路包括以下四个部分:
单片机,键盘,闹铃电路及显示电路。
闹铃电路
图2-1设计原理框图
经多方论证硬件我个人采用AT89C51单片机和7SED八位共阳极数码管等来实现单片机电子时钟的功能。
详细元器件列表如表2.1所示:
表2.1详细元器件列表
AT89c51
1片
7SED八位共阳极数码管
1片
NPN三极管
1个
104p电容
6个
30p电容
2个
10K电阻
6个
560欧姆电阻
8个
200欧姆电阻
1个
100欧姆电阻
6个
2.2各部分功能实现
(1)单片机发送的信号通过程序控制最终在数码管上显示出来。
(2)单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。
(3)为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正数码管上显示的时间。
(4)单片机通过控制闹铃电路来完成定时闹钟的功能。
2.3系统工作原理
设计的电路主要由四模块构成:
单片机控制电路,显示电路、闹铃电路以及校正电路。
详细电路功能图如图2-2:
图2-2详细电路功能图
本设计采用C语言程序设计,使单片机控制数码管显示时、分、秒,当秒计数计满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。
时、分、秒的计数结果经过数据处理可直接送显示器显示。
当计时发生误差的时候可以用校时电路进行校正。
设计采用的是时、分、秒显示,单片机对数据进行处理同时在数码管上显示。
2.4时钟各功能分析及图解
2.4.1电路各功能图解分析
(1)时钟运行图
仿真开始运行时,或按下key4键时,时钟从12:
00:
00开始运行,其中key2键对分进行调整,key3对小时进行调整,key6可以让时钟暂停。
时钟运行图如图2-3所示:
图2-3时钟运行图
(2)秒表计时图
当按下key1键进入秒表计时状态,key6是秒表暂停键,可按key4键跳出秒表计时状态。
如图2-4:
图2-4秒表计时图
(3)闹铃设置图及运行图
当按下key5,开始定时,分别按key2调分,key3调时设置闹铃时间,然后按下key4键恢复时钟运行状态(图2-5)当闹铃设置时间到时,蜂鸣器将发出10秒中蜂鸣声(图2-6)。
图2-5闹铃时间设置图
图2-6闹铃运行图
该数字钟是用一片AT89C51单片机通过编程去驱动8个数码管实现的。
通过6个开关控制,从上到下6个开关KEY1-KEY6的功能分别为:
KEY1,切换至秒表;KEY2,调节时间,每调一次时加1;KEY3,调节时间,每调一次分加1;KEY4,从其它状态切换至时钟状态;KEY5,切换至闹钟设置状态,也可以对秒表清零;KEY6,秒表暂停.控制键分别与P1.0~P1.5口连接.其中:
A通过P2口和P3口去控制数码管的显示如图所示P2口接数码管的a——g端,是控制输出编码,P3口接数码管的1——8端,是控制动态扫描输出.
B从P0.0输出一个信号使二极管发光,二极管在设置的闹钟时间到了时候发光,若有乐曲可以去驱动扬声器实现。
2.4.2电路功能使用说明
(1)各个控制键的功能:
可对时间进行校准调节(只能加1);按下设置键数字时钟进入闹钟设置状态,设置闹钟的时间;时加1、分加1键是在校准时间时或设置闹钟时间对小时数或分钟数调节而设置的;按下秒切换键就可以进入秒表模式,同时秒表也开始计时,按下秒表暂停、复位键就暂停、归零,如果要重新对秒计时则可以按秒表开始、复位;清零键可以对闹钟清零。
(2)AT89C51单片机,通过编写程序对数码显示进行控制。
(3)八个7段数码管显示时钟和秒表信号。
第三章软件总体设计方案
3.1主程序流程图:
开始
定时器及中断定时器初始化
执行时钟秒表
闹铃设定程序
是否设定参数
执行显示程序
N
Y
软件程序从开始执行,先通过初始化各个寄存器,经过扫描按键来决定是否设定参数来执行相应功能的程序,进而在数码管上显示。
如图3-1:
图3-1主程序流程图
分数值time..minute加1time.second归零
Tcount加1
返回主程序
实数值time1.boun加1time1.mintet归零
Time1.bour>23
时数值time1.hour归零
Tount1=100?
秒数值time1.second加1second归零
执行闹钟程序p0.0=1
判断时间与闹钟时间是否一致
闹钟程序是否行完全
Time1.second=60?
Time.minute=60?
恢复初值保护
3.2总中断程序流程
图3-2中断流程图
时间的显示通过此中断程序来控制,并且通过与设定的时间进行比较来判断是否让闹铃工作。
程序中包含时间的设定,如设定tcount来使秒等工作,进而来控制分和时。
如上图图3-2。
A.秒表中断程序流程
秒表功能通过另一个程序来实现。
通过保护主程序的数据来进行秒表功能。
程序中需要设置秒表的具体显示方法。
如图3-3:
N
Y
N
Y
图3-3秒表中断程序流程图
B.按键程序流程
Y
N
程序初始化
时十位归零alarms【7】=0
分时位归零alarms[4]=0
分十位归零
输出时钟时十位加一
输出闹钟时个位加一,延时
输出时钟十位加一
输出时钟十个位加一
输出时钟分个位加一,延时
输出闹钟时分位加一
输出闹钟时十位加一
输出闹钟分个位加一,延时
时十位归零
判断标志位是否为零
Alarms[4]>2
Alarms[7]>2
Alarms【3】>0
Dat1[6]>9
Dat1[7]
Alarms[6]>9
Dat1[3]>9
Dat1[4]>2
判断标志是否为零
判断时i加键是否按下
判断分加键是否按下
N
Y
N
N
Y
Y
Y
Y
图3-4为时钟和闹钟的调节,程序中通过扫描来判断按键是否按下进行时间和闹钟的调节。
图3-4按键程序流程图
图3-5为进入中断和清零图,程序中通过扫描来判断按键是否按下进行执行相应的中断来事实现相应的功能。
图3-5中断和清零程序流程图
3.3控制电路的C语言源程序
根据流程图,经过认真分析得出控制电路的源程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelay_time3/*宏定义*/
uchark,dat[]={0,0,0,0,0,0,0,0};
uinttcount,t,u;
uchardat1[]={0,0,0,0,0,0,2,1};
uchardat2[]={0,0,0,0,0,0,0,0};
ucharalarms[]={0,0,0,0,0,0,0,0};
uchardis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsignedcharcodeSEG7[11]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0xBF,/*-*/
};/*数字显示数组*/
sbitmiaobiao1=P1^0;
sbittminute=P1^1;
sbitthour=P1^2;
sbitmiaobiao2=P1^3;
sbitalarm=P1^4;
sbitP0_0=P0^0;
sbitP1_5=P1^5;
sbitP1_6=P1^6;
sbitP1_7=P1^7;/*端口定义*/
ucharms=0;
ucharflag=0;
ucharsec=0;
ucharminit=0;
structtime{ucharsecond;ucharminute;ucharhour;}time1;
ucharn,i;
voiddelay(n)
{while(n--)
{
for(i=120;i>0;i--);
}
}
/*延时子程序*/
voidmodify(void)
{
EA=0;
if(thour==0)
{
if(flag==0)
{
dat1[6]++;delay(280);
if(dat1[6]>9)
{
dat1[6]=0;
dat1[7]++;
}
elseif((dat1[7]>1)&&(dat1[6]>3))
{dat1[7]=0;dat1[6]=0;}
}
if(flag==1)
{
alarms[6]++;delay(300);
if(alarms[6]>9)
{
alarms[6]=0;alarms[7]++;
if(alarms[7]>2)
{
alarms[7]=0;
}
}
dat[6]=alarms[6];
dat[7]=alarms[7];
}
}
if(tminute==0)
{
if(flag==0)
{
dat1[3]++;delay(280);
if(dat[3]>=9)
{
dat1[4]++;dat1[3]=0;
if(dat1[4]>5)
{
dat1[4]=0;
}
}
}
if(flag==1)
{
alarms[3]++;delay(300);
if(alarms[3]>9)
{
alarms[4]++;alarms[3]=0;
if(alarms[4]>5)
{
alarms[4]=0;
}
}
dat[3]=alarms[3];
dat[4]=alarms[4];
}
}
if(miaobiao1==0)
{TR0=0;ET0=0;TR1=1;ET1=1;
}
if(miaobiao2==0)
{
TR0=1;ET0=1;TR1=0;ET1=0;
dat2[0]=0;
dat2[1]=0;
dat2[3]=0;
dat2[4]=0;
dat2[6]=0;
dat2[7]=0;
ms=0;
sec=0;
minit=0;
}
if(P1_5==0)
{
TR0=0;ET0=0;TR1=0;ET1=0;
}
if(alarm==0)
{
TR0=0;ET0=0;TR1=0;ET1=0;flag=1;
dat[0]=0;
dat[1]=0;
dat[2]=10;
dat[3]=0;
dat[4]=0;
dat[5]=10;
dat[6]=0;
dat[7]=0;
}
EA=1;
}/*按键扫描*/
voidinit(void)
{
TMOD=0x11;
TH0=0xDB;
TL0=0xFF;
TH1=0xDB;
TL1=0xFF;
ET0=1;//10ms
ET1=1;
//TR1=1;
TR0=1;
tcount=0;
ms=0;
sec=0;
minit=0;
EA=1;
}/*初始化*/
voidtest(void){
for(k=0;k<8;k++)
{
P3=dis_bit[k];
P2=SEG7[dat[k]];delay
(1);
P3=0X00;
}
}/*数字显示*/
voidmain()
{init();
delay(10);
while
(1)
{
modify();
test();
}
}/*主函数*/
voiddiplay()interrupt1
{
ET0=0;
TR0=0;
TH0=0xDB;
TL0=0xff;
TR0=1;
tcount++;
if(tcount==100)
{
time1.second++;
tcount=0;
dat1[0]=(time1.second)%10;
dat1[1]=(time1.second)/10;
}
if(time1.second==60)
{dat1[0]=0;dat1[1]=0;
time1.second=0;
time1.minute++;
dat1[3]=(time1.minute)%10;
dat1[4]=(time1.minute)/10;
}
if(time1.minute==60)
{
time1.minute=0;
time1.hour++;
dat1[6]=time1.hour%10;
dat1[7]=time1.hour/10;
}
if(time1.hour>23)
{
time1.hour=0;
}
dat[5]=10;
dat[2]=10;
dat[0]=dat1[0];
dat[1]=dat1[1];
dat[3]=dat1[3];
dat[4]=dat1[4];
dat[6]=dat1[6];
dat[7]=dat1[7];
flag=0;
P0=0x01;
if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3])&&(dat1[1]<1))
{
P0=0x00;
}
ET0=1;
}
voidtime_2(void)interrupt3
{
EA=0;
TR0=0;
TH1=0xDB;
TL1=0xFF;
TR1=1;
ms++;
dat2[0]=ms%10;
dat2[1]=ms/10;
if(ms>=100)
{
ms=0;
sec++;
dat2[3]=sec%10;
dat2[4]=sec/10;
if(sec>=60)
{
sec=0;
minit++;
dat2[6]=minit%10;
dat2[7]=minit/10;
}
}
dat[5]=10;
dat[2]=10;
dat[0]=dat2[0];
dat[1]=dat2[1];
dat[3]=dat2[3];
dat[4]=dat2[4];
dat[6]=dat2[6];
dat[7]=dat2[7];
EA=1;
}
第四章总结
经过一周的单片机课程设计,我已基本完成课题要求。
功能上基本达标:
时钟的显示,秒表显示,定时功能,调时功能。
时钟显示功能,精确度完全可以满足日常生活显示时间的需要;秒表功能,可以满足比赛计时的需要;调时功能,方便快捷;定时功能准确可靠,还有扩展成音乐闹钟的余地。
硬件设施合乎要求,软件设计可以配合硬件实现要求功能。
但是由于时间比较短,出现部分不足:
使用定时和秒表功能时时间显示功能停止运行。
经讨论只是软件部分还不完善。
不过,我相信,如果时间充足,将软件改进,我完全可以很好实现所有功能。
另外,在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子 时钟 设计 实现