版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录目录1第1章 概述11.1实验原理1第2章 设计思路及框图12.1设计思路12.2设计框图2第3章系统的硬件设计23.1主控制部件23.2显示模块33.3晶振模块33.4按键模块33.5驱动模块4第4章电路设计原理图44.1电路原理图4第5章 程序设计55.1程序流程图55.2源程序6第6章系统的验证及调试266.1日期设置显示测试266.2秒表测试266.3倒计时测试27第7章 总结28第8章 参考文献28第1章 概述1.1实验原理单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。单片机的
2、应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。 单片机有两种基本结构形式:一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。 本课题讨论的方波发生器的核心是目前应用极为广泛的 51系列单片机。 利用AT89C51单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初
3、值为0,每中断一次中断计数初值加1,当加到100时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。为了将时间在6位LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。第2章 设计思路及框图2.1设计思路针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片 机是一款低功耗,高性能CMOS8位单
4、片机,第一,熟悉AT89S51单片机,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二,设计硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三,画图部分:设计好电路后进行画图。第四,软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,实现想要
5、的功能。2.2设计框图此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用8个共阴极数码显示管、按键模块、晶振模块。显示管分别显示:小时、分钟和秒,通过动态扫描进行显示。电路的总体设计框架如下:单片机模块晶振模块 图1 LCD显示模块 时钟模块 驱动模块按键模块 第3章系统的硬件设计3.1主控制部件 89C51是一个8位单片机,片内ROM全部采用FLASH ROM技术,晶振时钟为12MHz。89C51是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。第31引脚需要接高电位使单片机选用内部程序存储器;第40脚为电源端
6、VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1F高频滤波电容。硬件原理图如图2所示: 图23.2显示模块 方案一:静态显示。静态显示,即当显示器显示某一字符时,相应的发光二极管恒定导通或截至。该方式每一位都需要一个8位输出口控制。静态显示时较小电流能获得较高的亮度,且字符不闪烁。但因当所需显示的位数较多时,静态显示所需的I/O口数较大,造成资源的浪费。 方案二:动态显示。动态显示,即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,人的视觉暂留功能才可以察觉不到字符闪烁。
7、显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。调整参数可实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。从节省单片机I/O口和降低能耗角度出发,本电子表显示选择采用方案二。3.3晶振模块单片机芯片可使用内部时钟电路和外部时钟电路两种方式产生电路所需的时钟脉冲,内部时钟电路实现可用石英晶体和微调电容外接即可达到,外部时钟电路实现需要一个外部脉冲源引入脉冲信号以保证个单片机之间时钟信号的同步。从硬件实现难易角度考虑,内部时钟电路的实现比外部时钟电路的实现更简易。既本数字电子钟设计所需的时钟源采用内部时钟电路实现。3.4按键模块本数字电子钟设计所需按键用于进行显示时间的调整与设置扩
8、展的小键盘。单片机芯片4个I/O口可与按键直接相连,通过编程,单片机芯片即可控制按键接口电平的高低,即按键的开与关,以达到用按键进行显示时间的调整与设置扩展的小键盘的设计要求,本电路采用P1口与按键相连。3.5驱动模块从实物制作简易程度与驱动数码管段码能力角度出发,本数字电子钟设计采用数码管段码与AT89C51P0口相连,单片机AT89C51的P2口控制数码管的片选信号,通过编程,单片机芯片即可控制段码电平的高低的方式实现数码管段码控制。第4章电路设计原理图4.1电路原理图 图3第5章 程序设计5.1程序流程图 在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。在主程序中,对
9、不同的按键进行扫描,实现秒表,时间调整。系统总体流程图如图4所示。 开始 T0中断入口 通过查表方式显示数据 位选数值=0 秒计数加1 秒计数=1000 秒计数=0 Seconds+1 中断返回 图4系统子程序流程图如图5所示: 图55.2源程序#include <reg52.h>#include "ds1302.h"#include "lcd1602.h"#include "key.h"/sbit wela=P27;/sbit dula=P26;uchar tab_date14="2012-11-16 TUE&
10、quot;/表示年月日星期uchar tab_time8="00:00:00"/表示时分秒uchar tab_time18="00:00:00"/表示时分秒uchar tiao;uchar msecond;uchar hour,min,sec,key,sition;/uchar kong=" "uchar flag;/时间秒表选择标志/-/ 数据转换/-void trans() tab_date2=tab_13026/10+'0' /年十位 tab_date3=tab_13026%10+'0' /年个位
11、 tab_date5=tab_13024/10+'0' /月十位 tab_date6=tab_13024%10+'0' /月个位 tab_date8=tab_13023/10+'0' /日十位 tab_date9=tab_13023%10+'0' /日个位 tab_time0=tab_13022/10+'0' /小时十位 tab_time1=tab_13022%10+'0' /小时个位 tab_time3=tab_13021/10+'0' /分十位 tab_time4=tab_130
12、21%10+'0' /分个位 tab_time6=tab_13020/10+'0' /秒十位 tab_time7=tab_13020%10+'0' /秒个位/-/ 星期显示/-void week() uchar i; if(tab_13025=1) i=7; else i=tab_13025-1; /*实时时钟里的值是6,但是2008/08/08是星期五,所以减1, Proteus的问题? */ switch(i) case 1: tab_date11='M'tab_date12='O'tab_date13=
13、9;N' break; case 2: tab_date11='T'tab_date12='U'tab_date13='E' break; case 3: tab_date11='W'tab_date12='E'tab_date13='D' break; case 4: tab_date11='T'tab_date12='H'tab_date13='U' break; case 5: tab_date11='F'tab_date
14、12='R'tab_date13='I' break; case 6: tab_date11='S'tab_date12='T'tab_date13='A' break; case 7: tab_date11='S'tab_date12='U'tab_date13='N' break; default: ; break; /其它情况 void getweek(uchar week1,uchar t)uchar i; if(week1=1) i=7; else i=we
15、ek1-1; /*实时时钟里的值是6,但是2008/08/08是星期五,所以减1, Proteus的问题? */ switch(i) case 1: t0='M't1='O't2='N' break; case 2: t0='T't1='U't2='E' break; case 3: t0='W't1='E't2='D' break; case 4: t0='T't1='H't2='U' break; c
16、ase 5: t0='F't1='R't2='I' break; case 6: t0='S't1='T't2='A' break; case 7: t0='S't1='U't2='N' break; default: ; break; /其它情况 void cls(uchar i)/表示打印出i个空格/lcd_wcom(addr);/重新设定显示地址为0xc4,即下排第5位for(;i>0;i-)lcd_wdat(' ');lc
17、ddelay(1);/-/ lcd液晶屏显示/-void display(uchar a,uchar b)uchar i,j;lcd_wcom(0x80+0x01);/显示地址设为80H(即00H,)上排第一位for(i=0;i<14;i+)lcd_wdat(ai);/将日期显示在lcd1602上lcddelay(1);lcd_wcom(0x80+0x44);/重新设定显示地址为0xc4,即下排第5位for(j=0;j<8;j+)/将tab_time中的数据依次写入1602显示 lcd_wdat(bj);lcddelay(1);/-/ 显示倒计时/-void djsdsp(ucha
18、r hour,uchar min,uchar sec)uchar j,key,t;/uchar t="00:00:00"/TR1=1;while(1)t=tab_13020;ds1302();if(t!=tab_13020)msecond=1;key=Getkey();if(key=KEY_BK)return;sec=sec-msecond;msecond=0;if(sec=255)sec=59;min-;if(min=255)min=59;hour-;if(hour=255)while(1)key=Getkey();if(key=KEY_BK)return;tab_tim
19、e0=hour/10+'0'tab_time1=hour%10+'0'tab_time3=min/10+'0'tab_time4=min%10+'0'tab_time6=sec/10+'0'tab_time7=sec%10+'0'lcd_wcom(0x80+0x44);/重新设定显示地址为0xc4,即下排第5位for(j=0;j<8;j+)/将tab_time中的数据依次写入1602显示 lcd_wdat(tab_timej);lcddelay(1);/-/ 设置倒计时/-void djish
20、i()uchar ch="Countdown:"uchar t="00:00:00"uchar str="00"uchar i;sition=3;hour=min=sec=0;lcd_wcom(0x01);/清屏lcd_wcom(0x80+0x01);/显示地址设为80H(即00H,)上排第一位for(i=0;i<10;i+)lcd_wdat(chi);/将"Countdown:"显示在lcd1602上lcddelay(1);lcd_wcom(0x80+0x44);/显示地址设为80H(即00H,)上排第一位
21、for(i=0;i<8;i+)lcd_wdat(ti);/将时间显示在lcd1602上lcddelay(1);while(1)key=Getkey();switch(key)case KEY_MU:return;case KEY_UP:switch(sition)case 1:hour+;if(hour>=24) hour=0;break;case 2:min+;if(min>=60) min=0;break;case 3:sec+;if(sec>=60) sec=0;break;default:break;break;case KEY_DN:switch(sition
22、)case 1:hour-;if(hour=255) hour=59;break;case 2:min-;if(min=255) min=59;break;case 3:sec-;if(sec=255) sec=59;break;default:break;break;case KEY_L:lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);sition-;if(sition=0) sition=3;break;case KEY_R:lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1)
23、;sition+;if(sition=4) sition=1;break;case KEY_OK:djsdsp(hour,min,sec);lcd_wcom(0x01);return;case KEY_BK:lcd_wcom(0x01);return;default:break;/lcd_wcom(0x01);/清屏if(sition=1)str0=hour/10|+'0'str1=hour%10+'0'lcd_wcom(0x80+0x44);if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcdd
24、elay(1);elsecls(2);lcd_wcom(0x80+0x44);else if(2=sition)str0=min/10+'0'str1=min%10+'0'lcd_wcom(0x80+0x47);if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x47);elsestr0=sec/10+'0'str1=sec%10+'0'lcd_wcom(0x80+0x4a);if(tiao&l
25、t;10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x4a);/-/ 设置日期/-void setdate()uchar i,j,yearh,yearl,month,date,week;uchar str="00"uchar ch="set date:"sition=5;lcd_wcom(0x01);/清屏lcd_wcom(0x80+0x01);/显示地址设为80H(即00H,)上排第一位for(i=0;i<9;i+)lcd_wda
26、t(chi);/将"set date:"显示在lcd1602上lcddelay(1);lcd_wcom(0x80+0x41);/重新设定显示地址为0xc4,即下排第5位for(j=0;j<14;j+)/将tab_date中的数据依次写入1602显示 lcd_wdat(tab_datej);lcddelay(1);yearh=(tab_date0-'0')*10+(tab_date1-'0');yearl=tab_13026;month=tab_13024;date=tab_13023;week=tab_13025;while(1)key
27、=Getkey();switch(key)/case KEY_MU:djishi();return;case KEY_UP:switch(sition)case 1:yearh+;if(yearh>=100) yearh=0;break;case 2:yearl+;if(yearl>=100) yearl=0;break;case 3:month+;if(month>=13) month=0;break;case 4: date+; if(yearh*100+yearl)%4=0&&(yearh*100+yearl)%100!=0)|(yearh*100+ye
28、arl)%400=0) /如果是闰年if(month=2&&date>29)date=1;elseif(month=2&&date>28)date=1;if(month=4|month=6|month=9|month=11)if(date>30)date=1;elseif(date>31)date=1; break;case 5:week+;if(week=8)week=1;break;default:break;break;case KEY_DN:switch(sition)case 1:yearh-;if(yearh=255) yea
29、rh=99;break;case 2:yearl-;if(yearl=255) yearl=99;break;case 3:month-;if(month=0) month=12;break;case 4: date-; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) /有31天的月份if(date=0)date=31;else if(month!=2)if(date=0)date=30;else if(yearh*100+yearl)%4=0&&(yearh*100+yearl)%100!=0)|(y
30、earh*100+yearl)%400=0)/闰年中的2月if(date=0)date=29;else if(date=0)date=28; break;case 5:week-;if(week=0) week=7;break;default:break;break;case KEY_L:if(sition!=5)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elselcd_wdat(ch0);lcddelay(1);lcd_wdat(ch1);lcddelay(1);lcd_wdat(ch2);sition-;if(sition=
31、0) sition=5;break;case KEY_R:if(sition!=5)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elselcd_wdat(ch0);lcddelay(1);lcd_wdat(ch1);lcddelay(1);lcd_wdat(ch2);sition+;if(sition=6) sition=1;break;case KEY_OK:tab_date0=yearh/10+'0'tab_date1=yearh%10+'0'tab1_13026=yearl;tab1_1302
32、4=month;tab1_13023=date;tab1_13025=week;ds1302();tab1_13020=tab_13020;tab1_13021=tab_13021;tab1_13022=tab_13022;ds1302_init();lcd_wcom(0x01);/清屏return;case KEY_BK: lcd_wcom(0x01);return;default:break;/lcd_wcom(0x80+0x4a);if(sition=1)lcd_wcom(0x80+0x41);str0=yearh/10|+'0'str1=yearh%10+'0&
33、#39;if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x41);else if(2=sition)lcd_wcom(0x80+0x43);str0=yearl/10+'0'str1=yearl%10+'0'if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x43);else if(3=s
34、ition)lcd_wcom(0x80+0x46);str0=month/10+'0'str1=month%10+'0'if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x46);else if(4=sition)lcd_wcom(0x80+0x49);str0=date/10+'0'str1=date%10+'0'if(tiao<10)lcd_wdat(str0);lcddelay(1)
35、;lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x49);elsegetweek(week,ch);lcd_wcom(0x80+0x4c);if(tiao<10)lcd_wdat(ch0);lcddelay(1);lcd_wdat(ch1);lcddelay(1);lcd_wdat(ch2);elsecls(3);lcd_wcom(0x80+0x4c);/-/ 设置时间/-void settime()uchar i,j;/uchar sition; /闪烁位置uchar ch="set time:"uchar
36、 str="00"/TR0=1;/lcd不执行中断中的在变时间sition=3; /3调秒,2调分,1调时lcd_wcom(0x01);/清屏lcd_wcom(0x80+0x44);/重新设定显示地址为0xc4,即下排第5位for(j=0;j<8;j+)/将tab_time中的数据依次写入1602显示 lcd_wdat(tab_timej);lcddelay(1);lcd_wcom(0x80+0x01);/显示地址设为80H(即00H,)上排第一位for(i=0;i<9;i+)lcd_wdat(chi);/将"set time:"显示在lcd
37、1602上lcddelay(1);hour=tab_13022;min=tab_13021;sec=tab_13020;/获取当前时间,在此基础上进行调时while(1)/steval();key=Getkey();switch(key)case KEY_MU:setdate();return;case KEY_UP:switch(sition)case 1:hour+;if(hour>=24) hour=0;break;case 2:min+;if(min>=60) min=0;break;case 3:sec+;if(sec>=60) sec=0;break;defaul
38、t:break;break;case KEY_DN:switch(sition)case 1:hour-;if(hour=255) hour=23;break;case 2:min-;if(min=255) min=59;break;case 3:sec-;if(sec=255) sec=59;break;default:break;break;case KEY_L:lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);sition-;if(sition=0) sition=3;break;case KEY_R:lcd_wdat(str0)
39、;lcddelay(1);lcd_wdat(str1);lcddelay(1);sition+;if(sition=4) sition=1;break;case KEY_OK:tab1_13020=sec;tab1_13021=min;tab1_13022=hour;tab1_13023=tab_13023;tab1_13024=tab_13024;tab1_13025=tab_13025;tab1_13026=tab_13026;ds1302_init();lcd_wcom(0x01);return;case KEY_BK:lcd_wcom(0x01);return;default:brea
40、k;/lcd_wcom(0x01);/清屏if(sition=1)str0=hour/10|+'0'str1=hour%10+'0'lcd_wcom(0x80+0x44);if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x44);else if(2=sition)str0=min/10+'0'str1=min%10+'0'lcd_wcom(0x80+0x47);if(tiao<10)lc
41、d_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x47);elsestr0=sec/10+'0'str1=sec%10+'0'lcd_wcom(0x80+0x4a);if(tiao<10)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x4a); void miaobiao()uchar j;uchar i;sec=min=0;lcd_init();lcd_wcom(0x01);/清屏lcd_wcom(0x80+0x44);/重新设定显示地址为0xc4,即下排第5位for(j=0;j<8;j+)/将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论