基于51单片机的1602液晶显示温度和时间的C程序_第1页
基于51单片机的1602液晶显示温度和时间的C程序_第2页
基于51单片机的1602液晶显示温度和时间的C程序_第3页
基于51单片机的1602液晶显示温度和时间的C程序_第4页
基于51单片机的1602液晶显示温度和时间的C程序_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

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

文档简介

1、/ 液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2”/ 命令数据控制端sbit RW=P2A6;/ 读写选择端sbit LCDE=P2A5;/ 液晶使能端sbit DQ=P2A0;/ds18b20与单片机连接口4 页#define uchar unsigned char #define uint unsigned int/ 定义初值unsigned char hour=0,min=0,sec=0;unsigned int count=0;unsigned char line116=" temp:"

2、/16 个字符unsigned char line216=" time:00:00:00"/16 个字符unsigned char tab='0','1','2','3','4','5','6','7','8','9'/ 数组uchar data disdata5;uint tvalue;/ 温度值uchar tflag;/ 温度正负标志void time();/*lcd1602 程序 */延时 1 毫秒(不够精确的

3、)void delay1ms(unsigned int ms)/unsigned int i,j;for(i=0;i<ms;i+)for(j=0;j<110;j+);void delay5ms()/ 延时 5 毫秒(不够精确的) unsigned int i;for (i=0;i<1000;i+);void delay50us()register int i;for (i=0;i<20;i+);void delay()unsigned char m,n;for(m=255;m>0;m-) for(n=255;n>0;n-);void wr_com(unsig

4、ned char comm)/* 写控制字符程序E=1 RS=0RW=0*/LCDE=0;/ 使能端RS=0;/*rs寄存器选择输入端,当 RS=0;当进行写模块操作,指向指令寄存器。RW=0;/* 当 RS=1 ,无论是读操作还是写操作,都是指向数据寄存器。LCDE=1;Ddata=comm;RS=0;RW=0;LCDE=0;void wr_data(unsigned char dat)/* 当前位置写字符子程序:E=1 RS=1 RW=0LCDE=0;RS=0;/*rs寄存器选择输入端,当 RS=0;当进行写模块操作,指向指令寄存器。RW=0;/* 当 RS=1 ,无论是读操作还是写操作,

5、都是指向数据寄存器。RS=1;RW=0;LCDE=1;Ddata=dat; / 将 dat 赋给 P0 口LCDE=0;RS=0;RW=0;unsigned char busycheck()/* 忙状态检查*/unsigned char i;LCDE=0;RS=0;RW=0;RS=0;RW=1;LCDE=1;i=Ddata;LCDE=0;return(i);void init()/* 初始化程序,必须按照产品的资料介绍的过程进行*/wr_com(0x38);/* 显示模式设置必须三次,不用检测忙信号delay5ms();wr_com(0x38);delay5ms();wr_com(0x38);

6、delay5ms();wr_com(0x01);/* 清屏 *delay5ms();busycheck();wr_com(0x08);delay5ms();busycheck();delay5ms();wr_com(0x06);/* 光标移动设置,写一个字符后地址指针加1*delay5ms();busycheck();delay50us();wr_com(0x38);/* 显示模式设置*delay50us();busycheck();delay50us();wr_com(0x0c); /* 显示开,不显示光标* delay50us();busycheck();delay50us();5页wr_

7、com(0x40);/set cgram addressdelay50us();delay50us();/* 这些延时可用可不用*/void display() unsigned char i;wr_com(0x80); /set ram addressdelay50us();busycheck();delay50us();for(i=0;i<6;i+)wr_data(line1i); /display ( 6 个字符)delay50us();busycheck();busycheck();delay50us();wr_com(0xc0);/0xc0=0x80+0x40delay50us

8、();busycheck();delay50us();for(i=0;i<16;i+)wr_data(line2i); /displaydelay50us();busycheck();6 页,*温度传感器ds1820 程序*/void delay_18B20(unsigned int i)/ 延时 1 微秒while(i-);void ds1820rst()/*ds1820 复位 */ unsigned char x=0;DQ = 1;/DQ 复位delay_18B20(4);/ 延时DQ = 0;/DQ 拉低delay_18B20(100); / 精确延时大于480usDQ = 1;/

9、拉高delay_18B20(40);uchar ds1820rd()/* 读数据 */ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-)/ 读一个字节的数据函数 DQ = 0; / 给脉冲信号dat>>=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;/等价于 dat = dat | 0x80,dat 和 0x80 做“或”的运算,结果是最高位置1,其它位保持不变。delay_18B20(10);8页return(dat);void ds1820wr(uchar wdata)/*写数据*/uns

10、igned char i=0;for (i=8; i>0; i-) DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;/右移一位wdata>>=1;read_temp()/* 读取温度值并转换*/uchar a,b;ds1820rst();/ds1802/ 初始化程序14 页ds1820wr(0xcc);/* ds1820wr(0x44);* ds1820rst();ds1820wr(0xcc);/* ds1820wr(0xbe);/* a=ds1820rd();b=ds1820rd(); tvalue=b;跳过读序列号启动温

11、度转换跳过读序列号读取温度*/*/*/*/读低八位/读高八位tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff) tflag=0;else/“ &是逻辑与“ |是逻辑或if (dat & 0x01 ):不管 dat 是什么数和 0x01(00000001)做了 与"的 运算后,最低位保持不变,其它位均为0.如果dat的最低位为1 , 则表达式为真,就会执行if语句中的内容。如果dat最低位为0, 则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80 :等价于 dat = dat | 0x

12、80,dat 和 0x80 做 或”的运算, 意思是最高位置1 ,其它位保持不变。具体的可以去参考一下C语言的相关语法tvalue=tvalue+1;tflag=1;tvalue=tvalue*(0.625);/ 温度值扩大10 倍,精确到1 位小数return(tvalue);/*/void ds1820disp()/ 温度值显示 uchar flagdat;disdata0=tvalue/1000+0x30;/ 百位数disdata1=tvalue%1000/100+0x30;/ 十位数disdata2=tvalue%100/10+0x30;/ 个位数disdata3=tvalue%10+

13、0x30;/ 小数位if(tflag=0)flagdat=0x20;/ 正温度不显示符号elseflagdat=0x2d;/ 负温度显示负号:-if(disdata0=0x30)disdata0=0x20;/ 如果百位为0,不显示if(disdata1=0x30)disdata1=0x20;/ 如果百位为0,十位为0也不显示wr_com(0x88);wr_data(flagdat);/ 显示符号位wr_com(0x89);wr_data(disdata0);/ 显示百位 wr_com(0x8a);wr_data(disdata1);/ 显示十位 wr_com(0x8b);wr_data(dis

14、data2);/ 显示个位wr_com(0x8c);wr_data(0x2e);/ 显示小数点wr_com(0x8d);wr_data(disdata3);/ 显示小数位void main()TMOD=0X01;EA=1;ET0=1;TR0=1;TH0=(65536-4995)/256;TL0=(65536-4995)%256;init();while(1)read_temp();/ 读取温度ds1820disp();/ 显示time(); / 时间程序display();/ 时间显示程序void t0(void)interrupt 1 using 0TH0=(65536-4995)/256;TL0=(65536-4995)%256;count+;if(count=200)count=0;sec+;if(sec=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24)hour=0;void time()line215=tabsec%10;line214=tabsec/10;line212=ta

温馨提示

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

评论

0/150

提交评论