时间日历显示单片机实验

上传人:cn****1 文档编号:430993229 上传时间:2022-12-20 格式:DOC 页数:15 大小:107.24KB
返回 下载 相关 举报
时间日历显示单片机实验_第1页
第1页 / 共15页
时间日历显示单片机实验_第2页
第2页 / 共15页
时间日历显示单片机实验_第3页
第3页 / 共15页
时间日历显示单片机实验_第4页
第4页 / 共15页
时间日历显示单片机实验_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《时间日历显示单片机实验》由会员分享,可在线阅读,更多相关《时间日历显示单片机实验(15页珍藏版)》请在金锄头文库上搜索。

1、机电0902 李刚 学号38 时间日程显示设计程序实验一 设计目标:万年历实现以下三个功能:(1)具有年、月、日、星期、时、分、秒等功能;(2)具备年、月、日、星期、时、分、秒校准功能,具备自动调节闰年的功能;(3)具有与即时时间同步的功能。本电路是以STC89C51单片机为控制核心, 时钟芯片采用DS1302, 具有掉电自动保存功能。可自动对秒、分、时、日、周、月、年进行计数, 显示模块采用1602显示屏,它内置192种字符,可显示32个符号或数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。其工作电压为5v。 一个典型的单片机最小系统一般由时钟电路、复位电路、电源指示灯和外部扩展接口等部分

2、组成。 1时钟电路模块的设计DS1302内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。图中VCC1为后备电源,VCC2为主电源。DS1302由VCC1或VCC2两者中的较大者供电。所以在主电源关闭的情况下,也能保持时钟的连续运行。X1和X2是振荡源,外接32.768KHz晶振用来为芯片提供计时脉冲。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。DS1302的硬件接线图如图2所示:图2时钟芯片DS1302的工作原理:(1) DS1302的控制字节:DS1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS13

3、02中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(2) 数据输入输出(I/O):在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。(3) DS1302的寄存器:DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。“CH”是时钟暂停标志位,当该位为1时,时钟振

4、荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,“WP”必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。2 独立式键盘设计独立式键盘每个键单独占用一根I/O口线。键盘的工作方式可分为编程控制方式和中断控制方式。CPU在一个工作周期内,利用完成其他任务的空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应的键处理程序。这种方式为编程扫描方式。由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使CPU经常处于工作状态, 在进行本次设计中,只涉及

5、到了选择、加、减、确定四个功能。因此采用独立式键盘。 3 显示模块的设计本设计中 对时间、温度进行显示,液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单。1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。LCD1602引脚功能:1VSS一般接地2VDD接电源(+5V)

6、3V0液晶显示器对比度调整端。4RSRS为寄存器选择。5R/WR/W为读写信号线。6EE(或EN)端为使能(enable)端,下降沿使能。1602主要管脚介绍:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生鬼影使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。RW为读写信号线端,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址;当RS为高电平RW 为低电平时可以写入数据。E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。将L1602的R

7、S端和P2.0,R/W端和P2.1, E 端和P2.2相连,当RS=0时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。显示模块电路图如图3所示: 功能仿真 图10 电路图图11 键盘调节图12 调节键盘后主程序/ 名称:用DS1302与1602LCD设计的可调式电子日历与时钟/ 说明:本例会自动调节合法日期时间,对于星期的调节会在/ 调整年月日时自动完成,闰年问题也会自动判断。/-#include #include

8、#define uchar unsigned char#define uint unsigned intsbit SDA=P10; /DS1302数据线sbit CLK=P11; /DSB1302时钟线sbit RST=P12; /DS1302复位线sbit RS=P20; /LCD寄存器选择sbit RW=P21; /LCD读/写控制sbit EN=P22; /LCD启用sbit K1=P34; /选择sbit K2=P35; /加sbit K3=P36; /减sbit K4=P37; /确定uchar tCount=0;/一年中每个月的天数,二月的天数由年份决定uchar MonthsDa

9、ys=0,31,0,31,30,31,30,31,31,30,31,30,31;/周日,周一到周六0,1-6 读取DS1302时分别是1-7uchar *WEEK=SUN,MON,TUS,WEN,THU,FRI,SAT;/LCD显示缓冲uchar LCD_DSY_BUFFER1=DATE 00-00-00 ;uchar LCD_DSY_BUFFER2=TIME 00:00:00 ;uchar DateTime7; /所读取的日期时间char Adjust_Index=-1; /当前调节的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)uchar Change_Flag=-MHDM-Y

10、; /(分,时,日,月,年)(不调节秒周)/延时,向DS1302写、读一字节以及从DS1302指定位置度、写数据的程序/延时-void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/向DS1302写入一个字节void Write_A_Byte_TO_DS1302(uchar x)uchar i;for(i=0;i=1;/从DA1302读取一字节-uchar Get_A_Byte_FROM_DS1302()uchar i,b,t;for(i=0;i=1;t=SDA;b|=t7;CLK=1;CLK=0;/BCD码转换return b/16*1

11、0+b%16;/从DS1302指定的位置读数据-uchar Read_Data(uchar addr)uchar dat;RST=0;CLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat=Get_A_Byte_FROM_DS1302();CLK=1;RST=0;return dat;/向DS1302某地址写入数据-void Write_DS1302(uchar addr,uchar dat)CLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);CLK=0;RST=0;/-/-

12、设置时间-void SET_DS1302()uchar i;Write_DS1302(0x8E,0x00);/写控制字,取消写保护for(i=1;i7;i+) /分时日月年依次写入/分的起始地址10000010(0x82),后面续依次是时,日,月,周,年,写入地址每次递增2 Write_DS1302(0x80+ 2*i,(DateTimei/104)|(DateTimei%10); Write_DS1302(0x8E,0x80);/加保护/-/读取当前日期时间/-void GetTime()uchar i;for(i=0;i7;i+)DateTimei=Read_Data(0x81+2*i);

13、/- /1602LCD的若干显示控制代码。/uchar Read_LCD_State() 读LCD状态uchar Read_LCD_State()uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN=0;DelayMS(1);return state;/void LCD_Busy_Wait() 忙等待void LCD_Busy_Wait()while(Read_LCD_State()&0x80)=0x80);DelayMS(5);/void Write_LCD_Data(uchar dat) 向LCD写数据void Write_LCD_Data(ucha

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号