单片机课程设计报告万年历_第1页
单片机课程设计报告万年历_第2页
单片机课程设计报告万年历_第3页
单片机课程设计报告万年历_第4页
单片机课程设计报告万年历_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录一、摘要2二、设计任务.4三、总体方案设计与论证4 1、液晶显示模块4 2、实时时间计算模块53、设置模块6四、总体方案组成框图7五、系统硬件设计81、lcd显示模块82、实时时间计算模块123、设置模块22六、系统软件设计23七、系统硬件电路设计24八、系统硬件仿真运行情况图261、显示欢迎界面262、显示实时时间263、显示当前温度274、时间设置275、最高报警温度设置286、闹钟时间设置287、超温298、闹钟时间到29附录一:实物图30附录二:pcb图32附录三:源程序代码33附录四:参考文献62摘 要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、

2、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括四大功能:实时显示年、月、日、时、分、秒;人为的校正年、月、日、时、分、秒;第一次开机显示2000 01 01 12:00;掉电信息不丢失。本设计采用的是at89s52单片机,该单片机采用的mcu51内核,因此具有很好的兼容性,内部带有8kb的rom,能够存储大量的程序,最突出特点是具有isp在系统烧写功能,使得烧写程序更加方便。计时芯片采用dallas公司的涓细充电时钟芯片ds1302,该芯片

3、通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。 通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。设计任务1、设计任务:利用单片机、时钟芯片ds1302、1602液晶等实现日期、时间、的显示即一个简单的万年历。2、设计要求(1)通过ds1302能够准确的计时,时间可调并在

4、液晶上显示出来。(2)第一次开机显示 2000 01 01 12:00。 (3)掉电信息不丢失。总体方案论证与设计本系统以at89s52单片机为控制核心,通过与ds1302通信获取实时时间,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。因此本设计可分为一下模块:显示模块、实时时间计算模块、设置模块(时间设置模块、最高温度设置模块、下面对各。个模块逐一进行论证分析:1、 液晶显示模块方案(1):数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显

5、示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。方案(2):1602液晶也叫1602字符型液晶 它是一种专门用来显示字母、数字、符号等的点阵型液晶模块 它有若干个5x7或者5x11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:清屏、左移右移、光标显示。而且1602显示的字符在下一条指令为到来之

6、前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。综合比较上述两种方案,应采用1602液晶组成本设计的显示模块。2、 实时时间计算模块方案(1):at89s52单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便。方案(2):ds1302是美国dallas公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态ram,采用spi三线接口与cpu进

7、行通信,并可采用突发方式一次传送多个字节的时钟信号和ram数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5v。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。综合上述两种方案,宜采用方案(2)实现实时计时功能。3、设置模块因设置模块只需编写相应的程序外加相应的按键即可实现,实现方法较简单,在此不再论述。总体方案组成框图报警模块(蜂鸣器)显示模块(1602液晶)at89s52时间计算模块d

8、s1302实时温度采集模块(ds18b20)设置模块(独立按键)系统硬件设计1、lcd显示模块设计(1)1602液晶功耗较小可直接与单片机接口相接,电源直接与电源电路相接,使用单片机的p0口和p2口与1602进行通信。(2)1602相应功能特性介绍n +5v电压,对比度可调n 内含复位电路n 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能n 有80字节显示数据存储器ddramn 内建有160个5x7点阵的字型的字符发生器cgromn 8个可由用户自定义的5x7的字符发生器cgram(3)1602引脚介绍(4)1602液晶11条指令介绍1.清屏指令 功能: 清除液晶显示器,即

9、将ddram的内容全部填入“空白”的字符码20h; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(ac)的值设为0;2.光标归位指令 功能: 把光标撤回到显示器的左上方; 把地址计数器(ac)的值设置为0; 保持ddram的内容不变 ;3.输入模式设置指令 功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示: 位名设置 i/d0=写入新数据后光标左移 1=写入新数据后光标右移 s0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移1个字 4.显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的

10、情况如下: 位名设置 d0=显示功能关 1=显示功能开 c0=无光标 1=有光标 b0=光标不闪烁 1=光标闪烁 5.设定显示屏或光标移动方向指令功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: s/cr/l设定情况 0 0光标左移1格,且ac值减1 0 1光标右移1格,且ac值加1 1 0显示器上字符全部左移一格,但光标不动 1 1显示器上字符全部右移一格,但光标不动 6.功能设定指令 (非常重要的指令)功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名设置 dl 0=数据总线为4位 1=数据总线为8位 n 0=显示1行 1=显示2行 f0=57点阵/每字符1=5

11、10点阵/每字符 7.设定cgram地址指令 功能:设定下一个要存入数据的cgram的地址。 8.设定ddram地址指令 功能:设定下一个要存入数据的cgram的地址。 9.读取忙信号或ac地址指令 功能: 读取忙碌信号bf的内容,bf=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令; 当bf=0时,液晶显示器可以接收单片机送来的数据或指令; 读取地址计数器(ac)的内容。 10.数据写入ddram或cgram指令 功能: 将字符码写入ddram,以使液晶显示屏显示出相对应的字符; 将用户自己设计的图形存入cgram。 11.从cgram或ddram读出数据的指令 功能:读取ddram

12、或cgram中的内容。 基本操作时序: 读状态 输入:rs=l,rw=h,e=h输出:db0db7=状态字 写指令 输入:rs=l,rw=l,e=下降沿脉冲,db0db7=指令码 输出:无 读数据 输入:rs=h,rw=h,e=h输出:db0db7=数据 写数据 输入:rs=h,rw=l,e=下降沿脉冲,db0db7=数据 输出:无 (5)、1602液晶与单片机接口电路2、时间计算模块设计ds1302通过三根口线实现与单片机的通信,因ds1302功耗很小,即使电源掉电后通过3v的纽扣电池仍能维持ds1302精确走时。(1) ds1302特性介绍ds1302是美国dallas公司推出的一种高性能

13、、低功耗的实时时钟芯片,附加31字节静态ram,采用spi三线接口与cpu进行通信,并可采用突发方式一次传送多个字节的时钟信号和ram数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5v。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。(2) ds1302引脚介绍 各引脚的功能为:8 、vcc1:备用电池端;1、vcc2:5v电源。当vcc2vcc1+0.2v时,由vcc2向ds1302供电,当vcc2 vcc1时,由vcc1向ds1302供电。7、 sclk:串行时

14、钟,输入; 6、i/o:数据输入输出口;5、ce/rst:复位脚2 3、x1、x2 是外接晶振脚 (32.768khz的晶振)4、地(gnd)(4)ds1302有关日历、时间的寄存器 寄存器的说明如下:1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(ch)。当初始上电时该位置为1,时钟振荡器停止,ds1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行。2、小时寄存器(85h、84h)的位7用于定义ds1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示pm。在24小时模式时,位5是第二个10小时位3

15、、控制寄存器(8fh、8eh)的位7是写保护位(wp),其它7位均置为0。在对任何的时钟和ram的写操作之前,wp位必须为0。当wp位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态wp是1,这时是不能改写上面任何一个时间寄存器的,只有首先将wp改写为0,才能进行其它寄存器的写操作。 (5)ds1302控制字介绍控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到ds1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1(a4a0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。读数据

16、:读数据时在紧跟8位的控制字指令后的下一个sclk脉冲的下降沿,读出ds1302的数据,读出的数据是从最低位到最高位。写数据:控制字总是从最低位开始输出。在控制字指令输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入也是从最低位(0位)开始。位0(最低有效位):为1表示进行读操作。 如为0,表示要进行写操作,控制字后 sclk 下降沿 读数据 sclk上升沿写数据(6)ds1302单字节读写时序介绍ds1302的数据读写是通过i/o串行进行的。当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉ds1302是读还是写操作,是对ram还是对clok

17、寄存器操作,以及操作的址。第二个字节就是要读或写的数据了。我们先看单字节写:在进行操作之前先得将ce(也可说是rst)置高电平,然后单片机将控制字的位0放到i/o上,当i/o的数据稳定后,将sclk置高电平,ds1302检测到sclk的上升沿后就将i/o上的数据读取,然后单片机将sclk置为低电平,再将控制字的位1放到i/o上,如此反复,将一个字节控制字的8个位传给ds1302。接下来就是传一个字节的数据给ds1302,当传完数据后,单片机将ce置为低电平,操作结束。单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,sclk还在高电平时,ds

18、1302就将数据放到i/o上,单片机将sclk置为低电平后数据锁存,单机机就可以读取i/o上的数据。如此反复,将一个字节的数据读入单片机。读与写操作的不同就在于,写操作是在sclk低电平时单片机将数据放到io上,当sclk上升沿时,ds1302读取。而读操作是在sclk高电平时ds1302放数据到io上,将sclk置为低电平后,单片机就可从io上读取数据。(7)ds1302操作指令介绍操作说明:1 首先要通过8eh将写保护去掉,将日期,时间的初值写时各个寄存器。2 然后就可以对80h、82h、84h、86h、88h、8ah、8ch进行初值的写入。同时也通过秒寄存器将位7的ch值改成0,这样ds

19、1302就开始走时运了。3 将写保护寄存器再写为80h,防止误改写寄存器的值。4 不断读取80h8ch的值,将它们格式化后显示到1602lcd液晶上(8)ds1302与单片机接口电路5、设置模块设置模块采用四个按键与p30、p31、p32相接组成独立按键,接口电路如下;系统软件设计软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。因本程序涉及的模块较多,所以程序编写也采用模块化设计,c语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用c51编写。程序框图如下: 设置时间判断是否有按键按下时间、日期、没有按键按下开机初始化显示欢迎界面从ds1302读取信

20、息1602液晶显示相关信息 有 系统硬件电路设计本设计硬件电路图如下系统硬件proteus仿真原理图系统硬件仿真运行情况图显示欢迎界面显示实时时间显示当前温度时间设置最高报警温度设置闹钟时间设置超 温闹钟时间到附录一:实物图附录二:pcb图附录三:源程序代码主文件:#include #include #include #include 1602.h sbit p30=p30; sbit p31=p31; sbit p32=p32; void readpin(); void setdate(uchar a);void main() init();delayms(15);showstring(0,

21、timenum); showstring(1,test1);while(1) if(p32=0)delayms(50);if(p32=0) while(1)if(p31=0)delayms(50);if(p31=0);set_rtc(); read_rtc();rtc_display();readpin();void readpin()uchar n=0;if(p30=0)delayms(500);if(p30=0)while(1)if(p30=0)delayms(500);if(p30=0)break;if(p31=0)delayms(50);if(p31=0)n+;if(n6)n=0;if

22、(n=0)writecomment(0x83);if(p32=0)delayms(100);if(p32=0)setdate(0);if(n=1)writecomment(0x86);if(p32=0)delayms(100);if(p32=0)setdate(1);if(n=2)writecomment(0x89);if(p32=0)delayms(100);if(p32=0)setdate(2);if(n=3)writecomment(0x8d);if(p32=0)delayms(100);if(p32=0)setdate(3);if(n=4)writecomment(0xc7);if(p

23、32=0)delayms(100);if(p32=0)setdate(4);if(n=5)writecomment(0xca);if(p32=0)delayms(100);if(p32=0)setdate(5);if(n=6)writecomment(0xcd);if(p32=0)delayms(100);if(p32=0)setdate(6);void setdate(uchar a)uchar n1=0,n2=0,n=0;while(1)if(p30=0)delayms(500);if(p30=0)break;if(p32=0)delayms(50);if(p32=0)n2+;if(n29

24、)n2=0;n1+;if(n19)n1=0;n=n1*10+n2;if(a=0) /nianwritecomment(0x83);led_display(n2);writecomment(0x82);led_display(n1);rtc_set(0,n);if(a=1) /yueif(n12)n1=0;n2=0;n=0;writecomment(0x86);led_display(n2);writecomment(0x85);led_display(n1);rtc_set(1,n);if(a=2) /riif(n31)n1=0;n2=0;n=0;writecomment(0x89);led_

25、display(n2);writecomment(0x88);led_display(n1);rtc_set(2,n);if(a=3) /zhouif(n7)n1=0;n2=0;n=0;writecomment(0x8d);led_display(n2);writecomment(0x8c);led_display(n1);rtc_set(3,n);if(a=4) /shiif(n24)n1=0;n2=0;n=0;writecomment(0xc7);led_display(n2);writecomment(0xc6);led_display(n1);rtc_set(4,n);if(a=5)

26、/fenif(n59)n1=0;n2=0;n=0;writecomment(0xca);led_display(n2);writecomment(0xc9);led_display(n1);rtc_set(5,n);if(a=6)if(n59)n1=0;n2=0;n=0;writecomment(0xcd);led_display(n2);writecomment(0xcc);led_display(n1);rtc_set(6,n);1602.h文件#define uchar unsigned char#define uint unsigned intsbit rs = p24; /pin4s

27、bit rw = p25; /pin5sbit e = p26; /pin6sbit sck=p36;sbit sda=p34;sbit rst=p35; / ds1302复位unsigned char l_tmpdate7=0,0,12,1,1,3,0;/秒分时日月周年00-01-01 12:00:00unsigned char l_tmpdisplay15;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_a

28、ddress7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; uchar code timenum16=2000-01-01 01 ;uchar code test116=time: 12-00-00 ;void write_ds1302_byte(unsigned char temp); void write_ds1302( unsigned char address,unsigned char dat );unsigned char read_ds1302 ( unsigned char address ); void led_display(uchar a);v

29、oid read_rtc(void);/read rtc void set_rtc(void); /set rtc void delayus(uint us) while(us-);void delayms(uint ms) uint m; m=ms*300; delayus(m); void writecomment(uchar c) delayms(5); e=0; rs=0; rw=0; delayus(10); e=1; p0=c; e=0;void init() delayms(15); writecomment(0x38);/四位总线 双行显示 writecomment(0x38)

30、; writecomment(0x38); writecomment(0x38); writecomment(0x06);/光标右移 writecomment(0x0e);/整体显示 光标开 writecomment(0x10); writecomment(0x01);/清显示void writedater(uchar d) delayms(5); e=0; rs=1; rw=0; delayus(10); e=1; p0=d; e=0; rs=0; void showchar(uchar pos,uchar c) uchar p; if(pos=0x10) p=pos+0xb0; else

31、p=pos+0x80; writecomment(p); writedater(c);void showstring (uchar line,char *ptr) uchar l,i; l=line4; for (i=0;i16;i+) showchar(l+,*(ptr+i);/循环显示16个字符 void write_ds1302_byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 sck=1; /*/void write_ds1302( unsigned char address,unsigned char dat

32、) rst=0;_nop_(); sck=0;_nop_(); rst=1; _nop_(); /启动 write_ds1302_byte(address);/发送地址 write_ds1302_byte(dat);/发送数据 rst=0; /恢复/*/unsigned char read_ds1302 ( unsigned char address ) unsigned char i,temp=0x00; rst=0;_nop_(); sck=0;_nop_(); rst=1;_nop_(); write_ds1302_byte(address); for (i=0;i=1;/右移一位 sc

33、k=1; rst=0;_nop_();/以下为ds1302复位的稳定时间 rst=0;sck=0;_nop_();sck=1;_nop_();sda=0;_nop_();sda=1;_nop_();return (temp);/返回/*/void read_rtc(void)/读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i+)/分7次读取 秒分时日月周年 l_tmpdatei=read_ds1302(*p); p+; /*/void set_rtc(void)/设定 日历unsigned char i,*p,tm

34、p;for(i=0;i7;i+) /bcd处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; write_ds1302(0x8e,0x00); p=write_rtc_address;/传地址 for(i=0;i7;i+)/7次写入 秒分时日月周年 write_ds1302(*p,l_tmpdatei); p+; write_ds1302(0x8e,0x80); void rtc_display()uchar a;l_tmpdisplay0=l_tmpdate6/16; /nianl_tmpdis

35、play1=l_tmpdate6&0x0f;l_tmpdisplay2=l_tmpdate4/16;/yuel_tmpdisplay3=l_tmpdate4&0x0f;l_tmpdisplay4=l_tmpdate3/16;l_tmpdisplay5=l_tmpdate3&0x0f; /ril_tmpdisplay6=l_tmpdate2/16;/shi/数据的转换,bcd码变十进制l_tmpdisplay7=l_tmpdate2&0x0f; l_tmpdisplay8=l_tmpdate1/16; /fenl_tmpdisplay9=l_tmpdate1&0x0f;l_tmpdisplay1

36、0=l_tmpdate0/16; /miaol_tmpdisplay11=l_tmpdate0&0x0f;l_tmpdisplay12=l_tmpdate5/16; /zhoul_tmpdisplay13=l_tmpdate5&0x0f;writecomment(0x82);a=l_tmpdisplay0;led_display(a);a=l_tmpdisplay1;led_display(a);writecomment(0x85);a=l_tmpdisplay2;led_display(a);a=l_tmpdisplay3;led_display(a);writecomment(0x88);a=l_tmpdisplay4;led_display(a);a=l_tmpdisplay5;led_display(a);writecomment(0xc6);a=l_tmpdisplay6;led_display(a);a=l_tmpdisplay7;led_display(a);writecomment(0xc9);a=l_tmpdisplay8;led_display(a);a=l_tmpdisplay9;led_display(a);w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论