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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:661367 發(fā)表于 2019-12-11 12:09 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于DHT11溫濕度傳感器的孵化系統(tǒng)供初學(xué)者練習(xí)。主要有DHT11驅(qū)動并將溫濕度顯示等。

單片機源程序如下:
  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;  //風(fēng)扇1接口定義
  11. sbit FengShan2=P1^2;  // 風(fēng)扇2接口定義      
  12. sbit io=P1^0;         //dht11out端接單片機的P1^0口//

  13. sbit rw=P0^6;         //以下三行是設(shè)置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ǎo)通相序 D-C-B-A
  20. uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反轉(zhuǎn)機導(dǎo)通相序 A-B-C-D
  21. void Delay_xms(uint x)                  //ms延時函數(shù)
  22. {
  23. uint i,j;
  24. for(i=0;i<x;i++)
  25.   for(j=0;j<112;j++);
  26. }
  27. void MotorCW(void)                     //順時針轉(zhuǎn)動
  28. {
  29. uchar i;
  30. for(i=0;i<4;i++)
  31.   {
  32.    MotorData=phasecw[i];
  33.    Delay_xms(4);                       //轉(zhuǎn)速調(diào)節(jié)
  34.   }
  35. }
  36. void MotorCCW(void)                    //逆時針轉(zhuǎn)動
  37. {
  38. uchar i;
  39. for(i=0;i<4;i++)
  40.   {
  41.    MotorData=phaseccw[i];
  42.    Delay_xms(4);                       //轉(zhuǎn)速調(diào)節(jié)
  43.   }
  44. }
  45. void MotorStop(void)                   //停止轉(zhuǎn)動
  46. {
  47. MotorData=0x00;
  48. }
  49. //***************延時函數(shù)*************************************

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

  51. {

  52.   uchar i;

  53.   while(ms--)                 



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

  55. }


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

  57. {

  58.   uchar i;

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

  60. }



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

  62. //lcd模塊//

  63. BOOL lcd_bz()//測試lcd忙碌狀態(tài)返回值為布爾型數(shù)值真或假'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) //寫字節(jié)//

  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);//設(shè)置LCD兩行顯示一個數(shù)據(jù)由5*7點陣表示,數(shù)據(jù)由八根線傳輸

  124.   delay(1);

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

  126.   delay(1);

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

  128.   delay(1);

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

  130.   delay(1);

  131. }



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

  133. {

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

  135.   write_byte(q);

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

  137. }



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

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

  140. {

  141.   io=1;

  142.   delay1();

  143.   io=0;

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

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

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

  147.   delay1();

  148.   delay1();

  149. }



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

  151. {

  152.   uchar i,temp;

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

  154.   {

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

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

  157.          delay1();

  158.         delay1();

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

  160.         if(io==1)

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

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

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

  164.          data_byte|=temp;

  165.   }

  166.   return data_byte;

  167. }



  168. void receive()//接收數(shù)據(jù)//

  169. {

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

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

  172.   io=1;   //主機設(shè)為輸入判斷從機DHT11響應(yīng)信號

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

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

  176.         while(io);//判斷從機發(fā)出 80us 的高電平是否結(jié)束如結(jié)束則主機進入數(shù)據(jù)接收狀態(tài)

  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; //當(dāng)最后一bit數(shù)據(jù)接完畢后從機拉低電平50us//

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

  184.         delay1();

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

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

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

  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()//主函數(shù)模塊//

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

  225.   while(1)

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

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

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

  230. display(0x02,RH/10+0x30); //0x30表示帶字庫的LCD1602中0x30的位置放有數(shù)字0RH/10+0x30即表示濕度的十位數(shù)字在字庫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);                        //等待系統(tǒng)穩(wěn)定
  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();                          //順時針轉(zhuǎn)動
  266.   }
  267.   MotorStop();                         //停止轉(zhuǎn)動
  268.   Delay_xms(500);
  269.   for(i=0;i<500;i++)
  270.   {
  271.    MotorCCW();                         //逆時針轉(zhuǎn)動
  272.   }
  273.   MotorStop();                         //停止轉(zhuǎn)動
  274.   Delay_xms(500);  
  275. }
  276. else
  277. MotorStop();
  278.     TH0=(65536-50000)/256;
  279.     TL0=(65536-50000)%256;
  280.         TR0=1;
  281. }
復(fù)制代碼

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:197152 發(fā)表于 2020-4-2 13:15 | 只看該作者
代碼里的p2換p0
回復(fù)

使用道具 舉報

板凳
ID:738997 發(fā)表于 2020-4-27 06:40 來自手機 | 只看該作者
吳海晨o 發(fā)表于 2020-4-2 13:15
代碼里的p2換p0

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

使用道具 舉報

地板
ID:65237 發(fā)表于 2020-5-7 21:37 | 只看該作者
樓主上機實測過沒 我上機測不行啊 沒收到數(shù)據(jù)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久国产电影 | 日韩三级视频 | 欧美精品在线观看 | 日韩在线视频一区二区三区 | 国产精品视频网站 | 在线看亚洲 | 欧美一级电影免费观看 | 欧美成人一区二免费视频软件 | 99久久精品国产一区二区三区 | 久久久国产一区 | 久久国内 | 精品国产乱码久久久久久影片 | 中文字幕在线播放不卡 | 亚洲视频观看 | 免费看黄色小视频 | 一级全黄视频 | 亚洲欧美一区二区三区国产精品 | 欧一区 | 精品国产99 | 欧美性高潮 | 国产精品视频yy9299一区 | 国产激情免费视频 | 欧美在线观看黄色 | 久久久久久久久久久久久久av | 欧美久久国产精品 | 免费成人高清在线视频 | 亚洲视频一区在线观看 | 日韩三片 | 欧美黑人一区二区三区 | 日干夜干 | 亚洲欧美日韩中文在线 | 久久久久久久国产 | 91国内精精品久久久久久婷婷 | 亚洲网站在线观看 | 日韩精品久久 | 成人一区精品 | 日本高清不卡视频 | 国产免费一区二区三区 | 2019天天干夜夜操 | 成人免费淫片aa视频免费 | 精品久久久久国产免费第一页 |