DS1302与液晶1602简单时钟.docx
- 文档编号:17859763
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:31
- 大小:239.55KB
DS1302与液晶1602简单时钟.docx
《DS1302与液晶1602简单时钟.docx》由会员分享,可在线阅读,更多相关《DS1302与液晶1602简单时钟.docx(31页珍藏版)》请在冰点文库上搜索。
DS1302与液晶1602简单时钟
《单片机原理实验》
考
试
报
告
题目:
DS1302和1602时钟
姓名:
学号:
班级:
专业:
电子信息工程
指导老师:
提交时间:
DS1302和1602时钟
***
(**学院电子信息工程***班**********)
摘要:
关键词:
DS1302,液晶1602,89C51。
1.引言
我们在日常生活中常常用到时钟来记录时间,有时候还不能准确的记录下时间,
这就要用到芯片DS1302了。
时间还远远不够,因为人性化的设计自然是要清楚的显示年、月、日、星期、时间。
而在此用到的DS1302非常好的与时间进行同步,并且在掉电时不会对时间有影响,较理
的考虑到了人们的思维模式,从而简单的控制了时钟,结合了常理的理论。
2.原理
DS1302引脚
X1X232.768KHz晶振管脚
GND地
CE复位脚
I/O数据输入/输出引脚
SCLK串行时钟
Vcc1,Vcc2电源供电管脚
各引脚的功能为:
Vcc1:
主电源;Vcc2:
备份电源。
当Vcc2>Vcc1+0.2V时,由Vcc2
向DS1302供电,当Vcc2 SCLK: 串行时钟,输入,控制数据的输入与输出; I/O: 三线接口时的双向数据线; CE: 输入信号,在读、写数据期间,必须为高。 该引脚有两个功能: 第一,CE开始控制字访问移位寄存器的控制逻辑;其次, CE提供结束单字节或多字节数据传输的方法。 DS1302控制字: 控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入 到DS1302中。 位6: 如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0): 指示操作单元的地址; 位0(最低有效位): 如为0,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。 在控制字指令输入后的下一个SCLK时钟的上 升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。 同样,在紧跟 8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读 出的数据也是从最低位到最高位。 DS1302时序: 如图,所示 CE输入驱动高启动所有的数据传输。 CE输入有两个功能。 首先,CE打开控制逻辑,允许访问的移位寄存器的地址 /命令序列。 其次,CE提供了一个终止单字节或多字节数据传输方法。 一个时钟周期是由一个下降沿之后的上升沿序列。 对于数据传输而言,数据必 须在有效的时钟的上升沿输入,在时钟的下降沿输出。 如果CE为低,所有的I /O引脚变为高阻抗状态,数据传输终止。 对于数据输入: 开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的 上升沿输入。 数据输入位0开始。 对于数据输出: 开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周 期的下降沿输出。 注意,第一个数据字节的第一个下降沿发生后,命令字的最 后一位被写入(Notethatthefirstdatabittobetransmittedoccurson thefirstfallingedgeafterthelastbitofthecommandbyteis written.),命令字节的最后一位被写入。 当CE仍为高时。 如果还有额外的 SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的 能力。 DS1302驱动程序分析: 开始---设置CE为高---在上升沿传输地址字---读取或写入相应地址的数字---设置CE为低---结束。 10.8.2.11602LCD的基本参数及引脚功能 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示: 图10-541602LCD尺寸图 1602LCD主要技术参数: 显示容量: 16×2个字符 芯片工作电压: 4.5—5.5V 工作电流: 2.0mA(5.0V) 模块最佳工作电压: 5.0V 字符尺寸: 2.95×4.35(W×H)mm 引脚功能说明 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示: 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 表10-13: 引脚接口说明表 第1脚: VSS为地电源。 第2脚: VDD接5V正电源。 第3脚: VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚: RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚: R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。 当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚: E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚: D0~D7为8位双向数据线。 第15脚: 背光源正极。 第16脚: 背光源负极。 10.8.2.31602LCD的指令说明及时序 1602液晶模块内部的控制器共有11条控制指令,如表10-14所示: 序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制 0 0 0 0 0 0 1 D C B 5 光标或字符移位 0 0 0 0 0 1 S/C R/L * * 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到CGRAM或DDRAM) 1 0 要写的数据内容 11 从CGRAM或DDRAM读数 1 1 读出的数据内容 表10-14: 控制命令表 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。 (说明: 1为高电平、0为低电平) 指令1: 清显示,指令码01H,光标复位到地址00H位置。 指令2: 光标复位,光标返回到地址00H。 指令3: 光标和显示模式设置I/D: 光标移动方向,高电平右移,低电平左移S: 屏幕上所有文字是否左移或者右移。 高电平表示有效,低电平则无效。 指令4: 显示开关控制。 D: 控制整体显示的开与关,高电平表示开显示,低电平表示关显示C: 控制光标的开与关,高电平表示有光标,低电平表示无光标B: 控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5: 光标或显示移位S/C: 高电平时移动显示的文字,低电平时移动光标。 指令6: 功能设置命令DL: 高电平时为4位总线,低电平时为8位总线N: 低电平时为单行显示,高电平时双行显示F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7: 字符发生器RAM地址设置。 指令8: DDRAM地址设置。 指令9: 读忙信号和光标地址BF: 为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10: 写数据。 指令11: 读数据。 与HD44780相兼容的芯片时序表如下: 读状态 输入 RS=L,R/W=H,E=H 输出 D0—D7=状态字 写指令 输入 RS=L,R/W=L,D0—D7=指令码,E=高脉冲 输出 无 读数据 输入 RS=H,R/W=H,E=H 输出 D0—D7=数据 写数据 输入 RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出 无 表10-15: 基本操作时序表 读写操作时序如图10-55和10-5 6所示: 图10-55读操作时序 图10-56写操作时序 10.8.2.41602LCD的RAM地址映射及标准字库表 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。 要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。 图10-571602LCD内部显示地址 例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢? 这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。 每次输入指令前都要判断液晶模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有: 阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 图10-58字符代码与图形对应图 10.8.2.51602LCD的一般初始化(复位)过程 延时15mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 以后每次写指令、读/写数据操作均需要检测忙信号 写指令38H: 显示模式设置 写指令08H: 显示关闭 写指令01H: 显示清屏 写指令06H: 显示光标移动设置 写指令0CH: 显示开及光标设置 液晶1602驱动时序: 开始---LCD初始化---延时---设置第一行显示位置---显示第一行内容---设置第二行显示位置---显示第二行内容 3.电路 实际电路: 4.程序 #include sbitkey0=P3^0;//功能键 sbitkey1=P3^1;//增大键 sbitkey2=P3^2;//减小键 sbitRST=P3^3; sbitSCLK=P3^4; sbitSDA=P3^5; sbitrs=P2^0; sbitrw=P2^1; sbiten=P1^7; #defineDS1302_SECOND_WRITE0x80 #defineDS1302_MINUTE_WRITE0x82 #defineDS1302_HOUR_WRITE0x84 #defineDS1302_DAY_WRITE0x86 #defineDS1302_MON_WRITE0x88 #defineDS1302_YEAR_WRITE0x8c #defineDS1302_WEEK_WRITE0x8a #defineDS1302_CURRENT_WRITE0x90 #defineDS1302_SECOND_READ0x81 #defineDS1302_MINUTE_READ0x83 #defineDS1302_HOUR_READ0x85 #defineDS1302_DAY_READ0x87 #defineDS1302_MON_READ0x89 #defineDS1302_YEAR_READ0x8d #defineDS1302_WEEK_READ0x8B #defineWRITE_PROTECT0x8e #defineucharunsignedchar #defineuintunsignedint ucharsec,min,hour,day,mon,year,week,num,flag; unsignedchartable[]="20--"; unsignedchartable1[]=": : "; voiddelayus(unsignedintz) { unsignedintx,y; for(x=z;x>0;x--) for(y=48;y>0;y--);//这个延时主要是针对1602控制的时间的,如果超过,则1602与1302不同步,如果少了;则1602会少了显示的东西 } /*****************************/ voidwrite_cmd(ucharcom)//写指令 { rs=0; rw=0; P0=com; delayus (1); en=1; delayus (1); en=0; } /********************/ voidwrite_data(uchardat)//写数据 { rs=1; rw=0; P0=dat; delayus (1); en=1; delayus (1); en=0; } /****************/ voidwrite_sf(ucharadd,uchardate)//时分秒函数,前一个是定义位置,后一个则是分离数据 { ucharge,shi; shi=date/10; ge=date%10; write_cmd(0x80+add);//设置显示的位置 //delayus(10); write_data(0x30+shi);//给十位送数据 //delayus(10); write_data(0x30+ge);//给个位送数据 } /**********************************/ voidlcd_write_week(ucharweek)//写液晶星期显示函数 { write_cmd(0x80+12);//设置显示位置 switch(week) { case1: write_data('M');delayus(5); write_data('O');delayus(5); write_data('N');break; case2: write_data('T');delayus(5); write_data('U');delayus(5); write_data('E');break; case3: write_data('W');delayus(5); write_data('E');delayus(5); write_data('D');break; case4: write_data('T');delayus(5); write_data('H');delayus(5); write_data('U');break; case5: write_data('F');delayus(5); write_data('R');delayus(5); write_data('I');break; case6: write_data('S');delayus(5); write_data('A');delayus(5); write_data('T');break; case7: write_data('S');delayus(5); write_data('U');delayus(5); write_data('N');break; } } /********************/ voidinit()//1602初始化 { uchari; en=0; write_cmd(0x38);//显示模式设置 write_cmd(0x0c);//开显示,光标不闪烁 write_cmd(0x06); write_cmd(0x01); write_cmd(0x80); for(i=0;i<16;i++) { write_data(table[i]); delayus(10); } write_cmd(0xc0); for(i=0;i<10;i++) { write_data(table1[i]); delayus(10);//1602位置的初始化 } }//以上便是液晶1602的初始化 /***********************************/ ucharDS1302ReadByte()//读一个字节 { uchari,dat; delayus (2); for(i=0;i<8;i++) { dat>>=1;//要返回的数据左移一位 if(SDA==1)//当数据线为高时,证明该位数据为1 dat|=0x80;//要传输数据的当前值置为1,若不是,则为0 SCLK=1;//拉高时钟线 delayus (2); SCLK=0;//制造下降沿 delayus (2); } returndat;//返回读取出的数据 } /************************************************/ voidDS1302WriteByte(uchardat)//写一个字节 { uchari; SCLK=0;//初始时钟线置为0 delayus (2); for(i=0;i<8;i++)//开始传输8个字节的数据 { SDA=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的 delayus (2); SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输 delayus (2); SCLK=0;//时钟线拉低,为下一个上升沿做准备 dat>>=1;//数据右移一位,准备传输下一位数据 } } /********************************/ ucharDS1302Read(ucharcmd)//读命令 { uchardat; RST=0;//初始CE线置为0 SCLK=0;//初始时钟线置为0 RST=1;//初始CE置为1,传输开始 DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址 dat=DS1302ReadByte();//读取要得到的时间/日期 SCLK=1;//时钟线拉高 RST=0;//读取结束,CE置为0,结束数据的传输 dat=dat/16*10+dat%16; returndat;//返回得到的时间/日期 } /************/ voidDS1302Write(ucharcmd,uchardat)//往1302中写数据 { RST=0;//初始CE线置为0 SCLK=0;//初始时钟线置为0 RST=1;//初始CE置为1,传输开始 DS1302WriteByte(cmd);//传输命令字,要写入的时间/日历地址 DS1302WriteByte(dat);//写入要修改的时间/日期 SCLK=1;//时钟线拉高 RST=0;//读取结束,CE置为0,结束数据的传输 } /***********************************/ voidInit_DS1302()//1302初始化 { DS1302Write(0x8e,0x00);//写保护关 //DS1302Write(DS1302_SECOND_WRITE,0x56);//初始秒值为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,0x80); } /***************************/ voiddisplay()//主要是显示程序,从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); write_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); } /***********************************/ voidkeyscan()//键盘扫描 { if(key0==0)//确认功能键按下 { delayus(20); if(key0==0)//功能键确实按下 { while(! key0);//释放
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302 液晶 1602 简单 时钟