📄 tempture.c
字号:
/*******************************************************************************************************
程序名称:1602液晶温度显示
实现功能:1602液晶温度显示
作者:李灿松
最后修改时间:2008.7.18
=========================================
数据说明: *
P0_0=D0 P0_1=D1 P0_2=D2 P0_3=D3 *
P0_4=D4 P0_5=D5 P0_6=D6 P0_7=D7 *
P2_0=RS P2_1=RW P2_2=E *
*
P3_3为DS18B20的数据输入口 *
=========================================
*******************************************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define T_cont 0.0625 //温度转换常数
#define uchar unsigned char
#define uint unsigned int
#define L1602_DB0_DB7 P0 //定义1602的数据总线
bit T_sign=0; //温度正负符号
float temp1=0;
sbit DQ=P3^3; //单口线说明
sbit L1602_RS=P2^0; //定义1602得RS控制线
sbit L1602_RW=P2^1; //定义1602得RW控制线
sbit L1602_E=P2^2; //定义1602的E控制线
sbit L1602_Busy=P0^7; //定义1602的测忙线
uchar code Welcome[]={"wlecome"};
uchar code Welcome1[]={"tempture"};
uchar code Welcome2[]={"cansong:"};
uchar code Temp[]={"temp"};
unsigned char sdata,t_bai,t_shi,t_ge,t_feng,t_miao;
typedef bit BOOL ;
/**********************************************************************************************
函数名称:主函数
函数功能:
说明:
**********************************************************************************************/
void main(void)
{
void print(uchar a,uchar *str);
void print1(uchar a,uchar t);
void LCM1602_Init();
void LCM1602_Delay(uchar count);
void ReadTemperature();
void DS18B20_init();
DS18B20_init();
LCM1602_Init();
print(0x80,Welcome);
print(0xc0,Welcome1);
LCM1602_Delay(5000);
while(1)
{
ReadTemperature();
print(0x80, Welcome2);
if(T_sign==1)
print1(0xc0,0x2d);
else
print1(0xc0,0x2b);
//if(t_bai!=0)
print1(0xc1,t_bai+0x30);
// else
// print1(0xc1,t_shi+0x30); //消隐,不显示
// t_shi=3;
print1(0xc2,t_shi+0x30);
print1(0xc3,t_ge+0x30);
print1(0xc4,0x2e); //显示点
print1(0xc5,t_feng+0x30);
print1(0xc6,t_miao+0x30);
print1(0xc7,0x43); //显示'C
}
}
/**********************************************************************************************
函数名称:读取温度函数
函数功能:读取DS18B20的转换温度值
说明:
**********************************************************************************************/
void ReadTemperature() //获取温度源程序
{
void delay(unsigned int delay_time);
void DS18B20_init();
void DS18B20_send(unsigned char out_data);
uchar DS18B20_read(void);
unsigned int y=0;
uchar a=0;
uchar b=0;
// unsigned char k;
DS18B20_init(); //初始化DS18B20
DS18B20_send (0xcc);
DS18B20_send (0x44); //启动温度转换
delay(125);
DS18B20_init();
DS18B20_send (0xcc);
DS18B20_send (0xbe); //读取温度寄存器
a=DS18B20_read(); //读取低位
b=DS18B20_read(); //读取高位
//k=b&0X08;
//if(k==0x08) T_sign=1; //温度是负数
//else T_sign=0;
if(b>0x7f)
{
a=~a;b=~b+1; //补码转换,取反加一
T_sign=1; //温度为负时flag=0
}
sdata=a/16+b*16;
t_bai=sdata/100;
t_shi=sdata/10;
t_ge=sdata%10;
t_feng=(a&0x0f)*10/16;
t_miao=(a&0x0f)*100/16%10;
}
/**********************************************************************************************
函数名称:延时函数
函数功能:转换延时和显示延时
说明:LCM1602_Delay()是液晶显示延时,delay()是温度转换延时
**********************************************************************************************/
void delay(unsigned int delay_time) // 延时程序
{
while(delay_time--);
}
void LCM1602_Delay(uchar count)
{
uchar i;
while(--count!=0)
{for(i=0;i<250;i++);}
}
/**********************************************************************************************
函数名称:初始化函数
函数功能:对DS18B20进行初始化
说明:
**********************************************************************************************/
void DS18B20_init() //初始化DS18B20
{
unsigned char i=0;
DQ=1;
delay(8);
DQ=0;
delay(85); //精确延时484 us
DQ=1;
delay(14); //精确延时34us
i=DQ;
delay(20);
}
/**********************************************************************************************
函数名称:写函数
函数功能:向DS18B20写命令
说明:
**********************************************************************************************/
void DS18B20_send(unsigned char out_data) //主机发送一字节到DS18B20
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=out_data&0x01; //数据从低位送出
delay(5); //精确延时61us
DQ=1;
out_data>>=1;
}
delay(4);
}
/**********************************************************************************************
函数名称:读函数
函数功能:从DS18B20读取数据
说明:
**********************************************************************************************/
uchar DS18B20_read(void)//主机从DS18B20中读取一字节
{
unsigned char i,in_data;
in_data=0;
for(i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0; //给脉冲信号
in_data>>=1;
DQ=1; //给脉冲信号
if(DQ)
in_data|=0x80;
delay(4);
}
return(in_data);
}
/**********************************************************************************************
函数名称:初始化函数
函数功能:液晶1602初始化
说明:
**********************************************************************************************/
void LCM1602_Init(void)
{
void LCM1602_WriteData(uchar LCM1602_data);
void LCM1602_WriteCMD(uchar LCM1602_command);
LCM1602_WriteCMD(0x38); //显示两行,每个字符为5*7个像素
delay(1);
LCM1602_WriteCMD(0x06); //光标移动设置,光标右移
delay(1);
LCM1602_WriteCMD(0x0c); //现设开,光标开,闪烁开
delay(1);
LCM1602_WriteCMD(0x01); //清屏
delay(1);
}
//在规定位置些数据或字符或字符串
void print(uchar a,uchar *str)
{
void LCM1602_WriteData(uchar LCM1602_data);
void LCM1602_WriteCMD(uchar LCM1602_command);
LCM1602_WriteCMD(a);
while(*str!='\0')
{
LCM1602_WriteData(*str++);
}
*str=0;
}
void print1(uchar a,uchar t)
{
LCM1602_WriteCMD(a);
LCM1602_WriteData(t);
}
/**********************************************************************************************
函数名称:写命令和写数据函数
函数功能:向LCD写命令和数据
说明:LCM1602_WriteCMD是写命令函数,void LCM1602_WriteData是写数据函数
**********************************************************************************************/
void LCM1602_WriteCMD(uchar LCM1602_command)
{
BOOL lcd_bz();
while(lcd_bz()); //测忙
L1602_RS=0;
L1602_RW=0;
L1602_E=0;
_nop_();
_nop_();
L1602_DB0_DB7=LCM1602_command;
_nop_();
_nop_();_nop_();
L1602_E=1; //命令总送出
_nop_();_nop_();_nop_();
L1602_E=0;
}
// 测忙函数
void LCM1602_WriteData(uchar LCM1602_data)
{
BOOL lcd_bz();
while(lcd_bz()); //测忙
L1602_RS=1;
L1602_RW=0;
L1602_E=0;
L1602_DB0_DB7=LCM1602_data;
_nop_();
_nop_();
_nop_();
_nop_();
L1602_E=1; //数据送出
_nop_();
_nop_();
_nop_();
L1602_E=0;
}
/**********************************************************************************************
函数名称:LCD检测忙函数
函数功能:检测LCD是否处于忙状态
说明:
**********************************************************************************************/
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
L1602_RS=0;
L1602_RW=1;
L1602_E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
L1602_E = 0;
return result;
}
/**********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -