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

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

QQ登錄

只需一步,快速開始

搜索
查看: 4846|回復(fù): 3
收起左側(cè)

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

[復(fù)制鏈接]
ID:661367 發(fā)表于 2019-12-11 12:09 | 顯示全部樓層 |閱讀模式
基于DHT11溫濕度傳感器的孵化系統(tǒng)供初學(xué)者練習(xí)。主要有DHT11驅(qū)動(dòng)并將溫濕度顯示等。
1.png
單片機(jī)源程序如下:
  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  //步進(jìn)電機(jī)控制接口定義
  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端接單片機(jī)的P1^0口//

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

  14. sbit rs=P0^7;

  15. sbit ep=P0^5;

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

  17. uchar data_byte;

  18. uchar RH,RL,TH,TL;
  19. uchar phasecw[4] ={0x08,0x04,0x02,0x01};//電機(jī)導(dǎo)通相序 D-C-B-A
  20. uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反轉(zhuǎn)機(jī)導(dǎo)通相序 A-B-C-D
  21. void Delay_xms(uint x)                  //ms延時(shí)函數(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)                     //順時(shí)針轉(zhuǎn)動(dòng)
  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)                    //逆時(shí)針轉(zhuǎn)動(dòng)
  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)動(dòng)
  46. {
  47. MotorData=0x00;
  48. }
  49. //***************延時(shí)函數(shù)*************************************

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

  51. {

  52.   uchar i;

  53.   while(ms--)                 



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

  55. }


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

  57. {

  58.   uchar i;

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

  60. }



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

  62. //lcd模塊//

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

  64. {

  65. BOOL result;
  66.   rs=0;           // 讀忙信號(hào)
  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兩行顯示一個(gè)數(shù)據(jù)由5*7點(diǎn)陣表示,數(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)光標(biāo)不閃爍

  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);//修改此時(shí)間可以改變LCD上數(shù)值跳變的數(shù)度

  137. }



  138. //**************************dht11測(cè)試某塊*************************************//

  139. void start()//開始信號(hào)

  140. {

  141.   io=1;

  142.   delay1();

  143.   io=0;

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

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

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

  147.   delay1();

  148.   delay1();

  149. }



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

  151. {

  152.   uchar i,temp;

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

  154.   {

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

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

  157.          delay1();

  158.         delay1();

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

  160.         if(io==1)

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

  162.     while(io);//等待數(shù)據(jù)信號(hào)高電平'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();//開始信號(hào)//

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

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

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

  176.         while(io);//判斷從機(jī)發(fā)出 80us 的高電平是否結(jié)束如結(jié)束則主機(jī)進(jìn)入數(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();//校驗(yàn)位

  182.         io=0; //當(dāng)最后一bit數(shù)據(jù)接完畢后從機(jī)拉低電平50us//

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

  184.         delay1();

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

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

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

  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表示帶字庫(kù)的LCD1602中0x30的位置放有數(shù)字0RH/10+0x30即表示濕度的十位數(shù)字在字庫(kù)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);//以下兩個(gè)是溫度單位的處理

  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) // 定時(shí)50ms    定時(shí)20次是1秒,再乘以14400是四個(gè)小時(shí)
  262.    {
  263.                 for(i=0;i<500;i++)
  264.   {
  265.    MotorCW();                          //順時(shí)針轉(zhuǎn)動(dòng)
  266.   }
  267.   MotorStop();                         //停止轉(zhuǎn)動(dòng)
  268.   Delay_xms(500);
  269.   for(i=0;i<500;i++)
  270.   {
  271.    MotorCCW();                         //逆時(shí)針轉(zhuǎn)動(dòng)
  272.   }
  273.   MotorStop();                         //停止轉(zhuǎn)動(dòng)
  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)


回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

ID:65237 發(fā)表于 2020-5-7 21:37 | 顯示全部樓層
樓主上機(jī)實(shí)測(cè)過沒 我上機(jī)測(cè)不行啊 沒收到數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 韩日一区二区三区 | 国产综合精品一区二区三区 | 宅男噜噜噜66一区二区 | 中文字幕乱码一区二区三区 | 国产成人精品一区二区三区在线 | 天天玩夜夜操 | 国产视频在线观看一区二区三区 | 国产精品美女久久久久久久网站 | 久久久久国产 | 中文字幕国产精品 | 天天操网 | 久久免费视频1 | 黑人巨大精品欧美一区二区免费 | 欧美xxxx黑人又粗又长 | 国产一区h| 久久精品aaa| 激情网五月天 | 国产精品久久久久久久久久久久久 | 欧美日韩在线一区二区三区 | 在线观看中文字幕 | 综合伊人 | 成人在线观看网站 | 国产精品久久久久一区二区三区 | 日韩午夜影院 | 亚洲成人一级 | 国产美女黄色 | 国产一区二区av | 一区二区三区视频 | 国内精品一区二区 | 日韩有码一区 | 亚洲美女一区二区三区 | 天天艹逼网 | 久久蜜桃av一区二区天堂 | 91九色porny首页最多播放 | 亚洲精品日韩一区二区电影 | 91免费视频 | 欧美精品久久久 | 久久99精品久久久久久琪琪 | 亚洲欧美综合网 | 夜夜爽99久久国产综合精品女不卡 | 天天色图 |