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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2005|回復: 0
收起左側

單片機根據溫濕度控制風速源程序電路圖

[復制鏈接]
ID:864492 發表于 2020-12-21 10:42 | 顯示全部樓層 |閱讀模式
電路原理圖如下:
51hei.png
單片機源程序如下:
  1. /*溫濕度實時監測顯示,溫度測量范圍為0~+50℃; 濕度測量范圍為20%~90%;
  2. 1m/s=3.6km/h
  3. fs = 25*v  m/s = 90*v km/h   V單位是 伏



  4. ===========================================================================================*/
  5. #include"main.h"
  6. sbit set=P2^3;    //設置
  7. sbit yw=P2^2;     //移位
  8. sbit add=P2^1;    //+
  9. sbit cut=P2^0;    //-
  10. sbit change=P3^7; //切換
  11. sbit red=P1^3;sbit green=P1^4;//超限指示燈,上限,下限
  12. //===================================adc0832================================================
  13. sbit cs=P1^0; //片選
  14. sbit clk=P1^1;//時鐘
  15. sbit dio=P1^2;//數據
  16. //===========================================================================================
  17. extern uchar TH,RH;//溫度整數,濕度整數部分
  18. extern uchar dat[3];//風速上限,下限,初始化標記

  19. uchar code word1[16]= {" Wind =    km/h "};//km/h  調整界面

  20. uchar code word12[16]={"Wind=   km/h L00"};//km/h
  21. uchar code word11[16]={"Wind=   m/s  L00"};//m/s
  22. uchar code word2[16]= {"Tem=  C  Hum=  %"};//word2[4]word2[5]C          word2[13]word2[14]%

  23. uchar code hehe[16]=  {"Wind upper limit"};//設置風速上限界面
  24. uchar code haha[16]=  {"Wind lower limit"};//設置風速下限界面

  25. uchar adcdat;
  26. uint sum=0;    //5次adcdat數據之和
  27. uchar fs=0;    //風速默認   km/h

  28. bit flag1=0;   //默認 0(km/h)  1(m/s)
  29. uchar dengji=0;

  30. /**************開機初始化保存的數據*****************/
  31. void init_eeprom()
  32. {
  33.         read(0x20);read(0x22);read(0x24);//先讀
  34.         if(dat[2]!=22)                //新的單片機初始單片機內部eeprom
  35.         {
  36.                 dat[0]= 20;//初始上限
  37.                 dat[1]= 3; //初始下限
  38.                 dat[2]=22;
  39.                 EA=0;
  40.                 eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
  41.                 eraze(0x22);delay1m(5);write(0x22);delay1m(5);//保存下限
  42.                 eraze(0x24);delay1m(5);write(0x24);delay1m(5);//保存標記數據
  43.                 EA=1;
  44.         }        
  45. }
  46. void main()
  47. {
  48.         uint i;uint j;uchar k;//動態延時變量        
  49.   init_1602();
  50.         delay1m(100); //延時等待1602穩定
  51.         RH_founction();
  52.         init_eeprom();
  53.         while(1)
  54.         {                                                                                                                                                                                                                                                         
  55.                 if(!change)//切換單位顯示
  56.                 {
  57.                         delay1m(10);
  58.                         if(!change)
  59.                         {
  60.                                 flag1 = ~flag1;
  61.                                 if(flag1==0)//顯示km/h  等級
  62.                                 {
  63.                                         w_string(0x80,word12);
  64.                                 }
  65.                                 else if(flag1==1)//顯示m/s
  66.                                 {
  67.                                         w_string(0x80,word11);
  68.                                 }
  69.                         }
  70.                         while(!change);               
  71.                 }
  72.                 //=======================================================================
  73.                 i++;if(i>2000)//動態延時讀取溫濕度值
  74.     {
  75.       i=0;RH_founction();
  76.                         DHT11_display(0xc0+4,TH/10+0x30,TH%10+0x30);            //顯示溫度
  77.             DHT11_display(0xc0+13,RH/10+0x30,RH%10+0x30);           //顯示濕度
  78.     }
  79.                 //=======================================================================
  80.                 j++;if(j>300)
  81.     {
  82.       j=0;
  83.                         adcdat=read_adc_convert();//讀出ADC轉換的結果
  84.                         sum=sum+adcdat;
  85.                         k++;
  86.                         if(k>=10)
  87.                         {
  88.                                 k=0;
  89.                                 adcdat=sum/10;  //風速ad值,adcdat/51等于電壓,*90等于風速
  90.         if(adcdat<=1)adcdat=0;
  91.                                 fs=adcdat*1.76; //fs=((float)adcdat/51)*90;
  92.                                 //==================================報警判斷===============================================
  93.                                 if(fs>dat[0]){red=0;green=1;}
  94.                                 else if(fs<dat[1]){green=0;red=1;}
  95.                                 else if((fs<=dat[0])&&(fs>=dat[1])){red=1;green=1;}
  96.                                 //==================================等級判斷==============================================
  97.                                 if(fs<1)dengji=0;
  98.                                 else if((fs>=1)&&(fs<=5))dengji=1;
  99.                                 else if((fs>=6)&&(fs<=11))dengji=2;
  100.                                 else if((fs>=12)&&(fs<=19))dengji=3;
  101.                                 else if((fs>=20)&&(fs<=28))dengji=4;
  102.                                 else if((fs>=29)&&(fs<=38))dengji=5;
  103.                                 else if((fs>=39)&&(fs<=49))dengji=6;
  104.                                 else if((fs>=50)&&(fs<=61))dengji=7;
  105.                                 else if((fs>=62)&&(fs<=74))dengji=8;
  106.                                 else if((fs>=75)&&(fs<=88))dengji=9;
  107.                                 else if((fs>=89)&&(fs<=102))dengji=10;
  108.                                 else if((fs>=103)&&(fs<=117))dengji=11;
  109.                                 else if((fs>=118)&&(fs<=133))dengji=12;
  110.                                 else if((fs>=134)&&(fs<=149))dengji=13;
  111.                                 else if((fs>=150)&&(fs<=166))dengji=14;
  112.                                 else if((fs>=167)&&(fs<=183))dengji=15;
  113.                                 else if((fs>=184)&&(fs<=201))dengji=16;
  114.                                 else if((fs>=202)&&(fs<=220))dengji=17;
  115.                                 //=================================================================================
  116.                                 if(flag1==0){}    //km/h
  117.                                 else if(flag1==1) //m/s
  118.                                 {
  119.                                         fs=((float)fs/3.6)+0.5;
  120.                                 }               
  121.         if(fs/100==0)
  122.         {
  123.           write_cmd(0x80+5);write_dat(0x20);//最高位為0,顯示空
  124.                                 }        
  125.         else
  126.         {
  127.                                         write_cmd(0x80+5);write_dat(fs/100+0x30);
  128.                                 }        
  129.                                 if((fs/100==0)&&(fs/10%10==0))
  130.         {
  131.           write_cmd(0x80+6);write_dat(0x20);//最高位為0,次高位也為0,顯示空
  132.                                 }        
  133.         else
  134.         {
  135.                                         write_cmd(0x80+6);write_dat(fs/10%10+0x30);
  136.                                 }
  137.                                 write_cmd(0x80+7);write_dat(fs%10+0x30);//最低位顯示
  138.                                 //=================================顯示等級================================
  139.                                 write_cmd(0x80+13);write_dat('L');
  140.                                 if(dengji<10){write_cmd(0x80+14);write_dat(0x20);}  //等級十位
  141.                                 else {write_cmd(0x80+14);write_dat(dengji/10+0x30);}
  142.                                 write_dat(dengji%10+0x30);  //顯示等級
  143.                                 
  144.                                 sum=0;
  145.                         }
  146.                 }
  147.                 key_wind_up_down();   //風速上限調整
  148.         }
  149. }
  150. //=======================================風速上限,下限調整函數================================
  151. void key_wind_up_down()
  152. {
  153.         uchar dz[3]={0xc8,0xc9,0xca};//風速上下限數據在1602上顯示的地址
  154.         uchar wei;//需要調整的位
  155.         uchar buf[3];//風速上限緩存
  156.         uint counter;//用于產生閃爍效果
  157.         if(!set)
  158.         {
  159.                 delay1m(10);
  160.                 if(!set)//進入風速上限設置
  161.                 {
  162.                         while(!set);
  163.                         red=green=1;wei=0;
  164.                         buf[0]=dat[0]/100;
  165.                         buf[1]=dat[0]/10%10;
  166.                         buf[2]=dat[0]%10;//當前風速上限拆分后賦值給buf[]
  167.                         w_string(0x80,hehe);  //"Wind upper limit"
  168.                         w_string(0xc0,word1); //" Wind = 000km/h "
  169.                         do
  170.                         {   
  171.                                 counter++;if(counter>4000){counter=0;}//清零
  172.                                 if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//顯示空格
  173.                                 if(counter<=2000)//顯示數據
  174.                                 {  
  175.                                         fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
  176.         }
  177.                                 if(!yw)//按下yw,調整右移
  178.                                 {
  179.                                         delay1m(10);
  180.                                         if(!yw)
  181.                                         {
  182.                                                 while(!yw);
  183.                                                 wei++;if(wei>2){wei=0;}
  184.                                         }
  185.                                 }
  186.                                 if(!add)//加1
  187.                                 {
  188.                                         delay1m(10);
  189.                                         if(!add)
  190.                                         {
  191.                                                 while(!add);
  192.                                                 buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
  193.                                         }
  194.                                 }
  195.                                 if(!cut)//減1
  196.                                 {
  197.                                         delay1m(10);
  198.                                         if(!cut)
  199.                                         {
  200.                                                 while(!cut);
  201.                                                 buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
  202.                                         }
  203.                                 }
  204.                                 if((buf[0]*100+buf[1]*10+buf[2])<=dat[1])  //保證上限大于下限
  205.                                 {
  206.                                         dat[0]=dat[1]+1;
  207.                                         buf[0]=dat[0]/100;
  208.                             buf[1]=dat[0]/10%10;
  209.                             buf[2]=dat[0]%10;
  210.                                 }
  211.                         }while(set);//按下set設置確定
  212.                         delay1m(100);while(!set);//等待彈起
  213.                         
  214.                         dat[0]=buf[0]*100+buf[1]*10+buf[2];
  215.                         EA=0;
  216.                         eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
  217.                         EA=1;
  218.                         //=====================================下限設置=============================================
  219.                         red=green=1;wei=0;
  220.                         buf[0]=dat[1]/100;
  221.                         buf[1]=dat[1]/10%10;
  222.                         buf[2]=dat[1]%10;//當前風速下限拆分后賦值給buf[]
  223.                         w_string(0x80,haha);  //"Wind Lower limit"
  224.                         w_string(0xc0,word1); //" Wind = 000km/h "
  225.                         do
  226.                         {   
  227.                                 counter++;if(counter>4000){counter=0;}//清零
  228.                                 if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//顯示空格
  229.                                 if(counter<=2000)//顯示數據
  230.                                 {  
  231.                                         fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
  232.         }
  233.                                 if(!yw)//按下yw,調整右移
  234.                                 {
  235.                                         delay1m(10);
  236.                                         if(!yw)
  237.                                         {
  238.                                                 while(!yw);
  239.                                                 wei++;if(wei>2){wei=0;}
  240.                                         }
  241.                                 }
  242.                                 if(!add)//加1
  243.                                 {
  244.                                         delay1m(10);
  245.                                         if(!add)
  246.                                         {
  247.                                                 while(!add);
  248.                                                 buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
  249.                                         }
  250.                                 }
  251.                                 if(!cut)//減1
  252.                                 {
  253.                                         delay1m(10);
  254.                                         if(!cut)
  255.                                         {
  256.                                                 while(!cut);
  257.                                                 buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
  258.                                         }
  259.                                 }
  260.                                 if((buf[0]*100+buf[1]*10+buf[2])>=dat[0])//保證下限小于上限
  261.                                 {
  262.                                         dat[1]=dat[0]-1;
  263.                                         buf[0]=dat[1]/100;
  264.                             buf[1]=dat[1]/10%10;
  265.                             buf[2]=dat[1]%10;
  266.                                 }
  267.                         }while(set);//按下set設置確定
  268.                         delay1m(100);while(!set);//等待彈起
  269.                         
  270.                         dat[1]=buf[0]*100+buf[1]*10+buf[2];
  271.                         EA=0;eraze(0x22);delay1m(5);write(0x22);delay1m(5);EA=1;//保存上限
  272.                         if(flag1==0)//顯示km/h
  273.                         {
  274.                                 w_string(0x80,word12);
  275.                         }
  276.                         else if(flag1==1)//顯示m/s
  277.                         {
  278.                                 w_string(0x80,word11);
  279.                         }
  280.             w_string(0xc0,word2);
  281.                 }
  282.         }
  283. }  
  284. //======================================ms級延時函數======================================
  285. void delay1m(uint x)
  286. {
  287.   uint k,j;
  288.   for(k=0;k<x;k++)      //連數x次,約 x ms
  289.       for(j=0;j<120;j++);   //數120 次,約1 ms
  290. }
  291. //===================================讀出ADC轉換的結果函數======================================
  292. uchar read_adc_convert()
  293. {
  294.         uchar i;     //循環變量
  295.         uchar dat=0; //轉換之后讀出的數據
  296.         uchar dat1=0;//轉換之后讀出的數據
  297.         clk=0;cs=1;dio=0;//初始狀態
  298.         cs=0;//cs置0,片選有效
  299.         
  300.         dio=1;//數據值1,起始信號
  301.         clk=1;//第1個上升沿dio保持1,表示啟動
  302.         
  303.         _nop_();
  304.         clk=0;//時鐘置0,為下一步上升沿做準備
  305.         
  306.         dio=1;//數據值1,
  307.         clk=1;//第2個上升沿dio=1,表示選擇單通道輸入
  308.         
  309.         _nop_();
  310.         clk=0;//時鐘置0,為下一步上升沿做準備
  311.         
  312.         dio=0;//數據值0
  313.         clk=1;//第3個上升沿dio=0,表示選擇CH0

  314.         _nop_();
  315.         clk=0;
  316.         dio=1;//將數據端口置為輸入狀態,方便讀取
  317.         clk=1;//為下一步讀取做準備
  318.         _nop_();
  319.         for(i=0;i<8;i++)
  320.         {
  321.                 clk=1;_nop_();
  322.                 clk=0;//下降沿讀取一位數據
  323.                 dat<<=1;
  324.                 if(dio)                                       
  325.                 {
  326.                         dat|=0x01;
  327.                 }
  328.                 else                                         
  329.                 {                                       
  330.                         dat|=0x00;                                 
  331.                 }
  332.         }
  333.         //時序圖中可見,前面8位與后面8位是共用最低位的,所以后面8位的
  334.   //第一位必須再次讀取前面8位的最后一位,這過程中不允許出現下降沿
  335.         for(i=0;i<8;i++)
  336.         {
  337.                
  338.                 dat1>>=1;
  339.                 if(dio)
  340.                 {
  341.                         dat1|=0x80;
  342.                 }
  343.                 else
  344.                 {
  345.                         dat1|=0x00;
  346.                 }
  347.                 clk=1;_nop_();
  348.                 clk=0;//下降沿讀取一位數據
  349.         }
  350.         cs=1;
  351.         if(dat==dat1)
  352.         {
  353.                 return dat;
  354.         }
  355.         else
  356.         {
  357.                 return 0;
  358.         }
  359.         return dat;
  360. }
復制代碼
全部資料51hei下載地址:
溫濕度風速.rar (91.91 KB, 下載次數: 31)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久 | 丝袜美腿一区二区三区 | 精品一区二区三区在线观看 | 久久免费视频网 | www日韩欧美| 中文久久 | 天天激情综合 | 久久精品性视频 | 国产高清在线精品一区二区三区 | 91国产在线播放 | 99在线免费视频 | 亚洲欧美日韩在线不卡 | 国产区精品视频 | 久青草影院 | 国产视频线观看永久免费 | 久久精品国产v日韩v亚洲 | xxxxx黄色片| 久久一区二区免费视频 | 国产在线一区二区三区 | 国产精品乱码一区二区三区 | 欧美白人做受xxxx视频 | 亚洲高清在线观看 | 欧美视频网 | 一区二区免费 | 久久在线看| 91传媒在线观看 | 蜜臀久久99精品久久久久久宅男 | jdav视频在线观看免费 | 日本精品一区二区三区在线观看视频 | a视频在线| 午夜视频在线免费观看 | 亚洲精品视频在线 | 国产 日韩 欧美 在线 | 免费看片在线播放 | 玖玖色在线视频 | 欧美精品一区二区三区在线 | 欧美成视频在线观看 | 成人国产精品入口免费视频 | 精品自拍视频 | 亚洲精品在线91 | 国产在线视频一区二区董小宛性色 |