![8051单片机电子时钟设计(共24页)_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-11/28/d1ccc0ae-347c-4437-8989-553d1db6bdd8/d1ccc0ae-347c-4437-8989-553d1db6bdd81.gif)
![8051单片机电子时钟设计(共24页)_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-11/28/d1ccc0ae-347c-4437-8989-553d1db6bdd8/d1ccc0ae-347c-4437-8989-553d1db6bdd82.gif)
![8051单片机电子时钟设计(共24页)_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-11/28/d1ccc0ae-347c-4437-8989-553d1db6bdd8/d1ccc0ae-347c-4437-8989-553d1db6bdd83.gif)
![8051单片机电子时钟设计(共24页)_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-11/28/d1ccc0ae-347c-4437-8989-553d1db6bdd8/d1ccc0ae-347c-4437-8989-553d1db6bdd84.gif)
![8051单片机电子时钟设计(共24页)_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-11/28/d1ccc0ae-347c-4437-8989-553d1db6bdd8/d1ccc0ae-347c-4437-8989-553d1db6bdd85.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 单片机原理及应用综合实训报告题目: 电子时钟的设计 院 别: 自动化学院 专 业: 电气工程及其自动化 1 姓 名: 笑嘻嘻 学 号: 36 指导教师: 祁伟 答辩日期: 2011年9月19日 专心-专注-专业电子时钟制作摘 要本实训借用实验板的MCS51单片机定时、中断功能完成电子时钟的定时工作,应用8051对单片机I/O口驱动发光二极管、LED进行电子时钟时、分、秒显示。应用8051P3口、8255B口完成时间的设定工作。利用P1口加入华彩设计,如发光二极管按键指示、时钟报时等。再根据电子时钟实际应用完成系统总体设计。,根据系统总体设计完成编程设计工作,最后通电
2、、软件调试、运行。关键词:电子时钟;8051; 8051P3;8255B目录1电子时钟的概述电子时钟功用,能利用MCS51单片机定时、中断功能完成时间的定时工作。整个系统具有参数设定、时间运行、报时、查询当前年、月、日等功能。开机可显示HELLO-,按某个特定的按键后,时钟还可以开始计时,还可以通过另一些键功能,完成分,时、日、月、年参数设定。参数设定完后,也可以通过一些键继续计时。电子时钟常显示的是当前的时间,年、月、日还可以通过按几个特定的键切换、查询, 6位LED显示查询的内容,如现在的年月日。注意事项:时钟计时时可进行时间查询,但不能更改参数,若要更改参数,必须先停止时钟运行。2电子时
3、钟的硬件电路设计2.1选用单片机MCS51系统选用8051单片机,如图1所示。8051单片机内有4KROM、256字节RAM,程序存放在4KROM。8051单片机最小系统组成有:1)时钟电路:工作时钟;2)复位电路,如图2所示;3)RAM:数据存储4)ROM:程序存储5)I/O接口:与外界交互 晶振电路如图3所示。图3 图2 图12.2发光二极管8字数码管的显示LED显示有静态显示和动态显示两种方式。动态显示接口电路简图如图4所示。将各位数码管的段并联接在一起,由P1口控制(字型口),每一个数码管的共阴极(共阳极)接到P2.0、P2.1作为位选信号。虽说要显示的字型码通过P1口同时送到了每一个
4、数码管,但它们不会同时显示同一个字符,只有控制共阴极(共阳极)的位选信号有效时,对应的数码管才会显示相应字符。这种由字型口控制要显示字符的字形码,依此循环选通每位数码管的位选信号就得到了动态显示效果。它主要是利用人眼的视觉暂留特性及数码管得余光特性,看上去似乎是多位数码管同时显示。是当显示位数较多时,节省硬件,接口电路简单,但显示占用CPU时间。静态显示占用CPU时间短,显示简单、稳定,但当显示位数较多时,占用接口资源多。动态显示接口电路较简单,但占用CPU时间,显示亮度 较静态显示差,一般说,显示位数较多时,采用动态或串并转换;显示位数较少时,采用静态显示方式。 图4静态显示接口电路如图5所
5、示。选用共阴极LED,将共阴极点连接在一起接地,每一位的段选线与一个8位并行口相连,只要将要 显示的字符的字型码送至并行口锁存, 图5LED显示器上便立即显示出该字符,直到CPU送来一个新的字型码为止,由于静态显示每位数码管均有独立的段选码,耗电量大,硬件多。如要外接6个数码管,则需要6个8位并行口。2.3单片机I/O口扩展当单片机构成系统时,常常I/O口不够用,此时可利用MCS51的扩展能力,根据需要扩展相应接口,如可编程接口芯片8255与MCS51单片机连接可扩展I/O;利用MCS-51单片机的 串行口扩展并行I/O接口。实验板原理图的显示部分就是利用串入/并出技术实现2位数码管的显示。2
6、.4独立式按键 键盘是一组按钮式开关的集合,常采用软件来识别。键盘的操作步骤:识键。判断是否有键按下(键入),若有,则需进一步译键。译键。在有键入的情况下,进一步识别是哪一个键,以便作进一步处理。键义分析。根据识别的结果,明确相应的键义。如果是数字键,应得出输出的数值;如果是功能键,则应知道具体的操作要求。 键盘构成:独立联接式非编码键盘。 特点:每个键相互独立,各自接通一条输入数据线。键未按下时,相应的数据线处于高电平,即为“1”态。当某键按下时,该键所连之数据线接地,即为“0”态。独立联接式编码键盘。 特点:在键数较多时,可采用独立式编码键盘,由4线-16线编码电路进行编码。 矩阵联接式非
7、编码。特点:先使一行线接地,然后检查列线。如果某条列线也是低电位,则可判别两线相交处的某号键已按下。假如在扫描时没有发现有列线为地电位,则说明此行中无键按下。那么可将下一行线接地,如此逐一扫描列线,直到查完最后一行为止。 实验板中键盘电路设计可根据需要组合成独立联接式非编码键盘及矩阵联接式非编码,见图6所示。 图63电子时钟软件设计部分3.1程序流程图编写程序之前先绘制程序流程图,理清思路,使之能简明、直观指示程序流向,且很容易由此编写出具体的源程序。将程序以模块方式分割成具有相应功能的子程序。根据系统功能,合理安排主程序任务,中断服务程序任务。图1-6主程序框图开始各功能的初始化有按键否?显
8、示HELLO-YNP3.2键吗?时钟运行K12键吗?K13键吗?Y参数设定YNN日查询显示K14键吗?月查询显示K15键吗?年查询显示YYYNNN程序设计有两个分支:参数设定及时钟运行。静态参数设定时,定时器关闭,只完成参数“加一键”的设定工作。时钟运行时,启动定时器开始计时。编写程序时, 图7首先理清思路,即通过流程图确定算法。主程序框图 如图7所示。在主程序中,分别初始化了定时器0和外部中断0。定时器0的中断服务程序用于实现时钟运进入中断图1-7中断服务程序框图定时初值重置秒到否?NYN秒加1分到否?分加1时到否?时加1日到否?日加1月到否?月加1年到否?年加1Y中断返回NNNNYYYY行
9、时的秒加1及进位功能。外部中断0的中断服务程序使r=1。因此,当开始运行程序时,r=0,数码管显示HELLO-;当P3.2按下时,进入外部中断0中断服务程序,使r=1,退出中断服务程序后,时钟开始运行;在时钟 运行过程中,如果分别按下K13、K14、K15可设置时间,查询年、月、日。3.2定时中断服务程序流程图定时中断服务程序流程图如图8所示。图8 图8图83.3扩展功能程序流程扩展功能程序流程如图9所示。年查询显示月查询显示日查询显示K12或k13?k12或k13?K12或k15?加或减参数加或减参数加或减参数时钟运行P3.2按下图94电子时钟实用说明1、开机时,显示HELLO-。2、按下K
10、16键,电子时钟开始运行,数码管显示时、分、秒。3、按下K13键,进入时间参数设置,此时可再次通过K13键进行年、月日、时分的切换,并通过K12、K14可分别对年、月、日、时、分加1、减1,由此完成时间的设定。4、当数码管显示时分秒,可通过K14、K15查询年、月、日。4心得体会在本次实验中重新复习了单片机实验的内容,更加深了对程序和项目的训练。虽然开始的时候感觉比较,后来经过多天的努力和温习,终于可以把以前半懂不懂的知识比较完整的拼凑在一起。这次实验程序的编写和调试所花时间比较多,写报告的用的时间比较少。对于这次实验的不足之处还是需要更深刻的检讨,希望以后更加努力。5附录程序代码/*/程序名
11、shizhong.C/功能描述:电子时钟 /硬件电路参看实验板/*/#include<reg51.h>#include<ABSACC.H>#define uchar unsigned char#define uint unsigned int#define COM8255 XBYTE0xffff#define PA8255 XBYTE0Xfffc#define PB8255 XBYTE0Xfffd#define PC8255 XBYTE0Xfffe#define OSC_FREQ /12Mhz#define C1ms (65536 - OSC_FREQ/(/980) /
12、1ms定时 sbit P1_4=P14;/位选控制sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;sbit P2_0=P20; /数码管段码控制 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=0sbit P1_1=P11;/8255片选P1_1=1sb
13、it P1_0=P10;/8255片选P1_0=0uchar code hello=0x89,0x86,0xc7,0xc7,0xfc,0x02; /HELLO-uchar 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,
14、0x10; /动态显示0-9 dp点亮uint year=2011,month=9,day=3,hour=15,minute=35,second=25;uint x,y,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
15、();void dis_day();void dis_hour();void dis_minute();void dis_second();void undis_second(); /不显示秒void set_timer(); /设置时间void dis_year2(); /在查询状态下显示年void dis_day2(); /在查询状态下显示日期void main()Set_Init_Xint0();Set_Init_8255();Set_Init_Timer0();doif(r=0)dis_hello();else EX0=0;/外部中断0 关中断dis_hour();dis_minute
16、();dis_second();Set_Init_8255();switch(PB8255) case 0xDF: set_timer();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/25
17、6; TL1 = C1ms%256; while (!TF1); TF1 = 0; TR1 = 0;void Set_Init_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; /数码管显示HTim
18、er_1ms(5);P1=0xb0;P2=hello1;Timer_1ms(5); P1=0xd0;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;
19、/十位P1=0x70;P2=number1x;Timer_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);/对minute变量通过除法、取余运
21、算得到十位、个位的数值,并送到对应的数码管上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=number2y;while(!TI)TI=0;es=1;/
22、将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; /关闭定时器0dofor(i=0;i<=5;i+)dis_year();undis_second();Timer_1ms(5);Set_Init_8255( );switch(PB8255) case 0xEF: year
23、+;break; /PB=0xEF,K12键按下 year加1case 0xBF: year-;break; /PB=0xEF,K14键按下 year减1case 0xDF: goto month; break; /PB=0xDF,K13键按下切换到设置月程序 while(1);month:doif(month=13) /判断进位month=1;for(i=0;i<=5;i+)dis_month();dis_day();undis_second();Set_Init_8255( );switch(PB8255) case 0xEF: month+;break; /PB=0xEF,K12键
24、按下 month加1case 0xBF: month-;break; /PB=0xEF,K14键按下 month减1case 0xDF: goto day;break; /PB=0xDF,K13键按下 切换到设置日程序 while(1);day:doif(day=31) /判断进位day=1;for(i=0;i<=5;i+)dis_month();dis_day();undis_second();Set_Init_8255( );switch(PB8255) case 0xEF: day+;break; /PB=0xEF,K12键按下 day加1case 0xBF: day-;break
25、; /PB=0xEF,K14键按下 day减1case 0xDF: goto hour;break; /PB=0xDF,K13键按下,切换到设置时程序 while(1);hour:doif(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; /PB=0xEF,K12键按下 hour加1case 0xBF: hour-;break; /PB=0xEF,K14键按下 hour减1case 0xDF: goto minute;break; /PB=0xDF,K13键按下 切换到设置分程序 while(1);minute:doif(minute=60) /判断进位minute=0;for(i=0;i<=5;i+)dis_ho
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025用工安全合同范本
- 2025务工合同劳务合同
- 中介承租转让合同范例
- 农药代加工合同范例
- 二手三轮车交易合同范例
- 个人社保缴费合同范例
- 勘察设计单位合同范例
- 北京汽车租赁合同范本
- 付款方式违约规定合同范例
- 加油船出租合同范例
- 浙南名校联盟2025届高一数学第二学期期末达标检测试题含解析
- 左卡尼汀在减轻高原反应中的应用
- 10以内加减法练习题1000题直接打印版
- 青海省西宁市选调生考试(行政职业能力测验)综合能力测试题汇编
- DZ∕T 0227-2010 地质岩心钻探规程(正式版)
- 夏枯草口服液相关项目实施方案
- 《学前儿童家庭教育》课程标准(含课程思政)
- DB42-T 2204-2024 湖沼湿地温室气体通量监测技术规范
- 急性会厌炎的护理
- 四年级口算题大全(全)
- 20以内加减法口算题(10000道)(A4直接打印-每页100题)
评论
0/150
提交评论