#include <REGX51.H>
#include "lcd1602.h"
#include "OneWire.h"
#include "ds18b20.h"
unsigned char LCD1602_Flage;
void Timer0_Init(void);
void main()
{
int temp; //保存温度数据 中间数据
float tmp; //用来温度数据
unsigned char str[12]; //保存数据转从字符串 ASCII
unsigned char len;
bit ack;
Timer0_Init();
LCD_Init();
Start18B20();
DelayXms(10);
while(1)
{
if(LCD1602_Flage)
{
LCD1602_Flage = 0;
ack = Read18B20(&temp);
if(ack)
{
if(temp<0)
{
LCD_SetPosition(0,0);
LCD_WriteData('-'); //表示负数
temp = ~temp; //负数的存储是补码 需要取反后+1 得到原码
temp = temp+1;
tmp = temp;
temp = tmp*0.0625*100; //小数点后保留两位数
}
else
{
LCD_SetPosition(0,0);
LCD_WriteData(' '); //如果为+ 此处为空格
tmp =temp;
temp = tmp*0.0625*100;//小数点后保留两位数
}
if(temp>=10000) //如果温度超过了100
{
LCD_SetPosition(2,0);
LCD_WriteData('0'+temp/10000); //百位
LCD_WriteData('0'+temp%10000/1000); //十位
LCD_WriteData('0'+temp%1000/100); //各位
LCD_WriteData('.');
LCD_WriteData('0'+temp%100/10); //小数部分
LCD_WriteData('0'+temp%10); //小数部分
}
else
{
if(temp>=1000) //温度大于等于10°C
{
LCD_SetPosition(2,0);
LCD_WriteData('0'+temp%10000/1000); //十位
LCD_WriteData('0'+temp%1000/100); //各位
LCD_WriteData('.');
LCD_WriteData('0'+temp%100/10); //小数部分
LCD_WriteData('0'+temp%10); //小数部分
LCD_WriteData(' ');//数据对齐,清除原有的显示
}
else //温度小于10
{
LCD_SetPosition(2,0);
LCD_WriteData('0'+temp%1000/100); //各位
LCD_WriteData('.');
LCD_WriteData('0'+temp%100/10); //小数部分
LCD_WriteData('0'+temp%10); //小数部分
LCD_WriteData(' ');//数据对齐,清除原有的显示
LCD_WriteData(' ');//数据对齐,清除原有的显示
}
}
}
Start18B20();
}
}
}
void Timer0_Isr(void) interrupt 1
{
static unsigned char Time0Cnt = 0;
TR0 = 0;
Time0Cnt++;
if(Time0Cnt >= 100)
{
Time0Cnt = 0;
LCD1602_Flage = 1;
}
TL0 = 0x00; //设置定时初始值
TH0 = 0xDC; //设置定时初始值
TR0 = 1;
}
void Timer0_Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0xDC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
51单片机proteus仿真LCD1602+DS18B20的温度读取显示编程
最新推荐文章于 2024-10-18 20:55:59 发布