|
芯片是STC89C52RC,在csdn等地方試了很多人的代碼都不成功,所以來求助各位大佬,我想把dht11采集到的溫濕度打印到串口上。
在Keil5點擊build以后,燒錄到單片機上,打開串口打印的都是“?借鑒的main.c代碼:DHT11溫濕度傳感器連接51單片機打印到串口_dht11與51單片機怎么連接-CSDN博客
main.c
- #include <at89c51RC2.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data=P3^6; //定義數據線
- uchar rec_dat[9]; //用于顯示的接收數據數組
- void DHT11_delay_us(uchar n)
- {
- while(--n);
- }
- void DHT11_delay_ms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20); //延時18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- uchar DHT11_rec_byte() //接收一個字節
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數據
- {
- while(!Data); 等待50us低電平過去
- DHT11_delay_us(8); //延時60us,如果還為高則數據為1,否則為0
- dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
- if(Data==1) //數據為1時,使dat加1來接收數據1
- dat+=1;
- while(Data); //等待數據線拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的數據
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0); //等待拉高
- DHT11_delay_us(40); //拉高后延時80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位
- DHT11_delay_us(25); //結束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*數據處理,方便顯示*/
- rec_dat[0]='0'+(RH/10);
- rec_dat[1]='0'+(RH%10);
- rec_dat[2]='R';
- rec_dat[3]='H';
- rec_dat[4]=' ';
- rec_dat[5]=' ';
- rec_dat[6]='0'+(TH/10);
- rec_dat[7]='0'+(TH%10);
- rec_dat[8]='C';
- }
- }
- void initSBUF() //設定定時器1,用于串口中斷
- {
- TMOD=0x20; //設定T1定時器工作方式2
- TH1=0xfd; //T1定時器裝初值
- TL1=0xfd; //T1定時器裝初值
- TR1=1; //啟動T1定時器
- REN=1; //允許串口接收
- SM0=0; //設定串口工作方式1
- SM1=1; //設定串口工作方式1
- EA=1; //開總中斷
- ES=1; //開串口中斷
- }
- void main()
- {
- char code Ready_dat[13]="\tReady OK!\n";
- uchar i;
- initSBUF(); //串口初始化
- //每次使用printf函數TI要先置1
- ES=0;
- for(i=0 ;i<13 ;i++) //修改輸出的字符數量
- {
- SBUF=Ready_dat[i];
- while(!TI);
- TI=0;
- }
-
- while(1)
- {
- DHT11_delay_ms(4500); //DHT11上電后要等待1S以越過不穩定狀態在此期間不能發送任何指令
- DHT11_receive();
- ES=0;
- for(i=0 ;i<9 ;i++) //修改輸出的字符數量
- {
- SBUF=rec_dat[i];
- while(!TI);
- TI=0;
- }
-
- for(i=0 ;i<13 ;i++) //修改輸出的字符數量
- {
- SBUF=Ready_dat[i];
- while(!TI);
- TI=0;
- }
- }
- }
復制代碼
intrins.h
- #ifndef __INTRINS_H__
- #define __INTRINS_H__
-
- extern void _nop_ (void);
- extern bit _testbit_ (bit);
- extern unsigned char _cror_ (unsigned char val, unsigned char n);
- extern unsigned int _iror_ (unsigned int val, unsigned char n);
- extern unsigned long _lror_ (unsigned long val, unsigned char n);
- extern unsigned char _crol_ (unsigned char val, unsigned char n);
- extern unsigned int _irol_ (unsigned int val, unsigned char n);
- extern unsigned long _lrol_ (unsigned long val, unsigned char n);
- extern unsigned char _chkfloat_(float);
- extern void _push_ (unsigned char _sfr);
- extern void _pop_ (unsigned char _sfr);
-
- #endif
復制代碼
|
-
Keil界面
-
實物接線
-
串口助手
-
-
csdn3.zip
2025-3-2 12:58 上傳
點擊文件名下載附件
24.92 KB, 下載次數: 0
壓縮包里是所有代碼文件
|