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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2498|回復: 3
打印 上一主題 下一主題
收起左側

DHT11制作的溫濕度計程序有錯誤,希望高手指教一下

[復制鏈接]
跳轉到指定樓層
樓主
/*P0口段輸出,P2口位控制,前兩位數碼管顯示濕度,后三位顯示溫度,溫度值為-19.9度至99.9度之間,顯示負溫度時要在前面加負號,小數點隨溫度變化要改變他的位置。下面程序數碼管不顯示,請高手指教!*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define TEMP_MEASURE 0x03   //000 00011 測試溫度命令
#define HUMI_MEASURE 0x05   //000 00101 測試溫度命令

sbit DHT_DATA=P1^6;
sbit DHT_SCK=P1^7;

uchar code SEGMENT_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x46,0x79,0x38,0x76};//0,1,2,3,4,5,6,7,8,9,熄滅,-,-1,E,L,H

uchar code BIT_CODE[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0x3f,0xc7,0x00};

uchar wen,a,shan,tt,sec_point,shift,shi_12,shi_a,sec_point_flag,DHT_TIME,TEMP_LOW,TEMP_HIGH;

uchar k_d_s;

uchar  tab1[9];

uchar  tab2[9];

uchar DHT_L,DHT_H,DHT_ACK,DHT_ERROR;

unsigned  int  VALUE_TEMP,VALUE_HUMI,DIS_TEMP,DIS_HUMI;//濕度顯示值

uchar TEMP_SIGNS;

uchar TEMP_L_BYTE,TEMP_H_BYTE,TEMP_DECIMAL;

/*************************************************
                 延時程序
**************************************************/
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=60;y>0;y--);
}

/*************************************************

         DHT61讀高低兩個字節,返回應答信號

**************************************************/

void DHT61_READ_TWO_BYTE()
{
  unsigned char i,val=0;
  DHT_L=0;
  DHT_H=0;
  DHT_DATA=1;                           //釋放數據總線
  for (i=0x80;i>0;i/=2)             //位移8位
     { DHT_SCK=1;                          //上升沿讀入
       if (DHT_DATA) val=(val | i);        //確定值  
       DHT_SCK=0;                                          
     }
  DHT_DATA=0;                        //讀應答信號,有應答為1,無應答為0 通過CPU下拉為應答
  DHT_SCK=1;                            //第9個脈沖
   _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us
  DHT_SCK=0;                                                   
  DHT_DATA=1;                           //釋放數據總線
  DHT_H=val;
  val=0;

////低8位/////////////////////////////

  DHT_DATA=1;                           //釋放數據總線
  for (i=0x80;i>0;i/=2)             //位移8位
     { DHT_SCK=1;                          //上升沿讀入
       if (DHT_DATA) val=(val | i);        //確定值  
       DHT_SCK=0;                                          
     }
  DHT_DATA=1;//0;                        //不需要應答 通過CPU下拉為應答
  DHT_SCK=1;                            //第9個脈沖
   _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us
  DHT_SCK=0;                                                   
  DHT_DATA=1;                           //釋放數據總線
  DHT_L=val;

}

/**************************************************

           向DHT61寫一個字節 返回應答信號

*****************************************************/
char WRITE_DHT61_BYTE(unsigned char value)
{
  unsigned char i ;
   DHT_ACK=0;  
  for (i=0x80;i>0;i/=2)             //釋放數據總線
  { if (i & value) DHT_DATA=1;          //寫入值
    else DHT_DATA=0;                        
    DHT_SCK=1;                          //上升沿寫入
     _nop_(); _nop_(); _nop_();        //延時        
    DHT_SCK=0;
  }
  DHT_DATA=1;                           //釋放數據總線
  DHT_SCK=1;                            //第9個脈沖
  if  (DHT_DATA==1) DHT_ACK=1;
                         //讀應答信號
  DHT_SCK=0;        
  return DHT_ACK;                     //error=1 表示沒有應答
}

/**************************

函數功能:DHT61啟動時序

***************************/
void DHT_START(void)
{  
   DHT_DATA=1; DHT_SCK=0;                   //數據為1,SCK=0
    _nop_();
   DHT_SCK=1;                          //第一個脈沖
    _nop_();
   DHT_DATA=0;                         //數據跌落
    _nop_ ();
   DHT_SCK=0;                         //完成一個脈沖
    _nop_(); _nop_(); _nop_();
   DHT_SCK=1;                         //再一個脈沖
    _nop_();
   DHT_DATA=1;                        //數據變為1                  
    _nop_();
   DHT_SCK=0;                         //完成該脈沖                  
}

/**************************

       DHT61復位時序

***************************/
void DHT_RESET(void)

{  
  unsigned char i;
  DHT_DATA=1; DHT_SCK=0;                    //數據為1 時鐘為0
  for(i=0;i<9;i++)                  //9 個脈沖為 復位
  { DHT_SCK=1;
    DHT_SCK=0;
  }
  DHT_START();                   //啟動
}

/***********************************************

    DHT61測量溫度或者是溫度,返回校驗值

***********************************************/
void DHT_MEASURE(unsigned char ml)
        {
                  DHT_START();                   //啟動
                  WRITE_DHT61_BYTE(ml);//寫入測溫度
                 if (DHT_ACK==1)
                    {
                         DHT_RESET() ;//復位
                  WRITE_DHT61_BYTE(ml);//寫入測溫度
             }

  }
/**************************

     DHT61溫度處理

/***************************/
void PROCESS_DHT_TEMP()
{
    float aa=0,bb=0,temp_zi;
        int   abcd=0;

aa=(float)DHT_H*256+(float)DHT_L;
temp_zi=0.01*aa-40;

if  (temp_zi<0)
    {TEMP_SIGNS=1;
         temp_zi=-temp_zi*10;
        VALUE_TEMP=(int)temp_zi;
        if(VALUE_TEMP>=200) TEMP_LOW=1;
        else TEMP_LOW=0;
    }
else {TEMP_SIGNS=0;
   temp_zi=temp_zi*10;
   VALUE_TEMP=(int)temp_zi;//給顯示值
   }
   }
/**************************

      DHT61濕度處理

***************************/
void PROCESS_DHT_HUMI()
{
    float aa=0,bb=0,humi_zi;
        int   abcd=0;

aa=(float)DHT_H*256+(float)DHT_L;

bb=aa*aa*2.8/1000000;
aa=0.0405*aa;
aa=aa-4-bb;
humi_zi=aa;

if  (humi_zi>99.9)
    {
          humi_zi=99.9;
    }
    humi_zi=humi_zi*10;
   VALUE_HUMI=(int)humi_zi;
   }

/*************************************************
            萬年歷顯示子程序
**************************************************/

void display()
{      
         
           
          DIS_HUMI=VALUE_HUMI;
          P0=SEGMENT_CODE[DIS_HUMI/100];
          P2=BIT_CODE[12];
         
                                      
          DIS_HUMI=DIS_HUMI%100;
          P0=SEGMENT_CODE[DIS_HUMI/10];
    P2=BIT_CODE[12];
         
          DIS_TEMP=VALUE_TEMP;
          DIS_TEMP=DIS_TEMP%1000;

          /* 下為修正負溫度顯示而加 可顯示-19.9~99.9溫度 下  */

        if(TEMP_SIGNS==1)                                                                                                  

          {
                        if((DIS_TEMP/100)==0)
                        
                        P0=SEGMENT_CODE[11];

                        if((DIS_TEMP/100)==1)

                        P0=SEGMENT_CODE[12];

                        if((DIS_TEMP/100)>1)

                        P0=SEGMENT_CODE[13];

          }
          /*   上 為修正負溫度顯示而加  可顯示-19.9~99.9溫度 上 */

          else
                        
                P0=SEGMENT_CODE[DIS_TEMP/100];
          P2=BIT_CODE[12];
         
   /* 為修正負溫度顯示而加  溫度低于-20攝氏度時,顯示E-L */
         
                if(TEMP_LOW==1)
                        {
                                P0=SEGMENT_CODE[11];         
                          P0=SEGMENT_CODE[14];
                        }
          else
                        {
                                DIS_TEMP=DIS_TEMP%100;
                                
                P0=SEGMENT_CODE[DIS_TEMP/10]|0x80;
                                
          DIS_TEMP=DIS_TEMP%10;
                                
          P0=SEGMENT_CODE[DIS_TEMP%10];
                        
                        }
                        
     P2=BIT_CODE[12];
           P0=SEGMENT_CODE[10];
           P2=BIT_CODE[12];
                }                        
         
/*************************************************
                   主程序
**************************************************/

void main()

{
        TMOD=1;
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        shan=0x00;
        DHT_DATA=1;
        DHT_SCK=1;
        while(1)
        {
        }        
     DHT_ERROR=0;
           DHT_ACK=0;
     DHT_RESET() ;//復位
           DHT_MEASURE(TEMP_MEASURE);

        while (DHT_DATA)
          {
           }
    DHT61_READ_TWO_BYTE();//讀溫度
        PROCESS_DHT_TEMP();
    DHT_MEASURE(HUMI_MEASURE);
    while(DHT_DATA)
          {
          }
   DHT61_READ_TWO_BYTE();//讀溫度
   PROCESS_DHT_HUMI();
                  
        }
/*************************************************
            定時中斷子程序
**************************************************/

        void time0() interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        display();
        tt++;
        sec_point++;
        if(tt==50)                        //設置閃爍
        {tt=0;
         shan=~shan;
         }
        if(sec_point==100)        //秒點閃爍
        {        sec_point=0;
                sec_point_flag=~sec_point_flag;
        }
}


截圖00.png (42.26 KB, 下載次數: 54)

截圖00.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:701046 發表于 2020-4-7 15:19 | 只看該作者
自己頂一下!高手幫忙啊!
回復

使用道具 舉報

板凳
ID:97249 發表于 2020-4-10 22:32 | 只看該作者
for (i=0x80;i>0;i/=2)             //釋放數據總線  0x80十進制=128
{ DHT_SCK=1;                          //上升沿讀入
       if (DHT_DATA) val=(val | i);        //確定值  
        DHT_SCK=0;                                          
      }
   DHT_DATA=0;                        //讀應答信號,有應答為1,無應答為0 通過CPU下拉為應答
  DHT_SCK=1;                            //第9個脈沖
   _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us
   DHT_SCK=0;                                                   
   DHT_DATA=1;                           //釋放數據總線
  DHT_H=val;
   val=0;
表示看不懂你的代碼
回復

使用道具 舉報

地板
ID:1064915 發表于 2024-2-23 17:36 | 只看該作者


//****************************************************************//
2
// DHT11使用范例
3
//單片機 : AT89S52 或 STC89C52RC
4
// 功能 :串口發送溫濕度數據 波特率 9600
5
//硬件連接: P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機的電源和地,單片機串口加MAX232連接電腦
6
#include <reg51.h>
7
#include <intrins.h>
8
//
9
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
10
typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
11
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
12
typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
13
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
14
typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
15
typedef float F32; /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
16
typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
17
//
18
#define uchar unsigned char
19
#define uint unsigned int
20
#define Data_0_time 4
21
//--------------- --------------------//
22
//----------------IO口定義區--------------------//
23
//-------------- --------------------------//
24
sbit P2_0 = P2^0 ;//DATA
25
sbit P2_1 = P2^1 ;
26
sbit P2_2 = P2^2 ;
27
sbit P2_3 = P2^3 ;
28
//--------- ------------------------------------//
29
//----------------定義區--------------------//
30
//--------------------- -----------------------//
31
U8 U8FLAG,k;
32
U8 U8count,U8temp;
33
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
34
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
35
U8 U8comdata;
36
U8 outdata[5]; //定義發送的字節數
37
U8 indata[5];
38
U8 count, count_r=0;
39
U8 str[5]={"RS232"};
40
U16 U16temp1,U16temp2;
41
42
SendData(U8 *a)
43
{
44
    outdata[0] = a[0];
45
    outdata[1] = a[1];
46
    outdata[2] = a[2];
47
    outdata[3] = a[3];
48
    outdata[4] = a[4];
49
    count = 1;
50
    SBUF=outdata[0];
51
}
52
53
void Delay(U16 j)
54
{
55
    U8 i;
56
    for(;j>0;j--)
57
    {
58
        for(i=0;i<27;i++);
59
    }
60
}
61
62
void Delay_10us(void)
63
{
64
    U8 i;
65
    i--;
66
    i--;
67
    i--;
68
    i--;
69
    i--;
70
    i--;
71
}
72
73
void COM(void)
74
{
75
    U8 i;
76
    for(i=0;i<8;i++)
77
    {
78
    U8FLAG=2;
79
    //----------------------
80
    P2_1=0 ; //T
81
    P2_1=1 ; //T
82
    //----------------------
83
    while((!P2_0)&&U8FLAG++);
84
    Delay_10us();
85
    Delay_10us();
86
    // Delay_10us();
87
    U8temp=0;
88
    if(P2_0)U8temp=1;
89
    U8FLAG=2;
90
    while((P2_0)&&U8FLAG++);
91
    //----------------------
92
    P2_1=0 ; //T
93
    P2_1=1 ; //T
94
    //----------------------
95
    //超時則跳出for循環
96
    if(U8FLAG==1)break;
97
    //判斷數據位是0還是1
98
    // 如果高電平高過預定0高電平值則數據位為 1
99
    U8comdata<<=1;
100
    U8comdata|=U8temp; //0
101
    }//rof
102
}
103
104
//------------  --------------------
105
//-----濕度讀取子程序 ------------
106
//----------------------  ----------
107
//----以下變量均為全局變量--------
108
//----溫度高8位== U8T_data_H------
109
//----溫度低8位== U8T_data_L------
110
//----濕度高8位== U8RH_data_H-----
111
//----濕度低8位== U8RH_data_L-----
112
//----校驗 8位 == U8checkdata-----
113
//----調用相關子程序如下----------
114
//---- Delay();, Delay_10us();COM();
115
//---------------------    -----------
116
void RH(void)
117
{
118
    //主機拉低18ms
119
    P2_0=0;
120
    Delay(180);
121
    P2_0=1;
122
    //總線由上拉電阻拉高 主機延時20us
123
    Delay_10us();
124
    Delay_10us();
125
    Delay_10us();
126
    Delay_10us();
127
    //主機設為輸入 判斷從機響應信號
128
    P2_0=1;
129
    //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
130
    if(!P2_0) //T !
131
    {
132
        U8FLAG=2;
133
        //判斷從機是否發出 80us 的低電平響應信號是否結束
134
        while((!P2_0)&&U8FLAG++);
135
        U8FLAG=2;
136
        //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
137
        while((P2_0)&&U8FLAG++);
138
        //數據接收狀態
139
        COM();
140
        U8RH_data_H_temp=U8comdata;
141
        COM();
142
        U8RH_data_L_temp=U8comdata;
143
        COM();
144
        U8T_data_H_temp=U8comdata;
145
        COM();
146
        U8T_data_L_temp=U8comdata;
147
        COM();
148
        U8checkdata_temp=U8comdata;
149
        P2_0=1;
150
        //數據校驗
151
        U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
152
        if(U8temp==U8checkdata_temp)
153
        {
154
            U8RH_data_H=U8RH_data_H_temp;
155
            U8RH_data_L=U8RH_data_L_temp;
156
            U8T_data_H=U8T_data_H_temp;
157
            U8T_data_L=U8T_data_L_temp;
158
            U8checkdata=U8checkdata_temp;
159
        }//fi
160
    }//fi
161
}
162
163
//---------------------------------------
164
//main()功能描述: AT89C51 11.0592MHz 串口發
165
//送溫濕度數據,波特率 9600
166
//----------------------------------------------
167
void main()
168
{
169
    U8 i,j;
170
    //uchar str[6]={"RS232"};
171
    /* 系統初始化 */
172
    TMOD = 0x20; //定時器T1使用工作方式2
173
    TH1 = 253; // 設置初值
174
    TL1 = 253;
175
    TR1 = 1; // 開始計時
176
    SCON = 0x50; //工作方式1,波特率9600bps,允許接收
177
    ES = 1;
178
    EA = 1; // 打開所以中斷
179
    TI = 0;
180
    RI = 0;
181
    SendData(str) ; //發送到串口
182
    Delay(1); //延時100US(12M晶振)
183
    while(1)
184
    {
185
        //------------------------
186
        //調用溫濕度讀取子程序
187
        RH();
188
        //串口顯示程序
189
        //--------------------------
190
        str[0]=U8RH_data_H;
191
        str[1]=U8RH_data_L;
192
        str[2]=U8T_data_H;
193
        str[3]=U8T_data_L;
194
        str[4]=U8checkdata;
195
        SendData(str) ; //發送到串口
196
        //讀取模塊數據周期不易小于 2S
197
        Delay(20000);
198
    }//elihw
199
}// main
200
201
void RSINTR() interrupt 4 using 2
202
{
203
    U8 InPut3;
204
    if(TI==1) //發送中斷
205
    {
206
        TI=0;
207
        if(count!=5) //發送完5位數據
208
        {
209
            SBUF= outdata[count];
210
            count++;
211
        }
212
    }
213
    if(RI==1) //接收中斷
214
    {
215
        InPut3=SBUF;
216
        indata[count_r]=InPut3;
217
        count_r++;
218
        RI=0;
219
        if (count_r==5)//接收完4位數據
220
        {
221
            //數據接收完畢處理。
222
            count_r=0;
223
            str[0]=indata[0];
224
            str[1]=indata[1];
225
            str[2]=indata[2];
226
            str[3]=indata[3];
227
            str[4]=indata[4];
228
            P0=0;
229
        }
230
    }
231
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av在线电影网站 | 伊人网国产 | 欧美在线免费 | 日韩精品免费在线观看 | 午夜www| 免费国产视频在线观看 | 色狠狠一区| 亚洲h视频| 国产在线视频99 | 日韩免费在线视频 | 国产精品视频一区二区三区 | 搞黄网站在线观看 | 91精品国产色综合久久 | 久久久精品综合 | 国产一区二区三区免费观看视频 | 99久久婷婷国产综合精品首页 | 欧美乱人伦视频 | 欧美一区二区三区免费电影 | 一区二区成人在线 | 免费观看一级黄色录像 | 亚洲欧美一区二区三区在线 | 欧美一级在线 | 国产成视频在线观看 | 亚洲欧美在线观看视频 | 岛国毛片| 日韩精品一区二区三区在线播放 | 亚洲欧美视频一区 | 欧美精品一二三 | 成人午夜视频在线观看 | 日本精品视频一区二区三区四区 | 91国在线高清视频 | 日日夜夜操天天干 | h视频在线免费 | 嫩草视频在线免费观看 | 精品成人在线视频 | 日韩精品一区二区三区在线播放 | 宅女噜噜66国产精品观看免费 | 国产精品99久久久久久动医院 | ririsao久久精品一区 | 伊人欧美视频 | 91文字幕巨乱亚洲香蕉 |