LCD12864,LCD1602温度显示测试程序,有兴趣的可以自己动手试试
单片机源程序如下:
- /*******************************************
- 功 能:温度测量仪表--12864液晶显示器显示
- 传感器:DS18B20
- 显示器:12864液晶屏
- *******************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P2^0;//温度传感器DQ端接单片机P2.0口
- // 12864液晶位定义
- sbit lcdrs=P3^4;//液晶的RS端接P3.4口
- sbit lcdrw=P3^6;//液晶的RW端接P3.6口
- sbit lcden=P3^7;// 液晶的EN使能端接P3.7口
- uint wendu=0; //温度初始数值0
- /********************延时函数,延时一毫秒************************/
- void delay1ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- /**************************12864显示****************************/
- void write_com(uchar com) //写指令函数
- {
- lcdrs=0;
- P0=com;
- delay1ms(1);
- lcden=1;
- delay1ms(1);
- lcden=0;
- }
- void write_date(uchar date) //写数据函数
- {
- lcdrs=1;
- P0=date;
- delay1ms(1);
- lcden=1;
- delay1ms(1);
- lcden=0;
- }
- void write_str(uchar *str) //写字符串函数
- {
- while(*str!='\0') //未结束
- {
- write_date(*str++);
- delay1ms(5);
- }
- }
- void write_pos(uchar x,uchar y) //从第X行的第Y位置开始显示
- {
- uchar pos;
- if(x==1) //第一行
- { x=0x80;}
- else if(x==2) //第二行
- { x=0x90;}
- else if(x==3) //第三行
- { x=0x88;}
- else if(x==4) //第四行
- { x=0x98;}
- pos=x+y-1; //首地址为0X80
- write_com(pos);
- }
- /***************************12864液晶初始化******************************/
- void init_12864()
- {
- lcdrw=0;
- lcden=0;
- write_com(0x01); //清屏命令
- delay1ms(5);
- write_com(0x30); //设置基本指令集动作
- write_com(0x06); //进入显示模式
- write_com(0x0c); // 开显示
- write_com(0x88);
- write_pos(1,1);
- write_str(" 温度测量实验");
- write_pos(2,1);
- write_str("实时温度:");
- write_pos(2,8);
- write_str("度");
- write_pos(3,1);
- write_str("淘宝店铺实名搜索");
- write_pos(4,1);
- write_str("顺通电子工作室");
- }
- /************************DS18B20程序*************************/
- bit init_DS18B20()
- {
- uchar num;
- bit flag;
- DQ=1;
- for(num=0;num<2;num++); //先拉高
- DQ=0;
- for(num=0;num<200;num++); // 480-960us powerup
- DQ=1;
- for(num=0;num<20;num++); // >60us wait
- flag=DQ; // 响应
- for(num=0;num<150;num++); // 60-240us ds18b20存在信号
- DQ=1;
- return flag;
- }
- void DS18B20_WR_CHAR(uchar byte) // 先写低位
- {
- uchar num;
- uchar num1;
- for(num1=0;num1<8;num1++)
- {
- DQ=0; //拉低
- _nop_(); //下拉1us
- _nop_();
- DQ=byte&0x01;
- for(num=0;num<20;num++); // >60us wait
- byte>>=1;
- DQ=1; //拉高
- _nop_();
- _nop_();
- }
- }
- uchar DS18B20_RD_CHAR() //先读低位
- {
- uchar num;
- uchar num1;
- uchar byte=0;
- for(num1=0;num1<8;num1++)
- {
- DQ=0; //拉低
- _nop_();
- DQ=1;
- for(num=0;num<1;num++); // <10us
- byte>>=1;
- if(DQ==1)
- byte|=0x80;
- else
- byte|=0x00;
- DQ=1; //拉高
- _nop_();
- _nop_();
- for(num=0;num<20;num++); // >60us
-
- }
- return byte;
- }
- uint DS18B20_WENDU()
- {
- uchar temperaturel=0,temperatureh=0;
- uint temperature=0;
- if(init_DS18B20()==0)
- {
- DS18B20_WR_CHAR(0xcc); //发命令:Skip ROM,跳过读序列号
- DS18B20_WR_CHAR(0x44); //启动温度转换
- delay1ms(1000);
- if(init_DS18B20()==0)
- {
- DS18B20_WR_CHAR(0xcc); //发命令:Skip ROM,跳过读序列号
- DS18B20_WR_CHAR(0xBE); //读取温度
- _nop_();
- temperaturel=DS18B20_RD_CHAR(); //温度值低8为存入temperaturel
- temperatureh=DS18B20_RD_CHAR(); //温度值高8为存入temperatureh
- temperature=(temperatureh*256+temperaturel)*0.625; //完成数据整合,温度比正常大10倍
- init_DS18B20();
- }
- return temperature;
- }
- }
- /************************主函数******************************/
- main()
- {
- init_12864(); //12864液晶初始化函数
- delay1ms(1000);
- while(1)
- {
- if( init_DS18B20()==0)
- {
- wendu=DS18B20_WENDU();
- write_pos(2,6);
- write_date((wendu/100)%10+48); //+48 实现十进制与ASCII码之间的转换 让1602液晶显示十进制数
- write_date((wendu/10)%10+48);
- write_date('.');
- write_date(wendu%10+48);
-
- delay1ms(2000);
- }
- }
- }
复制代码
所有资料51hei提供下载:
DS18B20温度传感器电子资料.zip
(457.98 KB, 下载次数: 27)
|