付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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
3、计时中断程序每隔0.01s 中断一次并当作一个计数,设定定时 1 秒的中断计数初值为 0,每中断一次中断计数初值加 1,当加到 100 时,则表示 1s 到了,秒变量加 1,同理再判断是否 1min 钟到了,再判断是否 1h 到了。为了将时间在 6 位 LED数码管上显示, 可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现 LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。第 2 章 设计思路及框图2.1
4、设计思路针对要实现的功能, 采用 AT89S51单片机进行设计, AT89S51 单片 机是一款低功耗,高性能 CMOS8位单片机,第一,熟悉 AT89S51单片机,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二,设计硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三,画图部分:设计好电路后进行画图。第四,软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进
5、行仿真, 仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,实现想要的功能。.2.2 设计框图此次设计主要是应用单片机来设计电子时钟, 硬件部分主要分以下电路模块: 显示电路用 8 个共阴极数码显示管、按键模块、晶振模块。显示管分别显示:小时、分钟和秒,通过动态扫描进行显示。电路的总体设计框架如下:图 1晶振模块LCD显示模块单时钟模块片机模块驱动模块按键模块第 3 章系统的硬件设计3.1 主控制部件89C51是一个 8 位单片机,片内ROM全部采用 FLASH ROM技术,晶振时钟为12MHz。89C51是标准的 40 引脚双列直
6、插式集成电路芯片,有4 个八位的并行双向I/O 端口,分别记作 P0、P1、 P2、P3。第 31 引脚需要接高电位使单片机选用内部程序存储器;第 40 脚为电源端 VCC,接+5V电源,第 20 引脚为接地端 VSS,通常在 VCC和 VSS引脚之间接 0.1 F 高频滤波电容。硬件原理图如图 2 所示:.图 23.2 显示模块方案一:静态显示。静态显示,即当显示器显示某一字符时,相应的发光二极管恒定导通或截至。 该方式每一位都需要一个 8 位输出口控制。 静态显示时较小电流能获得较高的亮度,且字符不闪烁。但因当所需显示的位数较多时,静态显示所需的 I/O 口数较大,造成资源的浪费。方案二:
7、动态显示。动态显示,即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。 利用人的视觉暂留功能可以看到整个显示, 但必须保证扫描速度足够快,人的视觉暂留功能才可以察觉不到字符闪烁。显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。调整参数可实现较高稳定度的显示。动态显示节省了 I/O 口,降低了能耗。从节省单片机 I/O 口和降低能耗角度出发,本电子表显示选择采用方案二。3.3 晶振模块单片机芯片可使用内部时钟电路和外部时钟电路两种方式产生电路所需的时钟脉冲,内部时钟电路实现可用石英晶体和微调电容外接即可达到, 外部时钟电路实现需要一个外部脉冲源引入脉冲信号以保证个单
8、片机之间时钟信号的同步。从硬件实现难易角度考虑,内部时钟电路的实现比外部时钟电路的实现更简易。 既本数字电子钟设计所需的时钟源采用内部时钟电路实现。3.4 按键模块本数字电子钟设计所需按键用于进行显示时间的调整与设置扩展的小键盘。 单片机芯片 4 个 I/O 口可与按键直接相连,通过编程,单片机芯片即可控制按键接口电平的高低,.即按键的开与关, 以达到用按键进行显示时间的调整与设置扩展的小键盘的设计要求,本电路采用 P1 口与按键相连。3.5 驱动模块从实物制作简易程度与驱动数码管段码能力角度出发, 本数字电子钟设计采用数码管段码与 AT89C51P0口相连,单片机 AT89C51的 P2 口
9、控制数码管的片选信号,通过编程,单片机芯片即可控制段码电平的高低的方式实现数码管段码控制。第 4 章电路设计原理图4.1 电路原理图图 3.第 5章程序设计5.1 程序流程图在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。在主程序中,对不同的按键进行扫描,实现秒表,时间调整。系统总体流程图如图 4 所示。开始T0中断入口通过查表方式显示数据位选数值 =0秒计数加 1秒计数 =1000秒计数 =0Seconds+1中断返回图 4系统子程序流程图如图5 所示:图 5.5.2 源程序#include <reg52.h>#include "ds1302.h&q
10、uot;#include "lcd1602.h"#include "key.h"/sbit wela=P27;/sbit dula=P26;uchar tab_date14="2012-11-16 TUE"/表示年月日星期uchar tab_time8="00:00:00"/表示时分秒uchar tab_time18="00:00:00"/表示时分秒uchar tiao;uchar msecond;uchar hour,min,sec,key,sition;/uchar kong="&
11、quot;uchar flag;/ 时间秒表选择标志/-/数据转换/-void trans()tab_date2=tab_13026/10+'0' /年十位tab_date3=tab_13026%10+'0' /年个位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
12、/10+'0' /小时十位tab_time1=tab_13022%10+'0' /小时个位tab_time3=tab_13021/10+'0' /分十位tab_time4=tab_13021%10+'0' /分个位tab_time6=tab_13020/10+'0' /秒十位tab_time7=tab_13020%10+'0' /秒个位/-/星期显示/-void week().uchar i;if(tab_13025=1)i=7;elsei=tab_13025-1;/*实时时钟里的值是6,但是 20
13、08/08/08 是星期五,所以减1,Proteus的问题?*/switch(i)case 1: tab_date11='M'tab_date12='O'tab_date13='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_date
14、11='T'tab_date12='H'tab_date13='U' break;case 5: tab_date11='F'tab_date12='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'
15、; break;default: ; break; /其它情况void getweek(uchar week1,uchar t)uchar i;if(week1=1)i=7;elsei=week1-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=&
16、#39;E't2='D' break;case 4: t0='T't1='H't2='U' break;case 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)/
17、 表示打印出 i 个空格/lcd_wcom(addr);/ 重新设定显示地址为0xc4, 即下排第 5 位.for(;i>0;i-)lcd_wdat(' ');lcddelay(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, 即
18、下排第 5 位for(j=0;j<8;j+)/ 将 tab_time 中的数据依次写入1602 显示lcd_wdat(bj);lcddelay(1);/-/显示倒计时/-void djsdsp(uchar 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;msecon
19、d=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_time0=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); /重新设
20、定显示地址为0xc4, 即下排第 5 位for(j=0;j<8;j+)/ 将 tab_time中的数据依次写入1602 显示lcd_wdat(tab_timej);lcddelay(1);/-/设置倒计时/-void djishi().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,)上排第一位
21、for(i=0;i<10;i+)lcd_wdat(chi);/ 将"Countdown:" 显示在 lcd1602 上lcddelay(1);lcd_wcom(0x80+0x44);/ 显示地址设为 80H(即 00H,)上排第一位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
22、=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)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);lcddel
23、ay(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);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(sitio
24、n=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)lcd_wdat(str0);lcddelay(1);lcd
25、_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 setdate().uchar i,j,yearh,yearl,month,date,week;uchar str=&quo
26、t;00"uchar ch="set date:"sition=5;lcd_wcom(0x01);/ 清屏lcd_wcom(0x80+0x01);/ 显示地址设为 80H(即 00H,)上排第一位for(i=0;i<9;i+)lcd_wdat(chi);/ 将"set date:"显示在 lcd1602 上lcddelay(1);lcd_wcom(0x80+0x41); /重新设定显示地址为0xc4, 即下排第 5 位for(j=0;j<14;j+)/ 将 tab_date 中的数据依次写入1602 显示lcd_wdat(tab_d
27、atej);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=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
28、) 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+yearl) %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)dat
29、e=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) yearh=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|
30、month=10|month=12)/ 有 31 天的月份if(date=0)date=31;else if(month!=2)if(date=0)date=30;.elseif(yearh*100+yearl)%4=0&&(yearh*100+yearl)%100!=0)|(yearh*100+yearl)%400 =0)/ 闰年中的 2 月if(date=0)date=29;elseif(date=0)date=28;break;case 5:week-;if(week=0) week=7;break;default:break;break;case KEY_L:if(si
31、tion!=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=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(
32、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_13024=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);/ 清屏retur
33、n;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' 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);str
34、0=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=sition)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)
35、;else.cls(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);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);lc
36、d_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 str="00"/TR0=1;/lcd不执行中断中的在变时间sition=3;/3调秒 ,2 调分, 1 调时lcd_wcom(0x01);/ 清屏lcd_wcom(0x80+0x44); /重新设定显示地址为0xc4, 即下排第 5 位for(j=0;j<
37、;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:"显示在 lcd1602 上lcddelay(1);hour=tab_13022;min=tab_13021;sec=tab_13020;/ 获取当前时间,在此基础上进行调时while(1)/ steval();key=Getkey();switch(key)case
38、 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;default: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
39、 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);sition+;if(sition=4)sition=1;break;case KEY_OK:tab1_13020=sec;tab1_13021=min;tab1_
40、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:break;./lcd_wcom(0x01);/ 清屏if(sition=1)str0=hour/10|+'0'str1=hour%10+'0'lcd_wcom(0x80+0x44);if(tiao<10)lcd_w
41、dat(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)lcd_wdat(str0);lcddelay(1);lcd_wdat(str1);lcddelay(1);elsecls(2);lcd_wcom(0x80+0x47);elsestr0=sec/10+'0'str1=sec%10
42、+'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+)/ 将 tab_time 中的数据依次写入1602 显示lcd_wdat(tab_time1j);lcddelay(1);/ TR1=1;while(1)if(BK=0)TR1=0;return;if(MB=0)if(i<2)TR1=TR1;while(MB=0);i+;.if(i=3)i=0;lcd_wcom(0x01);/ 清屏lcd_wcom(0x80+0x44); /重新设定显示地址为0xc4, 即下排第 5 位for(j=0;j<8;j+)/ 将 tab_time中的数据依次写入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年南京交通职业技术学院单招职业倾向性考试题库及答案详解(名校卷)
- 2025山东东营市东营区财金控股集团有限公司招聘考察人员笔试参考题库附带答案详解
- 2025届深圳市投资控股有限公司校园招聘笔试参考题库附带答案详解
- 2025届传音控股“海东青”未来领军人才招聘正式启动笔试参考题库附带答案详解
- 2025安徽淮北广播电视报社有限责任公司公开招聘工作人员2人笔试参考题库附带答案详解
- 2025安徽六安市舒城万佛湖水源保护和旅游管理委员会委属国有企业招聘12人笔试参考题库附带答案详解
- 2025太平财产保险有限公司保山中心支公司招聘20人(云南)笔试参考题库附带答案详解
- 2025国家电投福建公司招聘1人(总经理)笔试参考题库附带答案详解
- 2026年内蒙古锡林郭勒盟单招职业倾向性测试题库附答案详解(a卷)
- 2026年华北理工大学轻工学院单招职业技能考试题库及完整答案详解一套
- 基本公共卫生服务项目工作制度
- 2025年国控私募基金笔试及答案
- (二统)大理州2026届高中毕业生高三第二次复习统一检测语文试卷(含答案及解析)
- 佛学介绍教学课件
- 泸州白酒行业分析报告
- 电泳培训教学课件
- 携程市场营销面试问题集
- 天津市部分区2024-2025学年八年级上学期期末调研物理试题(含答案)
- 化工清洁生产课件
- 慢性肾病治疗新进展研究
- 2024年嘉兴市遴选公务员考试真题汇编附答案解析(夺冠)
评论
0/150
提交评论