标题:
温度测量仪表-12864液晶显示器显示源码
[打印本页]
作者:
鐢电埍濂借
时间:
2018-5-15 19:11
标题:
温度测量仪表-12864液晶显示器显示源码
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)
2018-5-15 19:09 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
飘散微尘
时间:
2019-4-15 14:25
这个有仿真图吗?
作者:
橘生淮南则为橘
时间:
2019-4-17 20:00
很好的帖子,很有帮助
作者:
影子001
时间:
2019-4-24 02:06
很好 学习一哈
作者:
1367067553
时间:
2019-4-27 19:11
为什么温度没有变化
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1