DS18B20溫度檢測顯示控制,已經過仿真驗證
下載:
DS18B20溫度檢測控制.docx
(15.85 KB, 下載次數: 9)
2017-6-2 23:11 上傳
點擊文件名下載附件
DS18B20溫度檢測
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P3^5; //定義LCD端口
- sbit RW=P3^6;
- sbit E=P3^7;
- sbit DQ=P3^4; //定義溫度總線端口
- sbit Wa=P1^5; //定義報警端口
- sbit ZR=P1^7; //制熱
- sbit ZL=P1^6; //制冷
- uchar LCD_3,LCD_2,LCD_1,LCD_0;
- uchar ds18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};
-
- uchar _romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};
- uchar _romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};
- uchar _romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};
- uint key_[2]={4,0}; //設置溫度標準值
- uchar code LCDData[] ="0123456789";
- uchar code dot_tab[] ="0112334456678899";
- uchar first_line[16]="A:000.0 B:000.0"; //LCD第一行顯示緩存數組 A:溫度 B:濕度
- void delay10us(uint t);
- void check_busy();
- void write_command(uchar tempdata);
- void write_data(uchar tempdata);
- void init_lcd1602();
- bit resetpulse();
- void ds18b20_init();
- uchar read_bit()
- uchar read_byte();
- void write_bit(uchar bitval);
- void write_byte(uchar val);
- bit match_rom(uchar *rom);
- void convert_T(uchar temp_data_h,uchar temp_data_l);
- void display();
- void work_temp();
- //************************************
- //延時程序
- //************************************
- //延時t*10us
- void delay10us(uint t)
- {
- do
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- while(--t);
- }
- //************************************
- //LCD1602測忙
- //************************************
- void check_busy(void)
- {
- while(1)
- {
- P0=0xff;
- E=0;
- _nop_();
- RS=0;
- _nop_();
- _nop_();
- RW=1;
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- if((P0&0x80)==0) //等于1表示液晶正忙,重復檢測直到其等于0為止
- {
- break;
- }
- E=0;
- }
- }
- //************************************
- //LCD1602寫命令
- //************************************
- void write_command(uchar tempdata)
- {
- E=0;
- _nop_();
- _nop_();
- RS=0;
- _nop_();
- _nop_();
- RW=0;
- P0=tempdata;
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- E=0;
- _nop_();
- check_busy();
- }
- //************************************
- //LCD1602寫數據
- //************************************
- void write_data(uchar tempdata)
- {
- E=0;
- _nop_();
- _nop_();
- RS=1;
- _nop_();
- _nop_();
- RW=0;
- P0=tempdata;
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- E=0;
- _nop_();
- check_busy();
- }
- //************************************
- //初始化LCD1602
- //************************************
- void init_lcd1602()
- {
- write_command(0x01); //清除屏幕
- write_command(0x38); //功能設定(8位,2行,5*7點陣式)
- write_command(0x0c); //顯示器ON,光標OFF,閃爍OFF
- write_command(0x06); //地址加1,光標右移,顯示屏不移動
- }
- //************************************
- //初始化ds18b20
- //************************************
- bit resetpulse(void)
- {
- DQ=0;
- delay10us(60); //延時600us
- DQ=1;
- delay10us(5); //延時50us
- return(DQ); //讀取P3.4的狀態
- }
- void ds18b20_init(void)
- {
- while(1)
- {
- if(!resetpulse()) //收到ds18b20的應答信號
- {
- DQ=1;
- delay10us(20); //延時200us
- break;
- }
- else
- resetpulse(); //否則再發復位信號
- }
- }
- //************************************
- //讀ds18b20一位
- //************************************
- uchar read_bit(void)
- {
- DQ=0;
- _nop_();
- _nop_();
- DQ=1;
- delay10us(3); //延時30us
- return(DQ); //讀取數據口狀態
- }
- //************************************
- //讀ds18b20一個字節
- //************************************
- uchar read_byte(void)
- {
- uchar i,m,receive_data;
- m=1;
- receive_data=0;
- for(i=0;i<8;i++) //低位在前
- {
- if(read_bit())
- {
- receive_data=receive_data+(m<<i);
- }
- delay10us(6); //延時60us
- }
- return(receive_data);
- }
- //************************************
- //向ds18b20寫一位
- //************************************
- void write_bit(uchar bitval)
- {
- DQ=0;
- if(bitval==1)
- DQ=1;
- delay10us(6); //延時60us
- DQ=1;
- }
- //************************************
- //向DS18B20寫一個字節命令
- //************************************
- void write_byte(uchar val)
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- temp=val>>i;
- temp=temp&0x01;
- write_bit(temp);
- delay10us(6);
- }
- }
- //*************************************
- //溫度的ROM序列號匹配 //*
- //*************************************
- bit match_rom(uchar *rom)
- {
- uchar i;
- ds18b20_init();
- write_byte(0x55);
- for(i=8;i>0;i--)
- {
- write_byte(*(rom+i-1));
- }
- return 1;
- }
- //*************************************
- //溫度轉換,將從ds18b20中讀出來的溫度值
- //轉化成十進制的溫度值,并存放顯示緩存
- //*************************************
- void convert_T(uchar temp_data_h,uchar temp_data_l)
- {
- uchar temp;
- if((temp_data_h&0xf0)==0xf0) //如果溫度寄存器里的高位為1,
- { //則溫度為負
- temp_data_l=~temp_data_l; //負溫度將補碼轉成二進制,
- if(temp_data_l==0xff) //取反再加1
- {
- temp_data_l=temp_data_l+0x01;
- temp_data_h=~temp_data_h;
- temp_data_h=temp_data_h+0x01;
- }
- else
- {
- temp_data_l=temp_data_l+0x01;
- temp_data_h=~temp_data_h;
- }
- LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小數位的值
- temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
- LCD_3='-'; //顯示"-"號
- LCD_2=LCDData[(temp%100)/10]; //查表得負溫度溫度十位
- LCD_1=LCDData[(temp%100)%10]; //查表得負溫度個位
- }
- else //溫度為正
- {
- LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小數位的值
- temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
- LCD_3=LCDData[temp/100]; //查表得溫度百位
- LCD_2=LCDData[(temp%100)/10]; //查表得溫度十位
- LCD_1=LCDData[(temp%100)%10]; //查表得溫度個位
- }
- }
- void display(void) //LCD顯示
- {
- uchar i;
- write_command(0x80);
- for(i=0;i<16;i++)
- {
- write_data(first_line[i]);
- }
- write_command(0xc0);
- for(i=0;i<16;i++)
- {
- write_data(second_line[i]);
- }
- }
- //*************************************
- //加熱控制,制冷控制,報警
- //*************************************
- void work_temp()
- {
- uchar tt_[2];
- uchar tt;
- uchar temp_data_l;
- uchar temp_data_h;
- temp_data_l= read_byte(); //溫度低8位
- temp_data_h = read_byte(); //溫度高8位
- tt_[0]=temp_data_l&0xf0;
- tt_[1]=temp_data_h&0x0f;
- tt=tt_[0]+tt_[1];
- if(tt>0x0A) //判斷是否高于10度
- {
- Wa=0; //報警
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|