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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機+DHT11的孵化裝置流程圖+程序

[復制鏈接]
ID:661367 發表于 2019-12-11 12:09 | 顯示全部樓層 |閱讀模式
基于DHT11溫濕度傳感器的孵化系統供初學者練習。主要有DHT11驅動并將溫濕度顯示等。
1.png
單片機源程序如下:
  1. # include <reg51.h>
  2. # include <intrins.h>
  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;
  5. unsigned char c;
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define MotorData P0  //步進電機控制接口定義
  9. sbit PENWU=P2^0;          //加濕器接口定義
  10. sbit FengShan1=P1^1;  //風扇1接口定義
  11. sbit FengShan2=P1^2;  // 風扇2接口定義      
  12. sbit io=P1^0;         //dht11out端接單片機的P1^0口//

  13. sbit rw=P0^6;         //以下三行是設置lcd1602的使能端//

  14. sbit rs=P0^7;

  15. sbit ep=P0^5;

  16. typedef bit BOOL;     //此聲明一個布爾型變量即真或假//

  17. uchar data_byte;

  18. uchar RH,RL,TH,TL;
  19. uchar phasecw[4] ={0x08,0x04,0x02,0x01};//電機導通相序 D-C-B-A
  20. uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反轉機導通相序 A-B-C-D
  21. void Delay_xms(uint x)                  //ms延時函數
  22. {
  23. uint i,j;
  24. for(i=0;i<x;i++)
  25.   for(j=0;j<112;j++);
  26. }
  27. void MotorCW(void)                     //順時針轉動
  28. {
  29. uchar i;
  30. for(i=0;i<4;i++)
  31.   {
  32.    MotorData=phasecw[i];
  33.    Delay_xms(4);                       //轉速調節
  34.   }
  35. }
  36. void MotorCCW(void)                    //逆時針轉動
  37. {
  38. uchar i;
  39. for(i=0;i<4;i++)
  40.   {
  41.    MotorData=phaseccw[i];
  42.    Delay_xms(4);                       //轉速調節
  43.   }
  44. }
  45. void MotorStop(void)                   //停止轉動
  46. {
  47. MotorData=0x00;
  48. }
  49. //***************延時函數*************************************

  50. void delay(uchar ms) //延時模塊//

  51. {

  52.   uchar i;

  53.   while(ms--)                 



  54. for(i=0;i<100;i++);

  55. }


  56. void delay1()//一個for循環大概需要8個多機器周期一個機器周期為1us晶振為12MHz也就是說本函數延時8us多此延時函數必須德稍微精確一點

  57. {

  58.   uchar i;

  59.   for(i=0;i<1;i++);

  60. }



  61. //***************************************************************  

  62. //lcd模塊//

  63. BOOL lcd_bz()//測試lcd忙碌狀態返回值為布爾型數值真或假'1'.'0'  

  64. {

  65. BOOL result;
  66.   rs=0;           // 讀忙信號
  67.   rw=1;
  68.   ep=1;
  69.   _nop_();
  70.   _nop_();
  71.   _nop_();
  72.   _nop_();
  73.   result = (BOOL)(P2&0x80);
  74.   ep=0;
  75.   result ;

  76. }     

  77. void write_cmd(uchar cmd)//寫指令//

  78. {

  79.   while (lcd_bz());
  80.   rs=0;
  81.   rw=0;
  82.   ep=0;
  83.   _nop_();
  84.   _nop_();
  85.   P2=cmd ;
  86.   _nop_();
  87.   _nop_();
  88.   _nop_();
  89.   _nop_();
  90.   ep=1;
  91.   _nop_();
  92.   _nop_();
  93.   _nop_();
  94.   _nop_();
  95.   ep=0;

  96. }



  97. void write_addr(uchar addr)//寫地址//

  98. {

  99.   write_cmd(addr|0x80);//LCD第一行的首地址為0x80第二行的首地址為0x80+0x40=0xc0

  100. }



  101. void write_byte(uchar dat) //寫字節//

  102. {

  103.    while (lcd_bz());
  104.   rs=1;
  105.   rw=0;
  106.   ep=0;
  107.   _nop_();
  108.   _nop_();
  109.   P2=dat ;
  110.   _nop_();
  111.   _nop_();
  112.   _nop_();
  113.   _nop_();
  114.   ep=1;
  115.   _nop_();
  116.   _nop_();
  117.   _nop_();
  118.   _nop_();
  119.   ep=0;

  120. }



  121. void lcd_init() //lcd初始化//

  122. {

  123.   write_cmd(0x38);//設置LCD兩行顯示一個數據由5*7點陣表示,數據由八根線傳輸

  124.   delay(1);

  125.   write_cmd(0x0c);//清除屏幕顯示

  126.   delay(1);

  127.   write_cmd(0x06);//設定輸入方式增量不移位

  128.   delay(1);

  129.   write_cmd(0x01);//開整體顯示關光標不閃爍

  130.   delay(1);

  131. }



  132. void display(uchar addr,uchar q)//在某一地址上顯示內容adder表示的是地址偏移量q表示顯示的字符或數字//

  133. {

  134.   delay(10);   write_addr(addr);

  135.   write_byte(q);

  136.   delay(1);//修改此時間可以改變LCD上數值跳變的數度

  137. }



  138. //**************************dht11測試某塊*************************************//

  139. void start()//開始信號

  140. {

  141.   io=1;

  142.   delay1();

  143.   io=0;

  144.   delay(25);// 主機把總線拉低必須大于18ms保證DHT11能檢測到起始信號

  145.   io=1;    //發送開始信號結束后拉高電平延時20-40us

  146.   delay1();//以下三個延時函數差不多為24us符合要求

  147.   delay1();

  148.   delay1();

  149. }



  150. uchar receive_byte()//接收一個字節//

  151. {

  152.   uchar i,temp;

  153.   for(i=0;i<8;i++)//接收8bit的數據

  154.   {

  155.         while(!io);//等待50us的低電平開始信號結束

  156.         delay1();//開始信號結束之后延時26us-28us以下三個延時函數

  157.          delay1();

  158.         delay1();

  159.         temp=0;//時間為26us-28us表示接收的為數據'0'

  160.         if(io==1)

  161.          temp=1; //如果26us-28us之后還為高電平則表示接收的數據為'1'

  162.     while(io);//等待數據信號高電平'0'為26us-28us'1'為70us

  163.         data_byte<<=1;//接收的數據為高位在前右移

  164.          data_byte|=temp;

  165.   }

  166.   return data_byte;

  167. }



  168. void receive()//接收數據//

  169. {

  170.   uchar T_H,T_L,R_H,R_L,check,num_check,i;

  171.   start();//開始信號//

  172.   io=1;   //主機設為輸入判斷從機DHT11響應信號

  173.   if(!io)//判斷從機是否有低電平響應信號//

  174.   {  
  175.         while(!io);//判斷從機發出 80us 的低電平響應信號是否結束//

  176.         while(io);//判斷從機發出 80us 的高電平是否結束如結束則主機進入數據接收狀態

  177.         R_H=receive_byte();//濕度高位

  178.         R_L=receive_byte();//濕度低位

  179.         T_H=receive_byte();//溫度高位

  180.         T_L=receive_byte();//溫度低位

  181.         check=receive_byte();//校驗位

  182.         io=0; //當最后一bit數據接完畢后從機拉低電平50us//

  183.         for(i=0;i<7;i++)//差不多50us的延時

  184.         delay1();

  185.         io=1;//總線由上拉電阻拉高進入空閑狀態

  186.         num_check=R_H+R_L+T_H+T_L;

  187.         if(num_check==check)//判斷讀到的四個數據之和是否與校驗位相同

  188.         {

  189.    RH=R_H;

  190.    RL=R_L;

  191.    TH=T_H;

  192.    TL=T_L;

  193.    check=num_check;

  194.         }

  195.   }

  196. }

  197. //*****************************************************************************


  198. void FengShan1QD(void)
  199. {
  200.         FengShan1=1;
  201. }
  202. void FengShan1TZ(void)
  203. {
  204.         FengShan1=0;
  205. }
  206. void FengShan2QD(void)
  207. {
  208.         FengShan2=1;
  209. }
  210. void FengShan2TZ(void)
  211. {
  212.         FengShan2=0;
  213. }
  214. void PENWUQD(void)
  215. {
  216.         PENWU=1;
  217. }
  218. void PENWUTZ(void)
  219. {
  220.         PENWU=0;
  221. }
  222. void main()//主函數模塊//

  223. {
  224.   lcd_init();//初始化LCD

  225.   while(1)

  226.   {
  227.     receive();//接收數據

  228. display(0x00,'R');//LCD的第一行顯示

  229. display(0x01,':');

  230. display(0x02,RH/10+0x30); //0x30表示帶字庫的LCD1602中0x30的位置放有數字0RH/10+0x30即表示濕度的十位數字在字庫RH/10+0x30的位置處放著

  231. display(0x03,RH%10+0x30);

  232. display(0X04,'%');

  233. display(0x40,'T');//LCD的第二行顯示

  234. display(0x41,':');

  235. display(0x42,TH/10+0x30);

  236. display(0x43,TH%10+0x30);

  237. display(0x44,0xdf);//以下兩個是溫度單位的處理

  238. display(0x45,0x43);
  239. if(RH<65)//濕度定義
  240.                 PENWUQD();
  241.         if(RH>75)
  242.                 PENWUTZ();
  243.         if(TH>37)//溫度定義
  244.                 FengShan2QD();
  245.         if(TH<34)
  246.                 FengShan2TZ();
  247.         Delay_xms(50);                        //等待系統穩定
  248. TMOD=0x01;
  249.     TH0=(65536-50000)/256;
  250.     TL0=(65536-50000)%256;
  251.     EA=1;  ET0=1;
  252.     TR0=1;
  253.         c=0;
  254.         while(1);
  255. }
  256. }
  257. void timer0() interrupt 1
  258. {         uint i;
  259. TR0=0;
  260. c++;
  261.    if(c==100) // 定時50ms    定時20次是1秒,再乘以14400是四個小時
  262.    {
  263.                 for(i=0;i<500;i++)
  264.   {
  265.    MotorCW();                          //順時針轉動
  266.   }
  267.   MotorStop();                         //停止轉動
  268.   Delay_xms(500);
  269.   for(i=0;i<500;i++)
  270.   {
  271.    MotorCCW();                         //逆時針轉動
  272.   }
  273.   MotorStop();                         //停止轉動
  274.   Delay_xms(500);  
  275. }
  276. else
  277. MotorStop();
  278.     TH0=(65536-50000)/256;
  279.     TL0=(65536-50000)%256;
  280.         TR0=1;
  281. }
復制代碼

所有資料51hei提供下載:
孵化裝置.zip (40.6 KB, 下載次數: 25)


回復

使用道具 舉報

ID:197152 發表于 2020-4-2 13:15 | 顯示全部樓層
代碼里的p2換p0
回復

使用道具 舉報

ID:738997 發表于 2020-4-27 06:40 來自觸屏版 | 顯示全部樓層
吳海晨o 發表于 2020-4-2 13:15
代碼里的p2換p0

這個改了之后可以直接燒錄使用嗎?
回復

使用道具 舉報

ID:65237 發表于 2020-5-7 21:37 | 顯示全部樓層
樓主上機實測過沒 我上機測不行啊 沒收到數據
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区视频免费在线观看 | 天堂在线中文 | 欧美国产精品久久久 | 欧美精品在线观看 | 成人免费一级 | 老熟女毛片 | 日日夜夜精品视频 | 最新超碰 | 久久精品一区二区视频 | 日韩和的一区二在线 | 久久艹av| 国产激情在线播放 | 国产精品福利网站 | 蜜桃av一区二区三区 | 国产精品无码久久久久 | 天天干天天谢 | www.99热.com| 一区观看 | 婷婷久久综合 | 一区二区三区免费在线观看 | 在线观看免费av网 | 日韩视频免费看 | 精品国产一区二区三区观看不卡 | 在线欧美亚洲 | 密色视频 | 蜜桃精品视频在线 | 日韩免费视频一区二区 | 妞干网福利视频 | 精品国产一区二区三区久久影院 | 久久精品色欧美aⅴ一区二区 | 日日夜夜操天天干 | 欧美午夜精品理论片a级按摩 | 国产精品亚洲成在人线 | 亚洲欧美激情精品一区二区 | 国产精品日韩一区 | 欧美视频成人 | 国产精品日日做人人爱 | 日本不卡免费新一二三区 | 97综合在线| 91视频播放 | 视频一区二区中文字幕日韩 |