当前位置:
文档之家› 读取DS18B20温度,通过LCD1602显示出来,并输出控制
读取DS18B20温度,通过LCD1602显示出来,并输出控制
电路原理图
程序
1.main.c #include<reg51.h> #include"lcd.h" #include"temp.h" void LcdDisplay(int); sbit K1=P2^0; sbit K2=P2^1; sbit K3=P2^2; sbit K4=P2^3; extern int th=20; extern int tl=-10; sbit beep=P1^0; void main() { LcdInit(); LcdWriteCom(0xc7); LcdWriteData('C'); while(1)
{ LcdWriteCom(0x32); LcdWriteCom(0x28); LcdWriteCom(0x0c); LcdWriteCom(0x06); LcdWriteCom(0x01); LcdWriteCom(0x80); } #endif 5.temp.c #include"temp.h" void Delay1ms(unsigned int y) //延时 { unsigned int x; for(y;y>0;y--) for(x=110;x>0;x--); } unsigned char Ds18b20Init() //初始化 { unsigned int i; DSPORT=0; i=70; while(i--); DSPORT=1; i=0; while(DSPORT) { i++; if(i>5000) return 0;//失败 } return 1;//成功 } void Ds18b20WriteByte(unsigned char dat) //写字节
beep=0; else beep=1; LcdWriteCom(0x80); LcdWriteData('T'); LcdWriteCom(0x81); LcdWriteData('A'); LcdWriteCom(0x82); LcdWriteData('I'); LcdWriteData(' '); LcdWriteCom(0x84); LcdWriteData('A'); LcdWriteCom(0x85); LcdWriteData('N'); LcdWriteCom(0xc1); LcdWriteData('0'+datas[0]); LcdWriteCom(0xc2); LcdWriteData('0'+datas[1]); LcdWriteCom(0xc3); LcdWriteData('0'+datas[2]); LcdWriteCom(0xc4); LcdWriteData('.'); LcdWriteCom(0xc5); LcdWriteData('0'+datas[3]); LcdWriteCom(0xc6); LcdWriteData('"'); } 2.lcd.h #ifndef __LCD_H_ #define __LCD_H_ /********************************** 当使用的是4位数据传输的时候定义, 使用8位取消这个定义 **********************************/
LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DATAPINS = com; Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5); LCD1602_E = 0; } #else void LcdWriteCom(uchar com) { LCD1602_E = 0; LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四 位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5); LCD1602_E = 0; LCD1602_DATAPINS = com << 4; //发送低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif #ifndef LCD1602_4PINS void LcdWriteData(uchar dat) { LCD1602_E = 0; LCD1602_RS = 1; LCD1602_RW = 0;
{ if(K1==0) { Delay1ms(500); if(K1==0); th++; } if(K2==0) { Delay1ms(500); if(K2==0); th--; } if(K3==0) { Delay1ms(500); if(K3==0); tl++; } if(K4==0) { Delay1ms(500); if(K4==0); tl--; } LcdDisplay(Ds18b20ReadTemp()); } } void LcdDisplay(int temp) { int i,tt,rr,mm; unsigned char datas[] = {0, 0, 0, 0},datas1[] = {0, 0, 0},datas2[] = {0, 0, 0}; float tp; if(temp< 0) {
LcdWriteCom(0xc0); LcdWriteData('-'); i=1; temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*10+0.5; mm=-temp; } else { LcdWriteCom(0xc0); LcdWriteData('+'); tp=temp; temp=tp*0.0625*10+0.5; mm=temp; } datas[0] = temp / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp% 10; if(th < 0) { LcdWriteCom(0x89); LcdWriteData('-'); tt=-th; } else { LcdWriteCom(0x89); LcdWriteData('+'); tt=th; } datas1[0] = tt / 100; datas1[1] = tt% 100 / 10; datas1[2] = tt % 10;
LcdWriteCom(0x87); LcdWriteData('H'); LcdWriteCom(0x88); LcdWriteData(':'); LcdWriteCom(0x8a); LcdWriteData('0'+datas1[0]); LcdWriteCom(0x8b); LcdWriteData('0'+datas1[1]); LcdWriteCom(0x8c); LcdWriteData('0'+datas1[2]); if(tl < 0) { LcdWriteCom(0x90); LcdWriteData('-'); rr=-tl; } else { LcdWriteCom(0x90); LcdWriteData('+'); rr=tl; } datas2[0] = rr / 100; datas2[1] = rr% 100 / 10; datas2[2] = rr % 10; LcdWriteCom(0x8e); LcdWriteData('L'); LcdWriteCom(0x8f); LcdWriteData(':'); LcdWriteCom(0x91); LcdWriteData('0'+datas2[0]); LcdWriteCom(0x92); LcdWriteData('0'+datas2[1]); LcdWriteCom(0x93); LcdWriteData('0'+datas2[2]); if(mm>=(th*10)||mm<=(tl*10)||th<=tl)
#define LCD1602_4PINS /********************************** 包含头文件 **********************************/ #include<reg51.h> //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif /********************************** PIN口定义 **********************************/ #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; /********************************** 函数声明 **********************************/ /*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差 0us /*LCD1602写入8位命令子函数*/ void LcdWriteCom(uchar com); /*LCD1602写入8位数据子函数*/ void LcdWriteData(uchar dat) ; /*LCD1602初始化子程序*/ void LcdInit(); #endif