ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:349.36KB ,
资源ID:8261437      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8261437.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(8051单片机电子时钟设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

8051单片机电子时钟设计.docx

1、8051单片机电子时钟设计 单片机原理及应用综合实训报告题目: 电子时钟的设计 院 别: 自动化学院 专 业: 电气工程及其自动化 1 姓 名: 笑嘻嘻 学 号: 2009104143036 指导教师: 祁伟 答辩日期: 2011年9月19日 电子时钟制作摘 要本实训借用实验板的MCS51单片机定时、中断功能完成电子时钟的定时工作,应用8051对单片机I/O口驱动发光二极管、LED进行电子时钟时、分、秒显示。应用8051P3口、8255B口完成时间的设定工作。利用P1口加入华彩设计,如发光二极管按键指示、时钟报时等。再根据电子时钟实际应用完成系统总体设计。,根据系统总体设计完成编程设计工作,最

2、后通电、软件调试、运行。关键词:电子时钟;8051; 8051P3;8255B目录1电子时钟的概述 12电子时钟的硬件电路设计 12.1选用单片机 22.2发光二极管8字数码管的显示 32.3单片机I/O口扩展 42.4独立式按键 53电子时钟软件设计部分 63.1程序流程图 63.2定时中断服务程序流程图 83.3扩展功能程序流程 84电子时钟实用说明 94心得体会 95附录 10程序代码 101电子时钟的概述电子时钟功用,能利用MCS51单片机定时、中断功能完成时间的定时工作。整个系统具有参数设定、时间运行、报时、查询当前年、月、日等功能。开机可显示HELLO-,按某个特定的按键后,时钟还

3、可以开始计时,还可以通过另一些键功能,完成分,时、日、月、年参数设定。参数设定完后,也可以通过一些键继续计时。电子时钟常显示的是当前的时间,年、月、日还可以通过按几个特定的键切换、查询, 6位LED显示查询的内容,如现在的年月日。注意事项:时钟计时时可进行时间查询,但不能更改参数,若要更改参数,必须先停止时钟运行。2电子时钟的硬件电路设计2.1选用单片机MCS51系统选用8051单片机,如图1所示。8051单片机内有4KROM、256字节RAM,程序存放在4KROM。8051单片机最小系统组成有:1)时钟电路:工作时钟;2)复位电路,如图2所示;3)RAM:数据存储4)ROM:程序存储5)I/

4、O接口:与外界交互 晶振电路如图3所示。图3 图2 图12.2发光二极管8字数码管的显示LED显示有静态显示和动态显示两种方式。动态显示接口电路简图如图4所示。将各位数码管的段并联接在一起,由P1口控制(字型口),每一个数码管的共阴极(共阳极)接到P2.0、P2.1作为位选信号。虽说要显示的字型码通过P1口同时送到了每一个数码管,但它们不会同时显示同一个字符,只有控制共阴极(共阳极)的位选信号有效时,对应的数码管才会显示相应字符。这种由字型口控制要显示字符的字形码,依此循环选通每位数码管的位选信号就得到了动态显示效果。它主要是利用人眼的视觉暂留特性及数码管得余光特性,看上去似乎是多位数码管同时

5、显示。是当显示位数较多时,节省硬件,接口电路简单,但显示占用CPU时间。静态显示占用CPU时间短,显示简单、稳定,但当显示位数较多时,占用接口资源多。动态显示接口电路较简单,但占用CPU时间,显示亮度 较静态显示差,一般说,显示位数较多时,采用动态或串并转换;显示位数较少时,采用静态显示方式。 图4静态显示接口电路如图5所示。选用共阴极LED,将共阴极点连接在一起接地,每一位的段选线与一个8位并行口相连,只要将要 显示的字符的字型码送至并行口锁存, 图5LED显示器上便立即显示出该字符,直到CPU送来一个新的字型码为止,由于静态显示每位数码管均有独立的段选码,耗电量大,硬件多。如要外接6个数码

6、管,则需要6个8位并行口。2.3单片机I/O口扩展当单片机构成系统时,常常I/O口不够用,此时可利用MCS51的扩展能力,根据需要扩展相应接口,如可编程接口芯片8255与MCS51单片机连接可扩展I/O;利用MCS-51单片机的 串行口扩展并行I/O接口。实验板原理图的显示部分就是利用串入/并出技术实现2位数码管的显示。2.4独立式按键 键盘是一组按钮式开关的集合,常采用软件来识别。键盘的操作步骤:识键。判断是否有键按下(键入),若有,则需进一步译键。 译键。在有键入的情况下,进一步识别是哪一个键,以便作进一步处理。键义分析。根据识别的结果,明确相应的键义。如果是数字键,应得出输出的数值;如果

7、是功能键,则应知道具体的操作要求。 键盘构成:独立联接式非编码键盘。 特点:每个键相互独立,各自接通一条输入数据线。键未按下时,相应的数据线处于高电平,即为“1”态。当某键按下时,该键所连之数据线接地,即为“0”态。独立联接式编码键盘。 特点:在键数较多时,可采用独立式编码键盘,由4线-16线编码电路进行编码。 矩阵联接式非编码。特点:先使一行线接地,然后检查列线。如果某条列线也是低电位,则可判别两线相交处的某号键已按下。假如在扫描时没有发现有列线为地电位,则说明此行中无键按下。那么可将下一行线接地,如此逐一扫描列线,直到查完最后一行为止。 实验板中键盘电路设计可根据需要组合成独立联接式非编码

8、键盘及矩阵联接式非编码,见图6所示。 图63电子时钟软件设计部分3.1程序流程图编写程序之前先绘制程序流程图,理清思路,使之能简明、直观指示程序流向,且很容易由此编写出具体的源程序。将程序以模块方式分割成具有相应功能的子程序。根据系统功能,合理安排主程序任务,中断服务程序任务。程序设计有两个分支:参数设定及时钟运行。静态参数设定时,定时器关闭,只完成参数“加一键”的设定工作。时钟运行时,启动定时器开始计时。编写程序时, 图7首先理清思路,即通过流程图确定算法。主程序框图 如图7所示。在主程序中,分别初始化了定时器0和外部中断0。定时器0的中断服务程序用于实现时钟运行时的秒加1及进位功能。外部中

9、断0的中断服务程序使r=1。因此,当开始运行程序时,r=0,数码管显示HELLO-;当P3.2按下时,进入外部中断0中断服务程序,使r=1,退出中断服务程序后,时钟开始运行;在时钟 运行过程中,如果分别按下K13、K14、K15可设置时间,查询年、月、日。3.2定时中断服务程序流程图定时中断服务程序流程图如图8所示。图8 图8图83.3扩展功能程序流程扩展功能程序流程如图9所示。图94电子时钟实用说明1、开机时,显示HELLO-。2、按下K16键,电子时钟开始运行,数码管显示时、分、秒。3、按下K13键,进入时间参数设置,此时可再次通过K13键进行年、月日、时分的切换,并通过K12、K14可分

10、别对年、月、日、时、分加1、减1,由此完成时间的设定。4、当数码管显示时分秒,可通过K14、K15查询年、月、日。4心得体会在本次实验中重新复习了单片机实验的内容,更加深了对程序和项目的训练。虽然开始的时候感觉比较,后来经过多天的努力和温习,终于可以把以前半懂不懂的知识比较完整的拼凑在一起。这次实验程序的编写和调试所花时间比较多,写报告的用的时间比较少。对于这次实验的不足之处还是需要更深刻的检讨,希望以后更加努力。5附录程序代码/*/程序名shizhong.C/功能描述:电子时钟 /硬件电路参看实验板/*/#include#include#define uchar unsigned char#

11、define uint unsigned int#define COM8255 XBYTE0xffff#define PA8255 XBYTE0Xfffc#define PB8255 XBYTE0Xfffd#define PC8255 XBYTE0Xfffe#define OSC_FREQ 12000000 /12Mhz#define C1ms (65536 - OSC_FREQ/(12000000/980) /1ms定时 sbit P1_4=P14; /位选控制sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;sbit P2_0=P20; /数码管段码控制

12、asbit P2_1=P21;sbit P2_2=P22;sbit P2_3=P23;sbit P2_4=P24;sbit P2_5=P25;sbit P2_6=P26;sbit P2_7=P27; /数码管段码控制 dpsbit P3_2=P32; /中断、返回计时sbit es=P24; /更新静态显示sbit P1_2=P12; /8255片选P1_2=0 sbit P1_1=P11; /8255片选P1_1=1 sbit P1_0=P10; /8255片选P1_0=0 uchar code hello=0x89,0x86,0xc7,0xc7,0xfc,0x02; /HELLO-ucha

13、r code number1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /动态显示0-9uchar code number2=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6; /静态显示0-9uchar code number3=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10; /动态显示0-9 dp点亮uint year=2011,month=9,day=3,hour=15,minute=35,second=25;uint x,y

14、,m,n,i=0,j=0,k=0,r=0;void Timer_1ms(uint _1ms); /延时1msvoid Set_Init_Timer0(); /定时器0初始化函数void Set_Init_Xint0(); /外部中断0初始化函数void Set_Init_8255(); /8255初始化程序void dis_hello(); /开机显示HELLO-void dis_year(); /显示年void dis_month();void dis_day();void dis_hour();void dis_minute();void dis_second();void undis_s

15、econd(); /不显示秒void set_timer(); /设置时间void dis_year2(); /在查询状态下显示年void dis_day2(); /在查询状态下显示日期void main() Set_Init_Xint0(); Set_Init_8255(); Set_Init_Timer0(); do if(r=0) dis_hello(); else EX0=0; /外部中断0 关中断 dis_hour(); dis_minute(); dis_second(); Set_Init_8255(); switch(PB8255) case 0xDF: set_timer()

16、; break; /PB=0xDF,K13键按下 切换到设置时间程序 case 0xBF: dis_day2(); break; /PB=0xBF,K14键按下 切换到显示日期程序 case 0x7F: dis_year2(); break; /PB=0x7F,K15键按下 切换到显示年的程序 while(1);void Timer_1ms(uint _1ms) /延时函数 TMOD =0x11; TR1 = 1; while (_1ms-) TH1 = C1ms/256; TL1 = C1ms%256; while (!TF1); TF1 = 0; TR1 = 0;void Set_Init

17、_Timer0() /定时器0初始化函数 TMOD=0x11; /定时器0,方式一 TH0=0x3C; TL0=0xAF; /装入初值15535 设成50ms定时器 ET0=1; TR0=1; EA=1;void Set_Init_Xint0() /外部中断0初始化函数 IT0=1; /外部中断0,边沿触发方式 EX0=1; /外部中断0 开中断 EX1=1; /打开总中断void dis_hello() /显示HELLO- P1=0x70; /位选 P2=hello0; /数码管显示H Timer_1ms(5); P1=0xb0; P2=hello1; Timer_1ms(5); P1=0x

18、d0; P2=hello2; Timer_1ms(5); P1=0xe0; P2=hello3; Timer_1ms(5); SCON=0x00; es=0; SBUF=hello4; while(!TI) TI=0; SBUF=hello5; while(!TI) TI=0; es=1; /静态显示更新/对year变量通过除法、取余运算得到各位的数值,并送到对应的数码管上void dis_year() x=year/100; y=x%10; /百位 x=x/10; /千位 m=year%100; n=m%10; /个位 m=m/10; /十位 P1=0x70; P2=number1x; Ti

19、mer_1ms(5); P1=0xb0; P2=number1y; Timer_1ms(5); P1=0xd0; P2=number1m; Timer_1ms(5); P1=0xe0; P2=number1n; Timer_1ms(5); undis_second(); /对month变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上void dis_month() x=month/10; y=month%10; P1=0x70; P2=number1x; Timer_1ms(5); P1=0xb0; P2=number1y; Timer_1ms(5);/对day变量通过除法、取

20、余运算得到十位、个位的数值,并送到对应的数码管上void dis_day() x=day/10; y=day%10; P1=0xd0; P2=number1x; Timer_1ms(5); P1=0xe0; P2=number1y; Timer_1ms(5); undis_second();/对hour变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上void dis_hour() x=hour/10; y=hour%10; P1=0x70; P2=number1x; Timer_1ms(5); P1=0xb0; P2=number3y; Timer_1ms(5);/对minut

21、e变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上void dis_minute() uint x,y; x=minute/10; y=minute%10; P1=0xd0; P2=number1x; Timer_1ms(5); P1=0xe0; P2=number1y; Timer_1ms(5);/对second变量通过除法、取余运算得到十位、个位的数值,并送到对应的数码管上void dis_second() x=second/10; y=second%10; SCON=0x00; es=0; SBUF=number2x; while(!TI) TI=0; SBUF=numb

22、er2y; while(!TI) TI=0; es=1;/将0x00送到显示秒的数码管上,让这两个数码管不显示void undis_second() SCON=0x00; es=0; SBUF=0x00; while(!TI) TI=0; SBUF=0x00; while(!TI) TI=0; es=1;/时间设置函数,K12对变量加1 K13实现变量切换(使用goto语句) K14对变量减1 void set_timer() TR0=0; /关闭定时器0 do for(i=0;i=5;i+) dis_year(); undis_second(); Timer_1ms(5); Set_Init

23、_8255( ); switch(PB8255) case 0xEF: year+; break; /PB=0xEF,K12键按下 year加1 case 0xBF: year-; break; /PB=0xEF,K14键按下 year减1 case 0xDF: goto month; break; /PB=0xDF,K13键按下切换到设置月程序 while(1);month: do if(month=13) /判断进位 month=1; for(i=0;i=5;i+) dis_month(); dis_day(); undis_second(); Set_Init_8255( ); swit

24、ch(PB8255) case 0xEF: month+; break; /PB=0xEF,K12键按下 month加1 case 0xBF: month-; break; /PB=0xEF,K14键按下 month减1 case 0xDF: goto day; break; /PB=0xDF,K13键按下 切换到设置日程序 while(1);day: do if(day=31) /判断进位 day=1; for(i=0;i=5;i+) dis_month(); dis_day(); undis_second(); Set_Init_8255( ); switch(PB8255) case 0

25、xEF: day+; break; /PB=0xEF,K12键按下 day加1 case 0xBF: day-; break; /PB=0xEF,K14键按下 day减1 case 0xDF: goto hour; break; /PB=0xDF,K13键按下,切换到设置时程序 while(1);hour: do if(hour=24) /判断进位 hour=0; for(i=0;i=5;i+) dis_hour(); dis_minute(); dis_second(); Set_Init_8255( ); switch(PB8255) case 0xEF: hour+; break; /P

26、B=0xEF,K12键按下 hour加1 case 0xBF: hour-; break; /PB=0xEF,K14键按下 hour减1 case 0xDF: goto minute; break; /PB=0xDF,K13键按下 切换到设置分程序 while(1);minute: do if(minute=60) /判断进位 minute=0; for(i=0;i=5;i+) dis_hour(); dis_minute(); dis_second(); Set_Init_8255( ); switch(PB8255) case 0xEF: minute+; break; /PB=0xEF,K12键按下 minute加1 case 0xBF: minute-; break;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1