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