ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:19.15KB ,
资源ID:10922799      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10922799.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用1602液晶显示DS1302+S51时钟+温度显示cytrm.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用1602液晶显示DS1302+S51时钟+温度显示cytrm.docx

1、使用1602液晶显示DS1302+S51时钟+温度显示cytrm =*/ /*#include */ #include #include #include #define LCM_RS P2_0 /定义引脚 #define LCM_RW P2_1 #define LCM_E P2_2 #define LCM_Data P0 #define Busy 0x80 /用于检测LCM状态字中的Busy标识 #define uchar unsigned char uchar id,timecount; bit flag,sflag; /flag是时钟冒号闪烁标志,sflag是温度负号显示标志 void

2、Disp_line1(void); /显示屏幕第一行 void Disp_line2(void); /显示屏幕第二行 void id_case1_key(); /* DS1302 时间显示定义部分 sbit T_CLK=P10; sbit T_IO =P11; sbit T_RST=P12; sbit ACC0=ACC0; sbit ACC7=ACC7; void Set(uchar,uchar); /根据选择调整相应项目 void RTInputByte(uchar); /* 输入 1Byte */ uchar RTOutputByte(void); /* 输出 1Byte */ void

3、W1302(uchar, uchar); / 向DS1302写入一个字节 uchar R1302(uchar); / 从DS1302读出一个字节 void Set1302(unsigned char * ); / 设置时间 bit sec,min,hour,year,mon,day,weekk; /闪烁标志位 /初始化后设置为:04年12月2日星期4 0点0分0秒 unsigned char inittime7=0x00,0x00,0x00,0x02,0x12,0x04,0x04; / 秒 分钟 小时 日 月 年 星期 /* 18B20温度显示定义部分 sbit DQ=P33; /18B20

4、接P07口 typedef unsigned char byte; typedef unsigned int word; Read_Temperature(char,char); void mychar(void); void adjust_res(char res); /res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应 / 0.5, 0.25, 0.125 /* 1602LCD驱动 * void WriteDataLCM(unsigned char WDLCM); void WriteCommandLCM(unsigned char WCLCM,BuysC); un

5、signed char ReadStatusLCM(void); void LCMInit(void); void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void); unsigned char code week=Week.;/ void main(vo

6、id) Delay400Ms(); /启动等待,等LCM讲入工作状态 LCMInit(); /LCM初始化 Delay5Ms(); /延时片刻(可不要) mychar(); /显示自定义字符 TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; TR0=1; ET0=1; W1302(0x90,0xa5);/打开充电二级管 一个二级管串联一个2K电阻 W1302(0x8e,0x80);/写保护,禁止写操作 adjust_res(0x1f); /调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.

7、125 while(1) if (P1_4|P1_5)=0) /初始化 Delay5Ms(); if (P1_4|P1_5)=0) Set1302(inittime); if (P1_6=0) / 设置和选择项目键 Delay5Ms(); if(P1_6=0)id+;if(id7) id=0; while(P1_6=0); switch(id) case 0: sec=0; Disp_line1(); Disp_line2(); break; case 1:/年 year=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 2:

8、/月 year=0;mon=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 3:/日 mon=0;day=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 4:/星期 day=0;weekk=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 5:/小时 weekk=0;hour=1; Disp_line1(); Disp_line2(); id_case1_key(); break; cas

9、e 6:/分钟 hour=0;min=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 7:/秒 min=0;sec=1; Disp_line1(); Disp_line2(); id_case1_key(); break; /中断入口,冒号闪烁 void t0(void) interrupt 1 using 0 TH0=(65535-50000)/256; /50ms定时 TL0=(65535-50000)%256; timecount+; if(timecount9) timecount=0; flag=flag; /id

10、为1时的下一级选择 void id_case1_key() if (P1_5=0) /增加 Delay5Ms(); if(P1_5=0) Set(id,0); if(id!=7) while(P1_5=0); if (P1_4=0) /减少 Delay5Ms(); if(P1_4=0) Set(id,1); if(id!=7) while(P1_4=0); /根据选择调整相应项目并写入DS1302 void Set(uchar sel,uchar sel_1) signed char address,item; signed char max,mini; if(sel=7) address=0

11、x80; max=0;mini=0; /秒 if(sel=6) address=0x82; max=59;mini=0; /分钟 if(sel=5) address=0x84; max=23;mini=0; /小时 if(sel=3) address=0x86; max=31;mini=1; /日 if(sel=2) address=0x88; max=12;mini=1; /月 if(sel=1) address=0x8c; max=99;mini=0; /年 if(sel=4) address=0x8a; max=7; mini=1; /星期 item=R1302(address+1)/1

12、6*10+R1302(address+1)%16; if (sel_1=0) item+; else item-; if(itemmax) item=mini; if(itemmini) item=max; W1302(0x8e,0x00);/允许写操作 W1302(address,item/10*16+item%10); W1302(0x8e,0x80);/写保护,禁止写操作 /屏幕显示第一行 时间和温度 void Disp_line1(void) Read_Temperature(10,0); /温度显示 /冒号闪烁 if(flag=0) DisplayOneChar(3,0,0x3a);

13、 DisplayOneChar(6,0,0x3a); else DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20); if(sec=1) /秒闪烁标志位 if(flag=1) DisplayOneChar(7,0,R1302(0x81)/16+0x30); /显示秒 DisplayOneChar(8,0,R1302(0x81)%16+0x30); else DisplayOneChar(7,0,0x20); /显示秒 DisplayOneChar(8,0,0x20); else DisplayOneChar(7,0,R1302(0x81)/16

14、+0x30); /显示秒 DisplayOneChar(8,0,R1302(0x81)%16+0x30); if(min=1) /分钟闪烁标志位 if(flag=1) DisplayOneChar(4,0,R1302(0x83)/16+0x30); /显示分钟 DisplayOneChar(5,0,R1302(0x83)%16+0x30); else DisplayOneChar(4,0,0x20); /显示分钟 DisplayOneChar(5,0,0x20); else DisplayOneChar(4,0,R1302(0x83)/16+0x30); /显示分钟 DisplayOneCha

15、r(5,0,R1302(0x83)%16+0x30); if(hour=1) /小时闪烁标志位 if(flag=1) DisplayOneChar(1,0,R1302(0x85)/16+0x30);/显示小时 DisplayOneChar(2,0,R1302(0x85)%16+0x30); else DisplayOneChar(1,0,0x20); /显示小时 DisplayOneChar(2,0,0x20); else DisplayOneChar(1,0,R1302(0x85)/16+0x30);/显示小时 DisplayOneChar(2,0,R1302(0x85)%16+0x30);

16、 / 屏幕显示第二行 日期和星期 void Disp_line2(void) DisplayOneChar(3,1,0x2f); /显示固定字符 DisplayOneChar(6,1,0x2f); DisplayListChar(10,1,week); if(year=1) /年闪烁标志位 if(flag=1) DisplayOneChar(1,1,R1302(0x8d)/16+0x30);/显示年 DisplayOneChar(2,1,R1302(0x8d)%16+0x30); else DisplayOneChar(1,1,0x20); /显示年 DisplayOneChar(2,1,0x

17、20); else DisplayOneChar(1,1,R1302(0x8d)/16+0x30);/显示年 DisplayOneChar(2,1,R1302(0x8d)%16+0x30); if(mon=1) /月闪烁标志位 if(flag=1) DisplayOneChar(4,1,R1302(0x89)/16+0x30);/显示月 DisplayOneChar(5,1,R1302(0x89)%16+0x30); else DisplayOneChar(4,1,0x20); /显示月 DisplayOneChar(5,1,0x20); else DisplayOneChar(4,1,R13

18、02(0x89)/16+0x30);/显示月 DisplayOneChar(5,1,R1302(0x89)%16+0x30); if(day=1) /日闪烁标志位 if(flag=1) DisplayOneChar(7,1,R1302(0x87)/16+0x30);/显示日 DisplayOneChar(8,1,R1302(0x87)%16+0x30); else DisplayOneChar(7,1,0x20); /显示日 DisplayOneChar(8,1,0x20); else DisplayOneChar(7,1,R1302(0x87)/16+0x30);/显示日 DisplayOn

19、eChar(8,1,R1302(0x87)%16+0x30); if(weekk=1) /星期闪烁标志位 if(flag=1) DisplayOneChar(15,1,R1302(0x8b)%16+0x30);/显示星期 else DisplayOneChar(15,1,0x20); /显示星期 else DisplayOneChar(15,1,R1302(0x8b)%16+0x30);/显示星期 /* LCM1602驱动程序 * /写数据 void WriteDataLCM(unsigned char WDLCM) ReadStatusLCM(); /检测忙 LCM_Data = WDLCM

20、; LCM_RS = 1; LCM_RW = 0; LCM_E = 0; /若晶振速度太高可以在这后加小的延时 LCM_E = 0; /延时 LCM_E = 1; /写指令 void WriteCommandLCM(unsigned char WCLCM,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCM(); /根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; /读状态 unsigned char ReadStatusLCM(void)

21、 LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); /检测忙信号 return(LCM_Data); /LCM初始化 void LCMInit(void) LCM_Data = 0; WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteC

22、ommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); /关闭显示 WriteCommandLCM(0x01,1); /显示清屏 WriteCommandLCM(0x06,1); / 显示光标移动设置 WriteCommandLCM(0x0C,1); / 显示开及光标设置 /按指定位置显示一个字符 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) Y &= 0x1; X &= 0xF; /限制X不能大于15,Y不能大于1 i

23、f (Y) X |= 0x40; /当要显示第二行时地址码+0x40; X |= 0x80; /算出指令码 WriteCommandLCM(X, 0); /这里不检测忙信号,发送地址码 WriteDataLCM(DData); /按指定位置显示一串字符 *原来的遇到空格0x20就不显示* void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) unsigned char ListLength,j; ListLength = strlen(DData); Y &= 0x1; X &= 0x

24、F; /限制X不能大于15,Y不能大于1 if (X = 0xF) /X坐标应小于0xF for(j=0;jListLength;j+) DisplayOneChar(X, Y, DDataj); /显示单个字符 X+; /5ms延时 void Delay5Ms(void) unsigned int TempCyc = 5552; while(TempCyc-); /400ms延时 void Delay400Ms(void) unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA-) TempCycB=7269; wh

25、ile(TempCycB-); ; 1602显示时钟#include#include#define uchar unsigned char#define uint unsigned intsbit DS1302_CLK=P12;sbit DS1302_IO=P11;sbit DS1302_RST=P10;sbit lcden=P22;sbit lcdwr=P21;sbit lcdrs=P20;unsigned char second,minute,hour,week,day,month,year;unsigned char table=0123456789;/unsigned char tab

26、le1= ;unsigned char table2= ;unsigned char table3=Time: ;unsigned char table4=Date: ;unsigned int time=0x09,0x12,0x27,0x03,0x23,0x59,0x40;uchar num,count,date,shi;void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);/向DS1302送一个字节/void InputByte(unsigned char byte1)char i;for(i=8;i0;i-) DS1302_IO=(bit)(byte1&0x01); DS1302_CLK=1; _nop_(); DS1302_CLK=0; byte1=1; return;/读DS1302一个字节/unsigned char outputbyte(void) unsigned char i; unsigned char ucdat=0; for(i=8;i0;i-) DS1302_IO=1; ucdat=1; if(DS1302_IO)ucdat|=0x80; DS1302_CLK=1; _nop_(); DS1302_CLK=0; return(ucdat);/向DS1302某地址写一个字节数据/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1