DS1302与液晶1602简单时钟_第1页
DS1302与液晶1602简单时钟_第2页
DS1302与液晶1602简单时钟_第3页
DS1302与液晶1602简单时钟_第4页
DS1302与液晶1602简单时钟_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机原理实验考试报告题 目:DS1302和1602时钟 姓 名:学 号:班 级:专 业:电子信息工程指导老师:提交时间:DS1302和1602时钟*(*学院 电子信息工程 *班 *)摘 要:关键词:DS1302 ,液晶1602,89C51。1. 引言我们在日常生活中常常用到时钟来记录时间,有时候还不能准确的记录下时间,这就要用到芯片DS1302了。时间还远远不够,因为人性化的设计自然是要清楚的显示年、月、日、星期、时间。而在此用到的DS1302非常好的与时间进行同步,并且在掉电时不会对时间有影响,较理的考虑到了人们的思维模式,从而简单的控制了时钟,结合了常理的理论。2. 原理DS1302引脚

2、X1 X2 32.768KHz 晶振管脚GND 地CE 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚各引脚的功能为:Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。DS1302控制字:控制字的最高有效位(

3、位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。DS1302时序:如图,所示CE 输入驱动高启动所有的数据传输。CE 输入有两个功能。首先,CE 打开控制逻辑,

4、允许访问的移位寄存器的地址/命令序列。其次,CE 提供了一个终止单字节或多字节数据传输方法。一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE 为低,所有的I/ O 引脚变为高阻抗状态,数据传输终止。对于数据输入:开始的8 个SCLK 周期,输入写命令字节,数据字节在后8 个SCLK 周期的上升沿输入。数据输入位0 开始。对于数据输出:开始的8 个SCLK 周期,输入一个读命令字节,数据字节在后8 个SCLK 周期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入(Note that the

5、first data bit to be transmitted occurs onthe first falling edge after the last bit of the command byte iswritten. ),命令字节的最后一位被写入。当CE 仍为高时。如果还有额外的SCLK 周期,DS1302 将重新发送数据字节,这使DS1302 具有连续突发读取的能力。DS1302驱动程序分析:开始-设置CE为高-在上升沿传输地址字-读取或写入相应地址的数字-设置CE为低-结束。108.2.1 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分

6、为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:图10-54 1602LCD尺寸图1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5

7、数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表10-13:引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电

8、平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。10823 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据

9、存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表10-14:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,

10、低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。与HD4478

11、0相兼容的芯片时序表如下:读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无表10-15:基本操作时序表读写操作时序如图10-55和10-56所示:图10-55 读操作时序图10-56 写操作时序10824 1602LCD的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模

12、块在哪里显示字符,图10-57是1602的内部显示地址。图10-57 1602LCD内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如

13、图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”图10-58 字符代码与图形对应图10825 1602LCD的一般初始化(复位)过程延时15mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令

14、0CH:显示开及光标设置液晶1602驱动时序:开始-LCD初始化-延时-设置第一行显示位置-显示第一行内容-设置第二行显示位置-显示第二行内容3. 电路实际电路:4. 程序#include< reg51.h >sbit key0=P30;/功能键sbit key1=P31;/增大键sbit key2=P32;/减小键sbit RST=P33;sbit SCLK=P34;sbit SDA=P35;sbit rs=P20;sbit rw=P21;sbit en=P17;#define DS1302_SECOND_WRITE 0x80#define DS1302_MINUTE_WRITE

15、 0x82#define DS1302_HOUR_WRITE 0x84#define DS1302_DAY_WRITE 0x86#define DS1302_MON_WRITE0x88#define DS1302_YEAR_WRITE0x8c#define DS1302_WEEK_WRITE0x8a#define DS1302_CURRENT_WRITE 0x90#define DS1302_SECOND_READ 0x81#define DS1302_MINUTE_READ 0x83#define DS1302_HOUR_READ 0x85#define DS1302_DAY_READ 0x

16、87#define DS1302_MON_READ 0x89#define DS1302_YEAR_READ 0x8d#define DS1302_WEEK_READ0x8B#define WRITE_PROTECT 0x8e #define uchar unsigned char#define uint unsigned intuchar sec,min,hour,day,mon,year,week,num,flag;unsigned char table="20 - - "unsigned char table1=" : : "void delayu

17、s(unsigned int z)unsigned int x,y;for(x=z;x>0;x-)for(y=48;y>0;y-); /这个延时主要是针对1602控制的时间的,如果超过,则1602与1302不同步,如果少了;则1602会少了显示的东西/*/void write_cmd(uchar com) /写指令rs=0;rw=0;P0=com;delayus(1);en=1;delayus(1);en=0;/*/void write_data(uchar dat) /写数据rs=1;rw=0;P0=dat;delayus(1);en=1;delayus(1);en=0;/*/v

18、oid write_sf(uchar add,uchar date) /时分秒函数,前一个是定义位置,后一个则是分离数据uchar ge,shi;shi=date/10;ge=date%10;write_cmd(0x80+add);/设置显示的位置/delayus(10);write_data(0x30+shi); /给十位送数据/delayus(10);write_data(0x30+ge); /给个位送数据/*/void lcd_write_week(uchar week)/写液晶星期显示函数 write_cmd(0x80+12);/设置显示位置 switch(week) case 1:

19、write_data('M');delayus(5); write_data('O');delayus(5); write_data('N');break; case 2: write_data('T');delayus(5); write_data('U');delayus(5); write_data('E');break; case 3: write_data('W');delayus(5); write_data('E');delayus(5); write_

20、data('D');break; case 4: write_data('T');delayus(5); write_data('H');delayus(5); write_data('U');break; case 5: write_data('F');delayus(5); write_data('R');delayus(5); write_data('I');break; case 6: write_data('S');delayus(5); write_dat

21、a('A');delayus(5); write_data('T');break; case 7: write_data('S');delayus(5); write_data('U');delayus(5); write_data('N');break; /*/void init() /1602初始化uchar i;en=0;write_cmd(0x38);/显示模式设置write_cmd(0x0c); /开显示,光标不闪烁write_cmd(0x06); write_cmd(0x01);write_cmd(0x

22、80);for(i=0;i<16;i+) write_data(tablei);delayus(10);write_cmd(0xc0);for(i=0;i<10;i+)write_data(table1i);delayus(10); /1602位置的初始化 /以上便是液晶1602的初始化/*/uchar DS1302ReadByte()/读一个字节uchar i,dat;delayus(2);for(i=0;i<8;i+)dat>>=1;/要返回的数据左移一位if(SDA=1)/当数据线为高时,证明该位数据为1dat|=0x80;/要传输数据的当前值置为1,若不是

23、,则为0SCLK=1;/拉高时钟线delayus(2);SCLK=0;/制造下降沿delayus(2);return dat;/返回读取出的数据/*/void DS1302WriteByte(uchar dat) /写一个字节uchar i;SCLK=0;/初始时钟线置为0delayus(2);for(i=0;i<8;i+)/开始传输8个字节的数据SDA=dat&0x01;/取最低位,注意DS1302的数据和地址都是从最低位开始传输的delayus(2);SCLK=1;/时钟线拉高,制造上升沿,SDA的数据被传输delayus(2);SCLK=0;/时钟线拉低,为下一个上升沿做准

24、备dat>>=1;/数据右移一位,准备传输下一位数据 /*/uchar DS1302Read(uchar cmd) /读命令uchar dat;RST=0;/初始CE线置为0SCLK=0;/初始时钟线置为0RST=1;/初始CE置为1,传输开始DS1302WriteByte(cmd);/传输命令字,要读取的时间/日历地址dat=DS1302ReadByte();/读取要得到的时间/日期SCLK=1;/时钟线拉高RST=0;/读取结束,CE置为0,结束数据的传输dat = dat/16*10+dat%16;return dat;/返回得到的时间/日期/* */void DS1302W

25、rite(uchar cmd, uchar dat)/往1302中写数据RST=0; /初始CE线置为0SCLK=0; /初始时钟线置为0RST=1; /初始CE置为1,传输开始DS1302WriteByte(cmd); /传输命令字,要写入的时间/日历地址DS1302WriteByte(dat); /写入要修改的时间/日期SCLK=1; /时钟线拉高RST=0; /读取结束,CE置为0,结束数据的传输/*/ void Init_DS1302() /1302初始化DS1302Write(0x8e,0x00);/写保护关/DS1302Write(DS1302_SECOND_WRITE,0x56)

26、; /初始秒值为0/DS1302Write(DS1302_MINUTE_WRITE,0x34);/初始分钟值为0/DS1302Write(DS1302_HOUR_WRITE,0x12); /初始为24小时模式初始时间为0点/DS1302Write(DS1302_DAY_WRITE,0x10); /2011年1月1日星期6/DS1302Write(DS1302_MON_WRITE,0x06);/DS1302Write(DS1302_YEAR_WRITE,0x12);/DS1302Write(DS1302_WEEK_WRITE,0x06); /这里面主要是初次定时DS1302Write(0x8e,

27、0x80);/*/void display()/主要是显示程序,从DS1302中读取数值sec=DS1302Read(DS1302_SECOND_READ);min=DS1302Read(DS1302_MINUTE_READ);hour=DS1302Read(DS1302_HOUR_READ);day=DS1302Read(DS1302_DAY_READ);mon=DS1302Read(DS1302_MON_READ);year=DS1302Read(DS1302_YEAR_READ);week=DS1302Read(DS1302_WEEK_READ);write_sf(8,day);writ

28、e_sf(5,mon);write_sf(2,year);lcd_write_week(week);write_sf(0x40+4,hour);write_sf(0x40+7,min);write_sf(0x40+10,sec); /*/void keyscan() /键盘扫描 if(key0=0)/确认功能键按下 delayus(20); if(key0=0)/功能键确实按下 while(!key0);/释放 num+;/按下次数记录 switch(num) case 1: flag=1;/修改时间,液晶禁止从DS1302读数据 write_cmd(0x0f);/光标开始闪烁 write_c

29、md(0x80+2);/第一次按下,光标定位到年位置 break; case 2: write_cmd(0x80+5);/第二次按下,光标定位到月位置 break; case 3: write_cmd(0x80+8);/第三次按下,光标定位到日位置 break; case 4: write_cmd(0x80+11);/第四次按下,光标定位到星期位置 break; case 5: write_cmd(0x80+0x40+4);/第五次按下,光标定位到时位置 break; case 6: write_cmd(0x80+0x40+7);/第六次按下,光标定位到分位置 break; case 7: w

30、rite_cmd(0x80+0x40+10);/第七次按下,光标定位到秒位置 break; case 8: num=0;/第八次按下,记录清零 write_cmd(0x0c);/不显示光标 DS1302Write(WRITE_PROTECT,0x00);/禁止写保护 DS1302Write(0x80,(sec/10*16)+sec%10);/将调节后的秒写入DS1302 DS1302Write(0x82,(min/10*16)+min%10);/将调节后的分写入DS1302 DS1302Write(0x84,(hour/10*16)+hour%10);/将调节后的时写入DS1302 DS130

31、2Write(0x8a,(week/10*16)+week%10);/将调节后的星期写入DS1302 DS1302Write(0x86,(day/10*16)+day%10);/将调节后的日写入DS1302 DS1302Write(0x88,(mon/10*16)+mon%10);/将调节后的月写入DS1302 DS1302Write(0x8c,(year/10*16)+year%10);/将调节后的年写入DS1302 DS1302Write(WRITE_PROTECT,0x80);/开写保护 flag=0;/时间修改完毕,允许液晶从DS1302读数据 break; if(num!=0) if

32、(key1=0)/确认增大键按下 delayus(20); if(key1=0)/增大键确实按下 while(!key1);switch(num) case 1:year+;/调节年 if(year=100)year=0; write_sf(3,year);/将调节后的年送入液晶显示 write_cmd(0x80+3);/光标回到指定处break; case 2: mon+;/调节月 if(mon=13)mon=1; write_sf(6,mon);/将调节后的月送入液晶显示 write_cmd(0x80+6);/光标回到指定处break; case 3: day+;/调节日 if(day=3

33、2)day=1; write_sf(9,day);/将调节后的日送入液晶显示 write_cmd(0x80+9);/光标回到指定处 break; case 4: week+; if(week=8)week=1; lcd_write_week(week);/将调节后的星期送入液晶显示 write_cmd(0x80+12);/光标回到指定处 break; case 5: hour+; if(hour=24)hour=0; write_sf(4,hour);/将调节后的小时送入液晶显示 write_cmd(0x80+0x40+4);/光标回到指定处 break; case 6: min+; if(min=60)min=0; write_sf(7,min);/将调节后的分送入液晶显示 write_cmd(0x80+0x40+7);/光标回到指定处 break; case 7: sec+; if(sec=60)sec=0; write_sf(10,sec);/将调节后的秒送入液晶显示 write_cmd(0x80+0x40+10);/光标回到指定处 break;defaul

温馨提示

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

评论

0/150

提交评论