51单片机proteus仿真LCD1602+DS18B20的温度读取显示编程

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值