单片机——温度传感器

2019-04-15 17:06发布

    今天利用数字温度传感器DS18B20与单片机结合写了一段程序,利用数字温度传感器DS18B20测量温度信号,计算后在1602显示屏上显示出当前的室内温度。其测量的温度范围为-55~125摄氏度,基本上符合我们正常的温度需求。   有关DS18B20的详细资料,可以点击这里,首先我们需要根据DS18B20的时序图特性写代码进行初始化,启动温度转换,读暂存器等一些操作。将读好的数据转换成我们需要的float型的数据显示在1602显示屏上,下面是具体的实现代码: #include #include #include #define dataport P0 unsigned char code b[10]={'0','1','2','3','4','5','6','7','8','9'} ; unsigned char temp[3] ; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 sbit RS = P2^6 ; sbit RW = P2^5 ; sbit EN = P2^7 ; void delayms(unsigned int xms) { unsigned int i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void DelayUs2x(unsigned char t) { while(--t); } sbit DQ = P3^7 ; bit DS18B20_Init() { bit dat; DQ = 1; DelayUs2x(5); DQ = 0; //给一个下降沿 DelayUs2x(200); DelayUs2x(200); //延时480us < t < 960us DQ = 1; DelayUs2x(50); //15~60us以后,在60~240us之间,接受应答信号 dat = DQ; //dat = 0 初始化成功 dat = 1 初始化失败 // UART_SendStr(); DelayUs2x(25); //延时后返回 return dat; } void write_char(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { DQ = 0; DelayUs2x(5); DQ = dat & 0x01; //发送数据 DelayUs2x(25); //延时15~60us DQ = 1; dat >>= 1; } } unsigned char ReadChar() { unsigned char dat,i; for (i = 0; i < 8; i++) { DQ = 0; dat >>= 1; DQ = 1; if (DQ) { dat |= 0x80; } DelayUs2x(25); } return dat; } unsigned int ReadTemp(void) { unsigned char Temp_L = 0; unsigned int Temp_H = 0; unsigned int Temp; DS18B20_Init(); //初始化 write_char(0xCC); //跳过ROM write_char(0x44); //启动温度转换 delayms(10); //等待转换结果 DS18B20_Init(); write_char(0xCC); write_char(0xBE); //读温度暂存器(共9字节),一般只读前两个,第一个是低八位,第二个是高八位 Temp_L = ReadChar(); Temp_H = ReadChar(); Temp_H <<= 8; Temp = Temp_L + Temp_H; return Temp; } void LCD_Write_Comand(unsigned char comand) //写指令 { delayms(5) ; RS_CLR ; RW_CLR ; EN_SET ; dataport = comand ; _nop_() ; EN_CLR ; } void LCD_Write_Data(unsigned char data1) //写数据 { delayms(5) ; RS_SET ; RW_CLR ; EN_SET ; dataport = data1 ; _nop_() ; EN_CLR ; } void Init() //对1602显示器进行初始化 { EN_CLR ; LCD_Write_Comand(0x38) ; delayms(5) ; LCD_Write_Comand(0x38) ; delayms(5) ; LCD_Write_Comand(0x38) ; delayms(5) ; LCD_Write_Comand(0x38) ; LCD_Write_Comand(0x08) ; //显示关闭 LCD_Write_Comand(0x01) ; //显示清屏 LCD_Write_Comand(0x06) ; //显示光标移动设置 LCD_Write_Comand(0x0C) ; //显示开及光标设置 } void LCD_Clear() //清屏 { LCD_Write_Comand(0x01) ; delayms(5) ; } void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) //显示屏上写入字符串 { if(y == 0) { LCD_Write_Comand(0x80+x) ; } else { LCD_Write_Comand(0xC0+x) ; } while(*s) { LCD_Write_Data(*s) ; // delayms(255) ; s++; } } void main() { unsigned char wendu[16] ; float i ; int a; DS18B20_Init(); Init() ; LCD_Clear() ; while(1) { a = ReadTemp(); i = (float)a*0.0625 ; sprintf(wendu,"%f",i) ; LCD_Write_String(0,0,"Temperature:") ; LCD_Write_String(3,1,wendu) ; } }