找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1659|回复: 0
打印 上一主题 下一主题
收起左侧

单片机根据温湿度控制风速源程序电路图

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:

单片机源程序如下:
  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 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表