久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 437|回復: 9
收起左側

用51單片機串口打印DHT11溫濕度數據顯示亂碼

[復制鏈接]
ID:1144670 發表于 2025-3-2 12:54 | 顯示全部樓層 |閱讀模式
芯片是STC89C52RC,在csdn等地方試了很多人的代碼都不成功,所以來求助各位大佬,我想把dht11采集到的溫濕度打印到串口上。
在Keil5點擊build以后,燒錄到單片機上,打開串口打印的都是“?借鑒的main.c代碼:DHT11溫濕度傳感器連接51單片機打印到串口_dht11與51單片機怎么連接-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;   //定義數據線
  6. uchar rec_dat[9];   //用于顯示的接收數據數組

  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);   //延時18ms以上
  23.    Data=1;
  24.    DHT11_delay_us(30);
  25. }

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

  40. void DHT11_receive()      //接收40位的數據
  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);  //拉高后延時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);    //結束

  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.         /*數據處理,方便顯示*/
  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()        //設定定時器1,用于串口中斷
  74. {
  75.         TMOD=0x20;        //設定T1定時器工作方式2
  76.         TH1=0xfd;                //T1定時器裝初值
  77.         TL1=0xfd;                //T1定時器裝初值
  78.         TR1=1;                        //啟動T1定時器
  79.         REN=1;                        //允許串口接收
  80.         SM0=0;                        //設定串口工作方式1
  81.         SM1=1;                        //設定串口工作方式1
  82.         EA=1;                                //開總中斷
  83.         ES=1;                                //開串口中斷
  84. }

  85. void main()
  86. {
  87.          char code Ready_dat[13]="\tReady OK!\n";
  88.      uchar i;
  89.      initSBUF(); //串口初始化
  90.         //每次使用printf函數TI要先置1
  91.          ES=0;
  92.          for(i=0 ;i<13 ;i++)        //修改輸出的字符數量
  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以越過不穩定狀態在此期間不能發送任何指令
  102.        DHT11_receive();
  103.            ES=0;
  104.            for(i=0 ;i<9 ;i++)        //修改輸出的字符數量
  105.            {
  106.           SBUF=rec_dat[i];
  107.           while(!TI);
  108.           TI=0;
  109.           }
  110.                                  
  111.          for(i=0 ;i<13 ;i++)        //修改輸出的字符數量
  112.          {
  113.                 SBUF=Ready_dat[i];
  114.                 while(!TI);
  115.                 TI=0;
  116.          }
  117.    }
  118. }
復制代碼

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
復制代碼












Keil界面

Keil界面

實物接線

實物接線

串口助手

串口助手

csdn3.zip

24.92 KB, 下載次數: 0

壓縮包里是所有代碼文件

回復

使用道具 舉報

ID:57657 發表于 2025-3-3 08:28 | 顯示全部樓層
樓主把串口中斷打開了,串口中斷的入口函數去哪了?
另外把 intrins.h 等Keil自帶的頭文件貼出來沒有任何意義,這個指令在Keil內部。
回復

使用道具 舉報

ID:583948 發表于 2025-3-3 09:06 | 顯示全部樓層
你講仿真調試平臺軟件串口波特率設置為9600試一試呢?是不是波特率兩邊不一致導致的
回復

使用道具 舉報

ID:446156 發表于 2025-3-3 09:57 | 顯示全部樓層
你第一次使用串口嗎,之前有沒有串口發送正常的程序
回復

使用道具 舉報

ID:1144670 發表于 2025-3-3 21:25 | 顯示全部樓層
qinlu123 發表于 2025-3-3 09:57
你第一次使用串口嗎,之前有沒有串口發送正常的程序

之前有用過串口
串口.png
回復

使用道具 舉報

ID:1144670 發表于 2025-3-3 21:27 | 顯示全部樓層
zpwgf 發表于 2025-3-3 09:06
你講仿真調試平臺軟件串口波特率設置為9600試一試呢?是不是波特率兩邊不一致導致的

看“打開串口”右上角波特率那里我調的就是9600
回復

使用道具 舉報

ID:1144670 發表于 2025-3-3 21:48 | 顯示全部樓層
npn 發表于 2025-3-3 08:28
樓主把串口中斷打開了,串口中斷的入口函數去哪了?
另外把 intrins.h 等Keil自帶的頭文件貼出來沒有任何意 ...

沒有串口中斷的入口函數,應該沒有關系吧,我把串口中斷關閉了以后也是這樣。
回復

使用道具 舉報

ID:446156 發表于 2025-3-4 07:48 | 顯示全部樓層
LEVKAY 發表于 2025-3-3 21:25
之前有用過串口

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

使用道具 舉報

ID:446156 發表于 2025-3-4 07:58 | 顯示全部樓層
LEVKAY 發表于 2025-3-3 21:25
之前有用過串口

你抄的這個程序PCON寄存器沒有設置啊
回復

使用道具 舉報

ID:1110945 發表于 2025-3-4 09:16 | 顯示全部樓層
用Hex模式看看接收到的是啥數據,再分析。
如果只有一個字節,說明串口中斷有問題,比如沒開中斷或中斷函數出錯等,
如果有很多字節的數據,那就要對著ASCII碼表分析數據了,波特率不對或中
斷函數有問題沒有按順序發送數據等。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频成人 | 久久久久国产 | 国产成人精品一区二 | 亚洲午夜视频 | 日韩精品一区二区三区在线播放 | 成人久久久 | 中文字幕一区二区三区精彩视频 | 在线播放中文字幕 | 涩在线 | 人人玩人人添人人澡欧美 | 成人区一区二区三区 | 国产美女在线精品免费 | 国产美女福利在线观看 | 亚洲乱码一区二区三区在线观看 | 一区二区三区日韩 | 操一草| 亚洲高清视频一区二区 | 在线啊v| av在线免费观看网址 | 久久精品二区 | 亚洲成人一区二区 | 天天插天天干 | 日本精品一区二区三区在线观看 | 91香蕉嫩草 | 日韩小视频在线 | 色天堂视频 | 欧美精品一区在线发布 | 91精品国产91 | 亚洲欧洲成人av每日更新 | 国产成人网 | 成年人在线观看 | 先锋资源吧 | 国产精品人人做人人爽 | 欧美成人一区二区三区 | 久久在线 | 精品国产一区二区三区久久久四川 | 成人片免费看 | 一级黄色片毛片 | 国产色婷婷久久99精品91 | 精品综合视频 | 日韩视频一区二区在线 |