找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 632|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

用51單片機(jī)串口打印DHT11溫濕度數(shù)據(jù)顯示亂碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
芯片是STC89C52RC,在csdn等地方試了很多人的代碼都不成功,所以來(lái)求助各位大佬,我想把dht11采集到的溫濕度打印到串口上。
在Keil5點(diǎn)擊build以后,燒錄到單片機(jī)上,打開(kāi)串口打印的都是“?借鑒的main.c代碼:DHT11溫濕度傳感器連接51單片機(jī)打印到串口_dht11與51單片機(jī)怎么連接-CSDN博客
main.c
  1. #include <at89c51RC2.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit Data=P3^6;   //定義數(shù)據(jù)線
  6. uchar rec_dat[9];   //用于顯示的接收數(shù)據(jù)數(shù)組

  7. void DHT11_delay_us(uchar n)
  8. {
  9.     while(--n);
  10. }

  11. void DHT11_delay_ms(uint z)
  12. {
  13.    uint i,j;
  14.    for(i=z;i>0;i--)
  15.       for(j=110;j>0;j--);
  16. }

  17. void DHT11_start()
  18. {
  19.    Data=1;
  20.    DHT11_delay_us(2);
  21.    Data=0;
  22.    DHT11_delay_ms(20);   //延時(shí)18ms以上
  23.    Data=1;
  24.    DHT11_delay_us(30);
  25. }

  26. uchar DHT11_rec_byte()      //接收一個(gè)字節(jié)
  27. {
  28.    uchar i,dat=0;
  29.   for(i=0;i<8;i++)    //從高到低依次接收8位數(shù)據(jù)
  30.    {         
  31.       while(!Data);   等待50us低電平過(guò)去
  32.       DHT11_delay_us(8);     //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
  33.       dat<<=1;           //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
  34.       if(Data==1)    //數(shù)據(jù)為1時(shí),使dat加1來(lái)接收數(shù)據(jù)1
  35.          dat+=1;
  36.       while(Data);  //等待數(shù)據(jù)線拉低   
  37.     }  
  38.     return dat;
  39. }

  40. void DHT11_receive()      //接收40位的數(shù)據(jù)
  41. {
  42.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  43.     DHT11_start();
  44.     if(Data==0)
  45.     {
  46.         while(Data==0);   //等待拉高     
  47.         DHT11_delay_us(40);  //拉高后延時(shí)80us
  48.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  49.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  50.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  51.         T_L=DHT11_rec_byte();    //接收溫度低八位
  52.         revise=DHT11_rec_byte(); //接收校正位

  53.         DHT11_delay_us(25);    //結(jié)束

  54.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  55.         {
  56.             RH=R_H;
  57.             RL=R_L;
  58.             TH=T_H;
  59.             TL=T_L;
  60.         }
  61.         /*數(shù)據(jù)處理,方便顯示*/
  62.         rec_dat[0]='0'+(RH/10);
  63.         rec_dat[1]='0'+(RH%10);
  64.         rec_dat[2]='R';
  65.         rec_dat[3]='H';
  66.         rec_dat[4]=' ';
  67.         rec_dat[5]=' ';
  68.         rec_dat[6]='0'+(TH/10);
  69.         rec_dat[7]='0'+(TH%10);
  70.         rec_dat[8]='C';
  71.     }
  72. }

  73. void initSBUF()        //設(shè)定定時(shí)器1,用于串口中斷
  74. {
  75.         TMOD=0x20;        //設(shè)定T1定時(shí)器工作方式2
  76.         TH1=0xfd;                //T1定時(shí)器裝初值
  77.         TL1=0xfd;                //T1定時(shí)器裝初值
  78.         TR1=1;                        //啟動(dòng)T1定時(shí)器
  79.         REN=1;                        //允許串口接收
  80.         SM0=0;                        //設(shè)定串口工作方式1
  81.         SM1=1;                        //設(shè)定串口工作方式1
  82.         EA=1;                                //開(kāi)總中斷
  83.         ES=1;                                //開(kāi)串口中斷
  84. }

  85. void main()
  86. {
  87.          char code Ready_dat[13]="\tReady OK!\n";
  88.      uchar i;
  89.      initSBUF(); //串口初始化
  90.         //每次使用printf函數(shù)TI要先置1
  91.          ES=0;
  92.          for(i=0 ;i<13 ;i++)        //修改輸出的字符數(shù)量
  93.          {
  94.                 SBUF=Ready_dat[i];
  95.                 while(!TI);
  96.                 TI=0;
  97.          }
  98.         
  99.    while(1)
  100.    {   
  101.        DHT11_delay_ms(4500);    //DHT11上電后要等待1S以越過(guò)不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
  102.        DHT11_receive();
  103.            ES=0;
  104.            for(i=0 ;i<9 ;i++)        //修改輸出的字符數(shù)量
  105.            {
  106.           SBUF=rec_dat[i];
  107.           while(!TI);
  108.           TI=0;
  109.           }
  110.                                  
  111.          for(i=0 ;i<13 ;i++)        //修改輸出的字符數(shù)量
  112.          {
  113.                 SBUF=Ready_dat[i];
  114.                 while(!TI);
  115.                 TI=0;
  116.          }
  117.    }
  118. }
復(fù)制代碼

intrins.h
  1. #ifndef __INTRINS_H__
  2. #define __INTRINS_H__

  3. extern void          _nop_     (void);
  4. extern bit           _testbit_ (bit);
  5. extern unsigned char _cror_    (unsigned char val, unsigned char n);
  6. extern unsigned int  _iror_    (unsigned int val,  unsigned char n);
  7. extern unsigned long _lror_    (unsigned long val, unsigned char n);
  8. extern unsigned char _crol_    (unsigned char val, unsigned char n);
  9. extern unsigned int  _irol_    (unsigned int val,  unsigned char n);
  10. extern unsigned long _lrol_    (unsigned long val, unsigned char n);
  11. extern unsigned char _chkfloat_(float);
  12. extern void          _push_    (unsigned char _sfr);
  13. extern void          _pop_     (unsigned char _sfr);

  14. #endif
復(fù)制代碼












下載 (1).png (358.61 KB, 下載次數(shù): 0)

Keil界面

Keil界面

下載 (2).png (4.39 MB, 下載次數(shù): 0)

實(shí)物接線

實(shí)物接線

下載.png (287.29 KB, 下載次數(shù): 0)

串口助手

串口助手

csdn3.zip

24.92 KB, 下載次數(shù): 0

壓縮包里是所有代碼文件

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:57657 發(fā)表于 2025-3-3 08:28 | 只看該作者
樓主把串口中斷打開(kāi)了,串口中斷的入口函數(shù)去哪了?
另外把 intrins.h 等Keil自帶的頭文件貼出來(lái)沒(méi)有任何意義,這個(gè)指令在Keil內(nèi)部。
回復(fù)

使用道具 舉報(bào)

板凳
ID:583948 發(fā)表于 2025-3-3 09:06 | 只看該作者
你講仿真調(diào)試平臺(tái)軟件串口波特率設(shè)置為9600試一試呢?是不是波特率兩邊不一致導(dǎo)致的
回復(fù)

使用道具 舉報(bào)

地板
ID:446156 發(fā)表于 2025-3-3 09:57 | 只看該作者
你第一次使用串口嗎,之前有沒(méi)有串口發(fā)送正常的程序
回復(fù)

使用道具 舉報(bào)

5#
ID:1144670 發(fā)表于 2025-3-3 21:25 | 只看該作者
qinlu123 發(fā)表于 2025-3-3 09:57
你第一次使用串口嗎,之前有沒(méi)有串口發(fā)送正常的程序

之前有用過(guò)串口

串口.png (493.26 KB, 下載次數(shù): 0)

串口.png
回復(fù)

使用道具 舉報(bào)

6#
ID:1144670 發(fā)表于 2025-3-3 21:27 | 只看該作者
zpwgf 發(fā)表于 2025-3-3 09:06
你講仿真調(diào)試平臺(tái)軟件串口波特率設(shè)置為9600試一試呢?是不是波特率兩邊不一致導(dǎo)致的

看“打開(kāi)串口”右上角波特率那里我調(diào)的就是9600
回復(fù)

使用道具 舉報(bào)

7#
ID:1144670 發(fā)表于 2025-3-3 21:48 | 只看該作者
npn 發(fā)表于 2025-3-3 08:28
樓主把串口中斷打開(kāi)了,串口中斷的入口函數(shù)去哪了?
另外把 intrins.h 等Keil自帶的頭文件貼出來(lái)沒(méi)有任何意 ...

沒(méi)有串口中斷的入口函數(shù),應(yīng)該沒(méi)有關(guān)系吧,我把串口中斷關(guān)閉了以后也是這樣。
回復(fù)

使用道具 舉報(bào)

8#
ID:446156 發(fā)表于 2025-3-4 07:48 | 只看該作者
LEVKAY 發(fā)表于 2025-3-3 21:25
之前有用過(guò)串口

你為什么不把你好用的串口程序和DHT11讀取程序結(jié)合一下試試呢
回復(fù)

使用道具 舉報(bào)

9#
ID:446156 發(fā)表于 2025-3-4 07:58 | 只看該作者
LEVKAY 發(fā)表于 2025-3-3 21:25
之前有用過(guò)串口

你抄的這個(gè)程序PCON寄存器沒(méi)有設(shè)置啊
回復(fù)

使用道具 舉報(bào)

10#
ID:1110945 發(fā)表于 2025-3-4 09:16 | 只看該作者
用Hex模式看看接收到的是啥數(shù)據(jù),再分析。
如果只有一個(gè)字節(jié),說(shuō)明串口中斷有問(wèn)題,比如沒(méi)開(kāi)中斷或中斷函數(shù)出錯(cuò)等,
如果有很多字節(jié)的數(shù)據(jù),那就要對(duì)著ASCII碼表分析數(shù)據(jù)了,波特率不對(duì)或中
斷函數(shù)有問(wèn)題沒(méi)有按順序發(fā)送數(shù)據(jù)等。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表