《单片机原理及接口》课程设计报告时钟系统设计 .doc

上传人:仙人指路1688 文档编号:4146834 上传时间:2023-04-07 格式:DOC 页数:15 大小:299.50KB
返回 下载 相关 举报
《单片机原理及接口》课程设计报告时钟系统设计 .doc_第1页
第1页 / 共15页
《单片机原理及接口》课程设计报告时钟系统设计 .doc_第2页
第2页 / 共15页
《单片机原理及接口》课程设计报告时钟系统设计 .doc_第3页
第3页 / 共15页
《单片机原理及接口》课程设计报告时钟系统设计 .doc_第4页
第4页 / 共15页
《单片机原理及接口》课程设计报告时钟系统设计 .doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《《单片机原理及接口》课程设计报告时钟系统设计 .doc》由会员分享,可在线阅读,更多相关《《单片机原理及接口》课程设计报告时钟系统设计 .doc(15页珍藏版)》请在三一办公上搜索。

1、单片机原理及接口课程设计报告题 目: 时钟系统设计 专业名称: xxx 班 级: 莆田学院 学 号: xxxx 姓 名: xxxx 2012年 1月 时钟系统设计一设计说明1.1 设计目的:(1)掌握C51单片机的结构及其内部的定时/计数器、中断系统、以及外围的行列式按键和LED数码管等部件(2)掌握定时/计数器的结构和原理、中断处理系统的工作原理及中断方式处理定时/计数的工作过程,数码管显示原理(3)设计时钟系统通过数码管显示及按键设置实现时间的准确显示、闹铃和修改(4)学会运用软件和硬件相结合来实现设计的需要1.2 设计要求:设计一时钟系统,系统具有时钟功能,能准确显示时、分、秒。1.3

2、电子数字钟实现的主要功能1、 实现正常走时2、 能够设置时间且待设置位会闪烁显示3、 具有闹铃及设定闹铃时间功能4、 具有倒计时功能1.4设计环境(1) 硬件:计算机一台(2) Windowns操作系统 、 KeilC51单片机仿真软件 、 proteus单片机系统仿真软件。二、整体设计方案1.硬件电路设计 时钟的设计,主要采用了AT89S52、74HC573、74LS138、晶振、8只共阴LED数码管,包括显示模块,按键模块和扬声器模块以及单片机的基础电路。 1.1方案设计所应用知识 1.1.1.C51单片机介绍(如图1-1) 89C51单片机有四组8位并行I/O口,记作P0、P1、P2和P

3、3。每组I/O口内部都有8位数据输入缓冲器、8位数据输出锁存器及数据输出驱动等电路。四组并行I/O端口即可以按字节操作,又可以按位操作。当系统没有扩展外部器件时,I/O端口用作双向输入输出口;当系统作外部扩展时,使用P0口作系统地址的低8位、P2口作系统地址的高8位;P0口还可作数据时分复用线,P3口有第二功能(如图1-2),大多与其内部功能部件有关,其中RD、WR是外部数据存储器的写、读控制信号。 应注意:当四个并行口在作输入口使用时,均应先对其写“1”,以避免误读。 图1-1 89C51 单片机相关引脚 图1-2 P3口每一位的第二功能1.1.2定时/计数器8051型单片机有两个十六位定时

4、/计数器T0、T1,有四种工作方式,跟定时/计数器相关的特殊功能寄存器有这样几个:表一:方式控制寄存器TMOD D7D6D5D4D3D2D1D0GATEC/T M1 M0GATEC/TM1M0加法计数寄存器TH0、TH1 (高八位)TL0、TL1(低八位);定时/计数到标志TF0、TF1(中断控制寄存器TCON);定时/计数器启停控制位TR0、TR1(TCON);定时/计数器中断允许位ET0、ET1(中断允许寄存IE);定时/计数器中断优先级控制位PT0、PT1(中断优IP)。TMOD的低四位为T0的方式字,高四位为T1的方式字。TMOD不能位寻址,必须整体赋值。(1)工作方式选择位M1、M0

5、 表二:M1、M0的状态决定定时器的工作方式M1M0 功 能 说 明 00110101方式0,为13位的定时计数器方式1,为16位的定时计数器方式2,为常数自动重装入的8位定时计数器方式3,T0分为两个8位定时计数器,T1在该方式时停止 (2)定时和外部事件计数方式选择位C/TC/T0为定时器方式;C/T1为外部事件计数器方式(3)门控位GATEGATE = 0时,且受定时器运行控制位(TR0、TR1)的控制时为软件启动。GATE = 1时,除受TR0、TR1控制外,还受外部引脚(INT0、 INT1)输入电平的控制(为高)为硬启动。(4)初值的确定:a = Tfosc/12 (注意单位);T

6、Hx = a / 256;TLx = a % 256;根据确定初值的公式,三种工作方式下可得以下结论:a.同种方式下,频率越大,所定的最大时间越来越短;b.同种频率下,方式1所定的时间最长;c.晶振为6MHZ时能定的最大时间100ms,晶振为12MHZ时能定的最大时间为50ms1.1.3中断所谓中断是指,单片机内部有一个中断管理系统,它对内部的定时器事件、串行通信的发送和接收事件及外部事件(如键盘按键动作)等进行自动的检测判断,当有某个事件产生时,中断管理系统会置位相应标志通知CPU,请求CPU迅速去处理。CPU检测到某个标志时,会停止当前正在处理的程序流程,转去处理所发生的事件(针对发生的事

7、件,调用某一特定的函数,称为该事件的中断服务函数),处理完以后,再回到原来被中断的地方,继续执行原来的程序。1.1.4数码管显示原理数码管是一种把多个LED显示段集成在一起的显示设备,有两种类型:共阴和共阳如图1-3(a)和(b)。共阳极的就是把多个LED显示段的阳极接在一起,又称为公共端;共阴极的就是把多个LED显示段的阴极接在一起,称为公共端。通常数码管又分为8段,即8个LED显示段,分别为adp,其中dp是小数点位段。N位LED显示器有N根位选线和8N根段选线。根据显方式不同,位选线与段选线的连接方法不同。段选线控制字符选择,位选线控制显示位的亮、灭。数码管有两种显示方式:静态显示与动态

8、显示静态显示方式:各位LED的位选线连在一起接地或接+5V;每位LED的段选线(adp)各与一个八位并行口相连。动态显示方式:将所有LED的段选线并联在一起,由一个八位IO口控制,而位选线分别由相应的IO口线控制(如图1-4)本设计用的是数码管动态显示原理,利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出数码管加有效地数据信号,当全段扫面速度大于视觉暂留速度时,显示就会清晰显示出来。根据图1-3(a)和(c)可推导出显示09的共阴代码(包括显示小数点)即为0时相应的显示段亮 图1-3 LED显示器1.2控制器部分方案论证 方案一:时钟模块采用DS1302 芯片,功耗实时时

9、钟电路结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周、日、时、分、秒进行计时。方案二:采用51单片机,用51单片机加以一定的硬件电路,由于使用软硬件结合的方式,所以电路结构简单,调试也相对方便。1.3显示部分的方案论证方案一:采用8段数码管LED有两种显示方式:动态显示和静态显示。静态显示式是简单的将数码管的段选与IO口相连,另一端接VCC或GND,动态显示则是将多个数码管的段选接至同一个IO口,位选接入相应的IO口,在编程时,分别点亮每一个数码管,利用人眼的暂留效果即感觉到数码管是一直显示的。方案二:液晶显示方式。液晶显示效果出众,可以运用菜单项来方便操作但是价格相对比较贵

10、,而且驱动程序相对于LED也比较复杂。 图-2 数码管显示电路1.4最终方案控制器部分选择AT89S52作为始终电路的核心,显示部分选择8位8段数码管,扬声器部分由IO连接至三极管作为驱动。由此结合单片机课程学习中对实验面板的了解,做出如下电路: 图-3 proteus仿真电路如图,晶振频率12MHz,P0口接一个上拉排阻,输出作为控制数码管的段控信号,经74LS573即8位数据锁存器接到数码管中;P2.0-P2.2经74HC138连接到数码管位选,P27为74HC138的片选信号;P3.7经三极管与蜂鸣器相连;四个按钮分别与P3.0-P3.3相连。2.系统软件总流程设计流程图如左图所示。主程

11、序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间,之后再检测是否响铃。 图-4 程序总流图按键处理是先检测切换功能位是否被按下,如果没有则显示保留当前状态,若按下,则显示下一个功能(顺序为时钟闹钟倒计时循环);判断以为案件是否按下,如果按下,被设置位就相应的改变(顺序为秒分时循环);判断“+”按键是否按下,“+”按键如果按下,相对应的被设置位就加1;如果没有按下,原数字不变。秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。要求每满1秒,则“秒”单元中的内容加1;“秒”单元满60,则“分”

12、单元中的内容加1;“分”单元满60,则“时”单元中的内容加1;“时”单元满24,则将时、分、秒的内容全部清零。3.实时时钟程序设计步骤:(1)计算初值;(2)采用中断方式进行溢出次数累计;(3)时钟显示:时钟时间在方位数码管上进行显示,直接通过显示子函数完成; (4)响铃程序:在一定的条件下是蜂鸣器播放声音;(5)时钟设置:对相应的设置为碱性加或减操作;(6)中断服务程序:进行计时操作,并完成对时、分、秒的加或减操作。三程序调试过程:3.1显示模块电子时钟显示采用数码管,显示模块采用动态显示的方式,即将所有LED的段选线并联在一起接至P0,而位选线由74HC138的输出控制。一次可以推算出显示

13、的位码为smg_wei=0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0。正常显示状态:默认为走时状态,按24小时制分别显示“时时-分分-秒秒”,设置时间状态:数码管时间暂停,同时对应的待设置位会闪烁显示。判断当前的显示状态,既flag_into标志位。三个flag_int0分别对应时钟、闹钟、倒计时。如下图所示:图-6 设置时间时的显示3.2 走时、倒计时功能走时程序有内部中断T0完成,把定时器的定时时间定为50ms。这样,计数溢出20次即可得到1秒。而计数20次可以用软件实现。然后完成通过程序对时、分、秒的加操作。同理,倒计时程序由内部中断T1完成,硬件定时5

14、0ms,软件循环20次得到1秒,通过相应的程序完成时分秒的减操作。并在数码管上动态显示。综上所述在设置T0、T1定时器是即将TMOD=0X11(0001 0001),THx=-50000/256,TLx=-50000%256,然后将相应的中断打开即可。走时截图如下: 3.3 时间设置模块由于时钟有三个功能,而这三个功能对应时间内容都是暂时存放在三个对应的数组(time、alarm、timer)内,所以设置时间时要将待设置的时间装入一个临时数组(time_tmp)内。由于正常显示时间时,数码管是显示实时时间,而设置时间时,数码管则应该暂停显示,所以在调试时,在设置时间模块里加了一个读标志(rea

15、d_flag),当read_flag为1时,本模块可以读取相应数组的时间;反之则不能读取,如果不能读取时间则相当于时间一直停止在当前状态不变。对于倒计时功能则处理相对简单,每当进入设置状态时,直接置TR1=0,暂停计时。在分别设置过秒、分、时之后,将time_tmp数组的时间写入相应的待设置数组,并且置TR1=1,read_flag=1。进入正常走势状态。3.4 响铃模块图-7 蜂鸣器电路响铃的原理主要是单片机的某个引脚产生一定频率的方波,通过驱动电路接入扬声器,从而产生某一特定频率的声音,程序和响铃有关的有整点报时、闹钟和倒计时三个部分,其中闹钟和倒计时的响铃程序除了条件不一样以外,其他都差

16、不多。只是在响铃时由于蜂鸣器占用了cpu导致了现实程序无法正常运行。整点时,则是把它设置成56s和58s两声约1s低音,进入整点时,一声高音, 3.5仿真调试 软件调试部分主要是使用protus 7 professional软件配合keil进行在线仿真,通过设置断点来判断程序有不合实际的地方,并且修改,在最终完成程序以后,将keil生成的hex文件下载到51单片机的学习板上进行硬件仿真,取得了预期的效果。仿真效果如下:图-8 最终调试结果 四 心得体会 通过了解89C51单片机结构及工作原理和硬件电路定时/计数器、中断、行列式键盘、数码管显示的工作原理,从而通过keil软件编写程序和仿真器结合

17、控制时钟系统实现基本的准确显示时间和闹。通过这次课程设计进一步数码管动态显示及定时/计数器的工作原理,掌握keil软件与仿真器的结合使用。经过这次的设计让自己学会软件与硬件相结合使用,同时也认识到理论与实际相结合的重要性,只有理论知识是不够的,只有把理论知识与实践相结合,多动手多思考,从而提高自己的实践能力。在设计过程中也发现自己有很多不足之处,对所学过的知识理解得不够深刻,掌握得不够牢固,也不太懂与实际相运用,但是经过一周的实训,还有通过网上查找资料,在老师和同学们的帮助下,不仅巩固了课堂所学的知识,而且加深了解了89C51单片机中的使用及工作原理。在设计过程中,经过老师的指导,学会了独立画

18、流程图来分析程序,只有这样,才比较清楚地知道自己每一步要做什么,每一步要完成什么任务,而且在程序调试的过程中也容易查错。 6、附录:/*主要功能:正常走时、闹钟、秒表倒计时、正点报时、设置时间*/#include #define uchar unsigned char#define uint unsigned intuchar s,flag_t1,flag_t0,flag_int0,flag_int1,flag_alarm,flag_read,flag_timer;sbit beep=P37; /蜂鸣器sbit P30=P30; /时间+sbit P31=P31;/时间-uint time=0

19、,5,10,9,5,10,0,1;uint alarm=0,2,10,0,0,10,0,1;uint timer=0,1,10,0,0,10,0,0;uint time_tmp=1,1,10,3,3,10,3,3;unsigned char smg_du=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;/ 显示段码值0123456789-unsigned char smg_wei=0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0;/0,1,2,3,4,5,6,7;/分别对应相应的数码管点亮,即位码voi

20、d delay1ms(uchar x);/大约1ms,软件延时void smg_dis();/数码管显示函数void timeset() ;/时间设置函数void beep_alarm();/蜂鸣器部分void delay1ms(uchar x)uchar i,j; for (i=0; ix; i+)for (j=0; j120; j+)void to(void) interrupt 1/50ms*20次 一秒 用于时钟TH0=-50000/256;TL0=-50000%256;if(flag_t0!=20) flag_t0+;else if (flag_t0=20)flag_t0=0;s+;

21、time0=s;if(s=10)s=0;if(time0=10)time0=0; time1+; /时分秒进位if(time1=6)time1=0; time3+;if(time3=10)time3=0; time4+;if(time4=6)time4=0; time6+;if(time6=4)time6=0; time7+; if(time7=2)time7=0; void t1(void) interrupt 3/50ms*20次 一秒用于倒计时uchar t1_count=0;TH0=-50000/256;TL0=-50000%256;if(flag_t0!=20) flag_t1+;e

22、lse if (flag_t0=20)flag_t1=0;timer0-;if(timer0=-1)timer0=9; timer1-; /时分秒退位if(timer1=-1)timer1=5; timer3-;if(timer3=-1)timer3=9; timer4-;if(timer4=-1)timer4=5; timer6-;if(timer6=-1)timer6=0; timer6-;if(timer7=-1)timer7=2;timer7=3; void setint0(void) interrupt 0 /外部中断 用于设置数码管切换显示时钟、闹钟、倒计时 flag_int0+;

23、delay1ms(2);flag_int1=0;if(flag_int0=3) flag_int0=0; void setint1(void) interrupt 2 /设置时分秒位 flag_int1+;delay1ms(2); void smg_dis() /数码管显示uchar i;for(i=0;i8;i+) P2=smg_weii;if(flag_int0=0)P0=smg_dutimei; /显示时钟if(flag_int0=1)P0=smg_dutime_tmpi; /显示闹钟if(flag_int0=2)P0=smg_dutimeri; /显示倒计时 delay1ms(2);i

24、f(flag_int1=1)if(i!=0&i!=1)delay1ms(10);/设置为闪烁 if(flag_int1=2if(i!=3&i!=4)delay1ms(10); if(flag_int1=3)if(i!=6&i!=7)delay1ms(10);void timeset()/设置时间uchar i;for(i=0;i8;i+) if(flag_read=1&flag_int0=0)time_tmpi=timei; /时钟时间放入timetmpif(flag_int0=1)time_tmpi=alarmi; /闹钟时间放入timetmpif(flag_int0=2)time_tmpi

25、=timeri; /定时时间放入timetmp if(flag_int0=2&flag_int1!=0)TR1=0; /设置倒计时时,T1停止计时if(flag_int1=1) / 设置时间 秒 flag_read=0;if(P30=0)/ /按键+按下 时间+time_tmp0+; delay1ms(255);if(time_tmp0=10)time_tmp0=0; time_tmp1+; if(time_tmp1=6)time_tmp1=0; ; if(P31=0) /按键+按下 时间-time_tmp0-;delay1ms(255);if(time_tmp0=0)time_tmp0=9;

26、 time_tmp1-; if(time_tmp1=-1)time_tmp1=5; ; if(flag_int1=2) / 设置时间 分 flag_read=0;if(P30=0) time_tmp3+;delay1ms(255);if(time_tmp3=10)time_tmp3=0; time_tmp4+; if(time_tmp4=6)time_tmp4=0; ;if(P31=0)time_tmp3-;delay1ms(255);if(time_tmp3=0)time_tmp3=9; time_tmp4-;/时分秒进位if(time_tmp4=-1)time_tmp4=5; ; if(f

27、lag_int1=3) / 设置时间 时 flag_read=0;if(P30=0) /按键+按下 时间+time_tmp6+;delay1ms(255);if(time_tmp6=10)time_tmp6=0; time_tmp7+; if(time_tmp7=2&time_tmp6=4)time_tmp7=0;time_tmp6=0; ;if(P31=0)time_tmp6-;delay1ms(255);if(time_tmp6=-1&time_tmp7=0)time_tmp6=3; time_tmp7- ;if(time_tmp6=-1&time_tmp7=1)time_tmp6=9;

28、time_tmp7- ;if(time_tmp6=-1&time_tmp7=2)time_tmp6=9; time_tmp7- ;if(time_tmp7=-1)time_tmp7=2; for(i=0;i8;i+)if(flag_int0=2)timeri=time_tmpi;if(flag_int0=1)alarmi=time_tmpi;if(flag_int0=0)timei=time_tmpi; if(flag_int1=4) flag_int1=0;flag_read=1; TR0=1; TR1=1; void beep_alarm()/蜂鸣器部分uint i,x;beep=1;if

29、(alarm0=time0&alarm1=time1&alarm3=time3&alarm4=time4&alarm6=time6&alarm7=time7)flag_alarm=1; /flag_alarm为1时是 闹钟if(TR1=1&timer0=0&timer1=0&timer3=0&timer4=0&timer6=0&timer7=0)/&t1_count=t1_timer() flag_alarm=1; /定时器if(time0=8|time0=6)&time1=5&time3=9&time4=5)flag_alarm=20; /flag_alarm为20时是 短报时if(time

30、0=0&time1=0&time3=0&time4=0)flag_alarm=21; /flag_alarm为20时是 短报时if (flag_alarm=1)for(x=0;x3;x+) /闹钟大约六秒 响的时候显示会中断for(i=0;i6500;i+)delay1ms(1);beep=beep;TR1=0; if (flag_alarm=20) /两个短报时 00秒时di 响的时候显示会中断for(i=0;i5;i+)delay1ms(5);beep=beep; if (flag_alarm=21) / 00秒时di 响的时候显示会中断for(i=0;i100;i+)delay1ms(5

31、);beep=beep; flag_alarm=0; void main() flag_t0=0; /内部T0 循环20次 每次50ms标志flag_int0=0; /外部0 标志位初始化 表示当前显示状态flag_int1=0;/外部1 标志位初始化 表示当前待设置的位flag_read=1;/settime模块 表示是否将当前时间写入time_tmp数组TMOD=0X11; /T0 T1 方式一TH0=-50000/256;TL0=-50000%256;TH1=-50000/256;TL1=-50000%256;EA=1 ;ET0=1 ;ET1=1;TR0=1;EX0=1;IT0=1;/下降沿触发 INT0EX1=1;IT1=1;/下降沿触发while(1)if(flag_int0=0) /int0为1时设置时间 timeset(); smg_dis(); beep_alarm(); if(flag_int0=1) /int0标志等于2时,闹钟部分 timeset();smg_dis(); if(flag_int0=2) /int0标志等于3时,倒计时部分 timeset(); smg_dis(); beep_alarm();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号