当前位置:文档之家› 基于单片机的电子时钟设计和实现

基于单片机的电子时钟设计和实现

电子科技职业技术学院Shaanxi electronic science and technologyvocational college课程设计报告题目基于单片机的电子时钟设计和实现班级电子信息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 详细元器件列表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 主程序流程图:软件程序从开始执行,先通过初始化各个寄存器,经过扫描按键来决定是否设定参数来执行相应功能的程序,进而在数码管上显示。

如图3-1:图3-1 主程序流程图3.2图图3-2A. 如图3-3:NYNY图3-3秒表中断程序流程图B.按键程序流程图3-4为时钟和闹钟的调节,程序过扫描来判断按键是否按下进行时间和闹钟的调节。

图3-4按键程序流程图图3-5为进入中断和清零图,程序过扫描来判断按键是否按下进行执行相应的中断来事实现相应的功能。

3.3控制电路的C语言源程序根据流程图,经过认真分析得出控制电路的源程序如下:#include<reg51.h>#define uchar unsigned char #define uint unsigned int#define delay_time 3/*宏定义*/uchark,dat[]={0,0,0,0,0,0,0,0}; uint tcount,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,0x0 1};unsigned char code SEG7[11]={0xC0,/*0*/ 0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0xBF,/*-*/};/*数字显示数组*/sbit miaobiao1=P1^0;sbit tminute=P1^1;sbit thour=P1^2;sbit miaobiao2=P1^3;sbit alarm=P1^4;sbit P0_0=P0^0;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;/*端口定义*/uchar ms=0;uchar flag=0;uchar sec=0;uchar minit=0;struct time{uchar second;uchar minute;uchar hour;}time1;uchar n,i;void delay(n){while(n--){for(i=120;i>0;i--);}}/*延时子程序*/void modify(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;E T1=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;}/*按键扫描*/ void init(void) {TMOD = 0x11; TH0 = 0xDB; TL0 =0xFF;TH1=0xDB;TL1=0xFF;ET0 = 1;//10msET1=1;// TR1=1;TR0=1;tcount=0;ms=0;sec=0;minit=0;EA = 1;}/*初始化*/void test(void){for(k=0;k<8;k++){P3=dis_bit[k];P2=SEG7[dat[k]]; delay(1); P3=0X00;}}/*数字显示*/void main(){init();delay(10);while(1){modify();test();} }/*主函数*/void diplay() interrupt 1 {ET0=0;TR0=0;TH0 = 0xDB;TL0 = 0xff;TR0=1;tcount++;if(tcount==100){time1.second++;tcount=0;dat1[0]=(time1.secon d)%10;dat1[1]=(time1.secon d)/10;}if(time1.second==60){ dat1[0]=0;dat1[1]=0;time1.second=0;time1.minute++;dat1[3]=(time1.minute)%10 ;dat1[4]=(time1.minut e)/10;}if(time1.minute==60){time1.minute=0;time1.hour++;dat1[6]=time1.hour%10;dat1[7]=time1.hour/1 0;}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])&&(ala rms[4]==dat1[4])&&(alarm s[3]==dat1[3])&&(dat1[1]< 1)){P0=0x00;}ET0=1;}void time_2(void)interrupt 3{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;}第四章总结经过一周的单片机课程设计,我已基本完成课题要求。

相关主题