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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3392|回復: 3
收起左側

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

[復制鏈接]
ID:260379 發表于 2019-1-14 10:20 | 顯示全部樓層 |閱讀模式
  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. //請根據自己的dht11接的IO口來改動位定義
  7. sbit dht11 = P3^2;
  8. sbit rw=P2^5;

  9. //防止在與硬件通信時發生死循環的計數范圍
  10. #define NUMBER  2000

  11. #define SIZE 5
  12. unsigned char status;
  13. //存放五字節數據的數組
  14. unsigned char value_array[SIZE];
  15. /*可在其他的文件引用溫濕度值,實際是溫度的整數的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. /*讀一個字節的數據*/
  100. unsigned char ReadValue(void)
  101. {
  102. unsigned char count, value = 0, i;
  103. status = 1;     //設定標志為正常狀態
  104. for(i = 8; i > 0; i--)
  105. {
  106.   //高位在先
  107.   value <<= 1;
  108.   count = 0;
  109.   //每一位數據前會有一個50us的低電平時間.等待50us低電平結束
  110.   while(dht11 == 0);
  111.   //26-28us的高電平表示該位是0,為70us高電平表該位1
  112.   Delay_10us();
  113.   Delay_10us();

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


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

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





  174.   dht11 = 1;
  175.     return 0;    //正確的讀出dht11輸出的數據   
  176.   }
  177.   else
  178.   {
  179.    //校驗數據出錯  
  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. }
復制代碼
回復

使用道具 舉報

ID:1 發表于 2019-1-14 15:13 | 顯示全部樓層
用示波器掐的?
回復

使用道具 舉報

ID:260379 發表于 2019-1-18 16:50 | 顯示全部樓層

嗯  對時間要求有點小嚴格 所以用示波器一點一點試的
回復

使用道具 舉報

ID:984027 發表于 2021-11-28 15:55 來自手機 | 顯示全部樓層
我的怎么不顯示
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 不卡一二三区 | 国产一区二区三区四区五区加勒比 | 国产精品999 | 中文字幕在线第一页 | 国产999在线观看 | 亚洲精品黄色 | a毛片 | 龙珠z在线观看 | 欧美视频一区二区三区 | 一区二区三区四区在线视频 | h片在线免费看 | 中文字幕一区在线观看视频 | 亚洲综合无码一区二区 | 日韩区 | 久久99深爱久久99精品 | 久久精品国产亚洲a | 久久国产日韩欧美 | 99久久精品免费看国产四区 | 国产成人自拍一区 | 国产在线色 | 日韩欧美不卡 | 天堂一区二区三区 | 亚洲天堂中文字幕 | 日韩在线精品视频 | 久久大香 | 日韩淫片免费看 | 国产一二三区精品视频 | 午夜国产精品视频 | 亚洲狠狠爱 | 欧美午夜精品 | 国产欧美在线 | 亚洲aⅴ| 国产成人99久久亚洲综合精品 | 中文字幕视频一区 | 国产欧美日韩在线播放 | 99精品九九 | 天天干视频网 | 免费a大片 | 一区二区三区视频在线 | 91精品国产91综合久久蜜臀 | 欧美成人不卡 |