18b20 dht11的51單片機驅動程序
00000.png (31.11 KB, 下載次數: 191)
下載附件
2016-1-11 18:55 上傳
dht11單片機源程序:
- #include"DHT11.h"
- #include"delay.h"
- #define uchar unsigned char
- #define uint unsigned uint
- uchar onedata;
- uchar rh,rl,th,tl;
- sbit JS=P1^4;
- void start(void)//起始信號
- {
- JS=1;
- delay_us(8);
- JS=0;
- delay_ms(20);//主機總線拉低大于18毫秒
- JS=1;
- delay_us(25);//發送起始信號結束后,拉高電平25US
- }
- uchar Receive_Byte()//接收一個字節
- {
- uchar i,temp;
- for(i=0;i<8;i++) //接收八位數據
- {
- while(!JS); //等待50us的低電平開始信號結束
- delay_us(25);//開始信號結束之后延時25us
- temp=0; //時間在26us—28us 接收數據為‘0’
- if(JS==1)
- temp=1; //時間在26us—28us之后還為高電平 接收數據為‘1’
- while(JS); //等待數據信號高電平26us—28us 接收數據為‘0’,70us為‘1’
- onedata<<=1;
- onedata|=temp;
- }
- return onedata;
- }
- void receive(void)//接收數據
- {
- uchar t_h,t_l,r_h,r_l;
- uchar check,num_check;
- start(); //開始信號
- JS=1; //主機何為輸入,判斷從機 DUL11 相應信號
- if(!JS) //判斷從機是否有低電平響應信號
- {
- while(!JS);//判斷從機發出80us的低電平響應信號是否結束
- while(JS); //判斷從機80us的高電平是否結束 結束則主機進入接收狀態
- r_h=Receive_Byte();
- r_l=Receive_Byte();
- t_h=Receive_Byte();
- t_l=Receive_Byte();
- check=Receive_Byte(); //校驗位
- JS=0;
- delay_us(50);//當最后一位數據接收完畢時從機拉低50us的低電平
- JS=1; //主機有上啦電阻拉高進入空閑狀態
- num_check=r_h+r_l+t_h+t_l;
- if(num_check==check)
- {
- rh=r_h;
- rl=r_l;
- th=t_h;
- tl=t_l;
- check=num_check;
- }
- }
- }
- void Get_Air_Humidity() //獲取空氣濕度
- {
- start(); //DHT11起始信號
- receive();//獲取DHT11溫濕度
- //SendData_Uart1(rh);//串口輸出濕度值
- }
復制代碼
ds18b20單片機源程序:
- #include"DS18B20.h"
- #define uchar unsigned char
- #define uint unsigned int
- //18b20測溫
- sbit DQ=P3^6;
- sbit boom=P3^5;
- uchar fuhao; //判斷溫度的正負
- uchar temp_int=0;//定義溫度的整數部分
- uint temp_point=0;//定義溫度的小數部分
- uint temp,tempflag=261;
- //char a,b,c,d,e,f,g,h;
- //void delay(uchar i)
- //{
- // while(i--);
- //}
-
- /*初始化18b20*/
- void Init_18b20(void)
- {
- P3M1=0X00;
- P3M0=0X40;
- DQ=1; //復位18b20
- delay_us(16);
- DQ=0; //拉低DQ
- delay_us(160);
- DQ=1; //拉高DQ
- delay_us(100);
- }
- /*讀一個字節*/
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat=0;
- P3M1=0X00;
- P3M0=0X00;
- for(i=8;i>0;i--)
- {
- DQ=0; //給脈沖信號
- dat>>=1;
- delay_us(1);
- DQ=1; //給脈沖信號
- if(DQ)
- {
- dat|=0x80;
- }
- delay_us(20);
- }
- return(dat);
- }
- /*寫一個字節*/
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- P3M1=0X00;
- P3M0=0X40;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay_us(20);
- DQ=1;
- dat>>=1;
- }
- delay_us(8);
- }
- /*寫RAm中的三四字節的內容*/
- void Write_Calm(void)
- {
- Init_18b20();
- WriteOneChar(0xCC);//跳過讀序列號操作
- WriteOneChar(0x4E);//寫溫度上下限及配置寄存器
- WriteOneChar(50); //寫溫度上限
- WriteOneChar(0); //寫溫度下限
- WriteOneChar(0x7f);//默認十二位精度
- }
- /*讀取溫度*/
- void ReadTemperature(void)
- {
- uchar low=0;
- uchar high=0;
- uint t=0;
- Init_18b20();
- WriteOneChar(0xCC); //跳過讀序列號操作
- WriteOneChar(0x44); //啟動溫度轉換
- LCD_write_Num(36,1,temp_int);
- Init_18b20();
- WriteOneChar(0xCC); //跳過讀序列號操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共9個可讀寄存器)前兩個就是溫度
- low=ReadOneChar(); //讀取溫度最低值
- high=ReadOneChar(); //讀取溫度最高值
- fuhao=high&0xf0; //取得溫度的符號,fuhao==0溫度為正或0,否則為負
- if(fuhao!=0)
- {
- t=65536-(high<<8|low)+1;
- high=t/256;
- low=t%256;
- }
- temp_point=(low&0x0f)*625;
- low=low>>4; //低位右移4位,舍棄小數部分
- high=high<<4; //高位左移4為,舍棄符號位
- temp_int=high|low;
-
- temp=temp_int%100*10+temp_point/1000;
- }
復制代碼
完整代碼(包含頭文件)下載:
溫濕度.rar
(2.64 KB, 下載次數: 138)
2016-1-11 11:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|