Overall layout
This temperature alarm system is specifically 3-way detection and alarm, 2-way display.
There are mainly four parts to form the single-chip microcomputer part, display part, led alarm part, sensor part
MCU and LED alarm part
The clock frequency of 80c51 is 12MHz
The following is the specific configuration
Sensor ds18b20 part
The following is the specific configuration
Display LM016L part
The following is the specific configuration
Code part
#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS=P2^4; sbit RW=P2^1; sbit EN=P2^2; sbit DQ=P3^2; sbit LED1=P1^0; sbit LED2=P1^3; sbit LED3=P1^7; uchar code str1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}; uchar code str2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9}; uchar code str3[]={0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0}; uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; uchar data disdata[5]; uint tvalue;//Temperature data storage uchar tflag;//Temperature sign bit uint high=600;//Highest temperature uint low=100;//Cryogenic temperature /*************************lcd1602 Initialization**************************/ void delay1ms(uint ms)//1ms delay { uint i,j; for(i=0;i<ms;i++) for(j=0;j<100;j++); } void wr_com(uchar com) //Write instruction to LCD1602 { delay1ms(1); RS=0;//instructions RW=0;//Write in EN=0;// P0=com; delay1ms(1); EN=1;//allow delay1ms(1); EN=0; } void wr_dat(uchar dat)//Write data to LCD1602 { delay1ms(1);; RS=1;//data RW=0;//Write in EN=0; P0=dat; delay1ms(1); EN=1;//allow delay1ms(1); EN=0; } void wr_new() //Set display position { uchar i; wr_com(0x40); for(i=0;i<8;i++) { wr_dat(table[ i]); } } void lcd_init()//Display string function { delay1ms(15); wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); wr_new(); wr_com(0x80); wr_dat('A'); wr_com(0x81); wr_dat(':'); wr_com(0x89); wr_dat(0x00); wr_com(0x8a); wr_dat('C'); wr_com(0xc9); wr_dat(0x00); wr_com(0xca); wr_dat('C'); wr_com(0xc0); wr_dat('B'); wr_com(0xc1); wr_dat(':'); } /******************************ds18b20 Part**************************************/ void delay_18B20(uint i)//Delay Functions { while(i--); } void ds1820rst()/ds18b20 { uchar x=0; DQ = 1; //DQ pull up delay_18B20(4); //Delay 20us DQ = 0; //DQ pull down delay_18B20(100); //Delay 480us DQ = 1; //pull up delay_18B20(40);delayed200us } uchar ds1820rd()//data fetch { uchar i=0; uchar dat = 0; for (i=0;i<8;i++) { DQ = 0; //Pull down dat>>=1; DQ = 1; //pull up if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar dat)//Write data { uchar i=0; for (i=0; i<8; i++) { DQ = 0; DQ = dat&0x01; delay_18B20(10); DQ = 1; dat>>=1; } } void b20_Matchrom(uchar a) //Match 3 ROM s respectively { char j; ds1820wr(0x55); //Send matching ROM sequence if(a==1) { for(j=0;j<8;j++) ds1820wr(str1[j]); //Send 18B20 serial number, send low byte first } if(a==2) { for(j=0;j<8;j++) ds1820wr(str2[j]); //Send 18B20 serial number, send low byte first } if(a==3) { for(j=0;j<8;j++) ds1820wr(str3[j]); //Send 18B20 serial number, send low byte first } } read_temp(uchar z)/*Temperature reading and conversion*/ { uchar a,b; float tt; ds1820rst(); ds1820wr(0xcc); //Skip serial number read ds1820rst(); if(z==1) { b20_Matchrom(1); //Match ROM 1 } if(z==2) { b20_Matchrom(2); //Match ROM 2 } if(z==3) { b20_Matchrom(3); //Match ROM 3 } ds1820wr(0x44);//Start temperature conversion delay1ms(5); ds1820rst(); ds1820wr(0xcc); //Skip temperature reading ds1820rst(); if(z==1) { b20_Matchrom(1); //Match ROM 1 } if(z==2) { b20_Matchrom(2); //Match ROM 2 } if(z==3) { b20_Matchrom(3); //Match ROM 3 } ds1820wr(0xbe);//Read temperature a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tt=tvalue*0.0625; tvalue=tt*10; return(tvalue); } /*****************Display function******************************/ void ds1820disp(uchar z)//Temperature display { uchar flagdat; disdata[0]=tvalue/1000+0x30;//Display 100 bit disdata[1]=tvalue%1000/100+0x30;//Display ten bits disdata[2]=tvalue%100/10+0x30;//Display bit disdata[3]=tvalue%10+0x30;//Display decimal places if(tflag==0) flagdat=0x20;//Sign bit is positive else flagdat=0x2d;//Sign bit is negative if(disdata[0]==0x30) {disdata[0]=0x20;//If the hundred bit is 0, it will not be displayed if(disdata[1]==0x30) {disdata[1]=0x20;//If the tens are not 0, they will not be displayed } } if(z==1) { wr_com(0x82); wr_dat(flagdat);//Sign bit wr_com(0x83); wr_dat(disdata[0]);//Hundred digit number wr_com(0x84); wr_dat(disdata[1]);//Ten digit number wr_com(0x85); wr_dat(disdata[2]);//Single digit wr_com(0x86); wr_dat(0x2e);//Decimal point wr_com(0x87); wr_dat(disdata[3]);//Decimal place } if(z==2) { wr_com(0xc2); wr_dat(flagdat);//·Sign bit wr_com(0xc3); wr_dat(disdata[0]);//Hundred digit number wr_com(0xc4); wr_dat(disdata[1]);//Ten digit number wr_com(0xc5); wr_dat(disdata[2]);//Single digit wr_com(0xc6); wr_dat(0x2e);//Decimal point wr_com(0xc7); wr_dat(disdata[3]);//Decimal place } } void alarm(uchar z)//Alarm function { if(z==1) { if(tvalue>high|tvalue<low) LED1=1; else LED1=0; } if(z==2) { if(tvalue>high|tvalue<low) LED2=1; else LED2=0; } if(z==3) { if(tvalue>high|tvalue<low) LED3=1; else LED3=0; } } /********************Main function***********************************/ void main() { lcd_init();//LCD1602 while(1) { read_temp(1);//Read data ds1820disp(1);//Display data alarm(1); //Temperature detection read_temp(2);//Read data ds1820disp(2);//Display data alarm(2); read_temp(3);//Read data alarm(3); } } //-----------------------------------------------
Please refer to the data manual for the reason of delay setting
Baidu can get
The author is a beginner. If you have any mistakes, please correct them.
This article is the author's original