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

QQ登錄

只需一步,快速開始

帖子
查看: 3464|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STC12C5A60S2+DH11溫濕度傳感器 11.0592晶振 延時(shí)是用示波器掐的

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:260379 發(fā)表于 2019-1-14 10:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include <STC12C5A60S2.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="TEMP:";
  5. uchar code table1[]="HUMI:";
  6. //請(qǐng)根據(jù)自己的dht11接的IO口來改動(dòng)位定義
  7. sbit dht11 = P3^2;
  8. sbit rw=P2^5;

  9. //防止在與硬件通信時(shí)發(fā)生死循環(huán)的計(jì)數(shù)范圍
  10. #define NUMBER  2000

  11. #define SIZE 5
  12. unsigned char status;
  13. //存放五字節(jié)數(shù)據(jù)的數(shù)組
  14. unsigned char value_array[SIZE];
  15. /*可在其他的文件引用溫濕度值,實(shí)際是溫度的整數(shù)的10倍
  16. 如dht11讀回的溫度是26,則temp_value = 260, 濕度同理*/
  17. int temp=12,humi=12;   

  18. sbit lcden=P2^7;
  19. sbit lcdrs=P2^6;

  20. uchar num,a;
  21. uint c,b,d,e;
  22. void delay(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=500;y>0;y--);
  27. }
  28. void write_com(uchar com)
  29. {
  30.         lcdrs=0;
  31.         P0=com;
  32.         delay(1);
  33.         lcden=1;
  34.         delay(1);
  35.         lcden=0;
  36. }

  37. void write_data(uchar date)
  38. {
  39.         lcdrs=1;
  40.         P0=date;
  41.         delay(1);
  42.         lcden=1;
  43.         delay(1);
  44.         lcden=0;
  45. }

  46. void write_string(uchar hang,uchar add,uchar *p)
  47. {
  48.         if(hang==1)   
  49.                 write_com(0x80+add);
  50.         else
  51.                 write_com(0x80+0x40+add);
  52.                 while(1)                                                                                                                 
  53.                 {
  54.                         if(*p == '\0')  break;
  55.                         write_data(*p);
  56.                         p++;
  57.                 }        
  58. }
  59. void init_1602()
  60. {

  61.         rw=0;

  62.         lcden=0;
  63.         dht11=1;
  64.         write_com(0x38);
  65.         write_com(0x0c);
  66.         write_com(0x06);
  67.         write_com(0x01);
  68.         write_com(0x80);
  69. }

  70. void Delay_1ms(unsigned int ms)
  71. {
  72. unsigned int x, y;
  73. for(x = ms; x > 0; x--)
  74. {
  75.   for(y = 1000; y > 0; y--);
  76. }
  77. }

  78. void  Delay_10us(void)
  79. {
  80. unsigned char  i;
  81.     i--; i--; i--; i--;
  82.         i--; i--; i--; i--;
  83.     i--; i--; i--; i--;
  84.         i--; i--; i--; i--;
  85.     i--; i--;
  86.         i--; i--; i--; i--;
  87.         i--; i--; i--; i--;
  88.     i--; i--; i--; i--;
  89.         i--; i--; i--; i--;
  90.     i--; i--;
  91.         i--; i--; i--; i--;
  92.         i--; i--; i--; i--;
  93.     i--; i--; i--; i--;
  94.         i--; i--; i--; i--;
  95.     i--; i--;
  96.         i--; i--; i--; i--;
  97.     i--; i--;  
  98. }

  99. /*讀一個(gè)字節(jié)的數(shù)據(jù)*/
  100. unsigned char ReadValue(void)
  101. {
  102. unsigned char count, value = 0, i;
  103. status = 1;     //設(shè)定標(biāo)志為正常狀態(tài)
  104. for(i = 8; i > 0; i--)
  105. {
  106.   //高位在先
  107.   value <<= 1;
  108.   count = 0;
  109.   //每一位數(shù)據(jù)前會(huì)有一個(gè)50us的低電平時(shí)間.等待50us低電平結(jié)束
  110.   while(dht11 == 0);
  111.   //26-28us的高電平表示該位是0,為70us高電平表該位1
  112.   Delay_10us();
  113.   Delay_10us();

  114.   //延時(shí)30us后檢測數(shù)據(jù)線是否還是高電平
  115.   if(dht11 != 0)
  116.   {
  117.    //進(jìn)入這里表示該位是1
  118.    value++;
  119.    //等待剩余(約40us)的高電平結(jié)束
  120.    while(dht11 != 0)
  121.    {
  122.     dht11 = 1;
  123.    }
  124.   }
  125. }  
  126. return (value);
  127. }
  128. //讀一次的數(shù)據(jù),共五字節(jié)
  129. uchar rdata()
  130. {
  131. uchar i = 0, check_value = 0,count = 0;
  132.    Delay_1ms(2);


  133. dht11 = 0;       //拉低數(shù)據(jù)線大于18ms發(fā)送開始信號(hào)
  134. Delay_1ms(20);   //需大于18毫秒
  135. dht11 = 1;      //釋放數(shù)據(jù)線,用于檢測低電平的應(yīng)答信號(hào)
  136. //延時(shí)20-40us,等待一段時(shí)間后檢測應(yīng)答信號(hào),應(yīng)答信號(hào)是從機(jī)拉低數(shù)據(jù)線80us
  137. Delay_10us();
  138. Delay_10us();  
  139. if(dht11 != 0)    //檢測應(yīng)答信號(hào),應(yīng)答信號(hào)是低電平
  140. {
  141.    //沒應(yīng)答信號(hào)  
  142.   return 0;
  143. }
  144. else
  145. {
  146.   //有應(yīng)答信號(hào)
  147.   while(dht11 == 0 );   //等待應(yīng)答信號(hào)結(jié)束
  148.   count = 0;
  149.   dht11 = 1;//釋放數(shù)據(jù)線  
  150.   //應(yīng)答信號(hào)后會(huì)有一個(gè)80us的高電平等待高電平結(jié)束  
  151.   while(dht11 != 0);

  152.   //讀出濕.溫度值   
  153.      for(i = 0; i < SIZE; i++)
  154.   {
  155.    value_array[i] = ReadValue();
  156.    if(status == 0)//調(diào)用ReadValue()讀數(shù)據(jù)出錯(cuò)會(huì)設(shè)定status為ERROR
  157.    {
  158.     dht11 = 1;     
  159.     return 0;  
  160.    }
  161.    //讀出的最后一個(gè)值是校驗(yàn)值不需加上去
  162.    if(i != SIZE - 1)  
  163.    {
  164.     //讀出的五字節(jié)數(shù)據(jù)中的前四字節(jié)數(shù)據(jù)和等于第五字節(jié)數(shù)據(jù)表示成功
  165.     check_value += value_array[i];  
  166.    }
  167.   }//end for
  168.   //在沒用發(fā)生函數(shù)調(diào)用失敗時(shí)進(jìn)行校驗(yàn)
  169.   if(check_value == value_array[SIZE - 1])
  170.   {
  171.    //將溫濕度擴(kuò)大10倍方便分離出每一位
  172.    humi = value_array[0] * 10;
  173.    temp = value_array[2] * 10;





  174.   dht11 = 1;
  175.     return 0;    //正確的讀出dht11輸出的數(shù)據(jù)   
  176.   }
  177.   else
  178.   {
  179.    //校驗(yàn)數(shù)據(jù)出錯(cuò)  
  180.       return 0;
  181.   }
  182. }      
  183. }

  184. void main()
  185. {
  186.                 uchar x;
  187.                 x=1;
  188.                 init_1602();
  189.                 for(num=0;num<5;num++)
  190.                         {
  191.                                 write_data(table[num]);
  192.                                 delay(5);
  193.                         }
  194.                 write_com(0x80+0x40);
  195.                  for(num=0;num<5;num++)
  196.                         {
  197.                                 write_data(table1[num]);
  198.                                 delay(5);
  199.                         }
  200.                         while(1)
  201.                         {
  202.                         rdata();
  203.                 write_com(0x80+0x05);
  204.                 write_data(temp/100+'0');
  205.                 delay(x);
  206.                 write_data(temp%100/10+'0');
  207.                 delay(x);
  208.                 write_com(0x80+0x45);
  209.                 write_data(humi/100+'0');
  210.                 delay(x);
  211.                 write_data(humi%100/10+'0');
  212.                  delay(x);
  213.                                 
  214.                         write_string(1,8,"com");
  215. //                write_com(0x80+0x09);
  216. //                delay(x);
  217. //                write_data(c/10000+'0');
  218. //                delay(x);
  219. //                write_data(c%10000/1000+'0');
  220. //                delay(x);
  221. //                write_data(c%10000%1000/100+'0');
  222.         
  223. }
  224.                            
  225. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-1-14 15:13 | 只看該作者
用示波器掐的?
回復(fù)

使用道具 舉報(bào)

板凳
ID:260379 發(fā)表于 2019-1-18 16:50 | 只看該作者

嗯  對(duì)時(shí)間要求有點(diǎn)小嚴(yán)格 所以用示波器一點(diǎn)一點(diǎn)試的
回復(fù)

使用道具 舉報(bào)

地板
ID:984027 發(fā)表于 2021-11-28 15:55 來自手機(jī) | 只看該作者
我的怎么不顯示
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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