电路原理图如下:
单片机源程序如下:
- /*温湿度实时监测显示,温度测量范围为0~+50℃; 湿度测量范围为20%~90%;
- 1m/s=3.6km/h
- fs = 25*v m/s = 90*v km/h V单位是 伏
- ===========================================================================================*/
- #include"main.h"
- sbit set=P2^3; //设置
- sbit yw=P2^2; //移位
- sbit add=P2^1; //+
- sbit cut=P2^0; //-
- sbit change=P3^7; //切换
- sbit red=P1^3;sbit green=P1^4;//超限指示灯,上限,下限
- //===================================adc0832================================================
- sbit cs=P1^0; //片选
- sbit clk=P1^1;//时钟
- sbit dio=P1^2;//数据
- //===========================================================================================
- extern uchar TH,RH;//温度整数,湿度整数部分
- extern uchar dat[3];//风速上限,下限,初始化标记
- uchar code word1[16]= {" Wind = km/h "};//km/h 调整界面
- uchar code word12[16]={"Wind= km/h L00"};//km/h
- uchar code word11[16]={"Wind= m/s L00"};//m/s
- uchar code word2[16]= {"Tem= C Hum= %"};//word2[4]word2[5]C word2[13]word2[14]%
- uchar code hehe[16]= {"Wind upper limit"};//设置风速上限界面
- uchar code haha[16]= {"Wind lower limit"};//设置风速下限界面
- uchar adcdat;
- uint sum=0; //5次adcdat数据之和
- uchar fs=0; //风速默认 km/h
- bit flag1=0; //默认 0(km/h) 1(m/s)
- uchar dengji=0;
- /**************开机初始化保存的数据*****************/
- void init_eeprom()
- {
- read(0x20);read(0x22);read(0x24);//先读
- if(dat[2]!=22) //新的单片机初始单片机内部eeprom
- {
- dat[0]= 20;//初始上限
- dat[1]= 3; //初始下限
- dat[2]=22;
- EA=0;
- eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
- eraze(0x22);delay1m(5);write(0x22);delay1m(5);//保存下限
- eraze(0x24);delay1m(5);write(0x24);delay1m(5);//保存标记数据
- EA=1;
- }
- }
- void main()
- {
- uint i;uint j;uchar k;//动态延时变量
- init_1602();
- delay1m(100); //延时等待1602稳定
- RH_founction();
- init_eeprom();
- while(1)
- {
- if(!change)//切换单位显示
- {
- delay1m(10);
- if(!change)
- {
- flag1 = ~flag1;
- if(flag1==0)//显示km/h 等级
- {
- w_string(0x80,word12);
- }
- else if(flag1==1)//显示m/s
- {
- w_string(0x80,word11);
- }
- }
- while(!change);
- }
- //=======================================================================
- i++;if(i>2000)//动态延时读取温湿度值
- {
- i=0;RH_founction();
- DHT11_display(0xc0+4,TH/10+0x30,TH%10+0x30); //显示温度
- DHT11_display(0xc0+13,RH/10+0x30,RH%10+0x30); //显示湿度
- }
- //=======================================================================
- j++;if(j>300)
- {
- j=0;
- adcdat=read_adc_convert();//读出ADC转换的结果
- sum=sum+adcdat;
- k++;
- if(k>=10)
- {
- k=0;
- adcdat=sum/10; //风速ad值,adcdat/51等于电压,*90等于风速
- if(adcdat<=1)adcdat=0;
- fs=adcdat*1.76; //fs=((float)adcdat/51)*90;
- //==================================报警判断===============================================
- if(fs>dat[0]){red=0;green=1;}
- else if(fs<dat[1]){green=0;red=1;}
- else if((fs<=dat[0])&&(fs>=dat[1])){red=1;green=1;}
- //==================================等级判断==============================================
- if(fs<1)dengji=0;
- else if((fs>=1)&&(fs<=5))dengji=1;
- else if((fs>=6)&&(fs<=11))dengji=2;
- else if((fs>=12)&&(fs<=19))dengji=3;
- else if((fs>=20)&&(fs<=28))dengji=4;
- else if((fs>=29)&&(fs<=38))dengji=5;
- else if((fs>=39)&&(fs<=49))dengji=6;
- else if((fs>=50)&&(fs<=61))dengji=7;
- else if((fs>=62)&&(fs<=74))dengji=8;
- else if((fs>=75)&&(fs<=88))dengji=9;
- else if((fs>=89)&&(fs<=102))dengji=10;
- else if((fs>=103)&&(fs<=117))dengji=11;
- else if((fs>=118)&&(fs<=133))dengji=12;
- else if((fs>=134)&&(fs<=149))dengji=13;
- else if((fs>=150)&&(fs<=166))dengji=14;
- else if((fs>=167)&&(fs<=183))dengji=15;
- else if((fs>=184)&&(fs<=201))dengji=16;
- else if((fs>=202)&&(fs<=220))dengji=17;
- //=================================================================================
- if(flag1==0){} //km/h
- else if(flag1==1) //m/s
- {
- fs=((float)fs/3.6)+0.5;
- }
- if(fs/100==0)
- {
- write_cmd(0x80+5);write_dat(0x20);//最高位为0,显示空
- }
- else
- {
- write_cmd(0x80+5);write_dat(fs/100+0x30);
- }
- if((fs/100==0)&&(fs/10%10==0))
- {
- write_cmd(0x80+6);write_dat(0x20);//最高位为0,次高位也为0,显示空
- }
- else
- {
- write_cmd(0x80+6);write_dat(fs/10%10+0x30);
- }
- write_cmd(0x80+7);write_dat(fs%10+0x30);//最低位显示
- //=================================显示等级================================
- write_cmd(0x80+13);write_dat('L');
- if(dengji<10){write_cmd(0x80+14);write_dat(0x20);} //等级十位
- else {write_cmd(0x80+14);write_dat(dengji/10+0x30);}
- write_dat(dengji%10+0x30); //显示等级
-
- sum=0;
- }
- }
- key_wind_up_down(); //风速上限调整
- }
- }
- //=======================================风速上限,下限调整函数================================
- void key_wind_up_down()
- {
- uchar dz[3]={0xc8,0xc9,0xca};//风速上下限数据在1602上显示的地址
- uchar wei;//需要调整的位
- uchar buf[3];//风速上限缓存
- uint counter;//用于产生闪烁效果
- if(!set)
- {
- delay1m(10);
- if(!set)//进入风速上限设置
- {
- while(!set);
- red=green=1;wei=0;
- buf[0]=dat[0]/100;
- buf[1]=dat[0]/10%10;
- buf[2]=dat[0]%10;//当前风速上限拆分后赋值给buf[]
- w_string(0x80,hehe); //"Wind upper limit"
- w_string(0xc0,word1); //" Wind = 000km/h "
- do
- {
- counter++;if(counter>4000){counter=0;}//清零
- if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//显示空格
- if(counter<=2000)//显示数据
- {
- fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
- }
- if(!yw)//按下yw,调整右移
- {
- delay1m(10);
- if(!yw)
- {
- while(!yw);
- wei++;if(wei>2){wei=0;}
- }
- }
- if(!add)//加1
- {
- delay1m(10);
- if(!add)
- {
- while(!add);
- buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
- }
- }
- if(!cut)//减1
- {
- delay1m(10);
- if(!cut)
- {
- while(!cut);
- buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
- }
- }
- if((buf[0]*100+buf[1]*10+buf[2])<=dat[1]) //保证上限大于下限
- {
- dat[0]=dat[1]+1;
- buf[0]=dat[0]/100;
- buf[1]=dat[0]/10%10;
- buf[2]=dat[0]%10;
- }
- }while(set);//按下set设置确定
- delay1m(100);while(!set);//等待弹起
-
- dat[0]=buf[0]*100+buf[1]*10+buf[2];
- EA=0;
- eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
- EA=1;
- //=====================================下限设置=============================================
- red=green=1;wei=0;
- buf[0]=dat[1]/100;
- buf[1]=dat[1]/10%10;
- buf[2]=dat[1]%10;//当前风速下限拆分后赋值给buf[]
- w_string(0x80,haha); //"Wind Lower limit"
- w_string(0xc0,word1); //" Wind = 000km/h "
- do
- {
- counter++;if(counter>4000){counter=0;}//清零
- if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//显示空格
- if(counter<=2000)//显示数据
- {
- fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
- }
- if(!yw)//按下yw,调整右移
- {
- delay1m(10);
- if(!yw)
- {
- while(!yw);
- wei++;if(wei>2){wei=0;}
- }
- }
- if(!add)//加1
- {
- delay1m(10);
- if(!add)
- {
- while(!add);
- buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
- }
- }
- if(!cut)//减1
- {
- delay1m(10);
- if(!cut)
- {
- while(!cut);
- buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
- }
- }
- if((buf[0]*100+buf[1]*10+buf[2])>=dat[0])//保证下限小于上限
- {
- dat[1]=dat[0]-1;
- buf[0]=dat[1]/100;
- buf[1]=dat[1]/10%10;
- buf[2]=dat[1]%10;
- }
- }while(set);//按下set设置确定
- delay1m(100);while(!set);//等待弹起
-
- dat[1]=buf[0]*100+buf[1]*10+buf[2];
- EA=0;eraze(0x22);delay1m(5);write(0x22);delay1m(5);EA=1;//保存上限
- if(flag1==0)//显示km/h
- {
- w_string(0x80,word12);
- }
- else if(flag1==1)//显示m/s
- {
- w_string(0x80,word11);
- }
- w_string(0xc0,word2);
- }
- }
- }
- //======================================ms级延时函数======================================
- void delay1m(uint x)
- {
- uint k,j;
- for(k=0;k<x;k++) //连数x次,约 x ms
- for(j=0;j<120;j++); //数120 次,约1 ms
- }
- //===================================读出ADC转换的结果函数======================================
- uchar read_adc_convert()
- {
- uchar i; //循环变量
- uchar dat=0; //转换之后读出的数据
- uchar dat1=0;//转换之后读出的数据
- clk=0;cs=1;dio=0;//初始状态
- cs=0;//cs置0,片选有效
-
- dio=1;//数据值1,起始信号
- clk=1;//第1个上升沿dio保持1,表示启动
-
- _nop_();
- clk=0;//时钟置0,为下一步上升沿做准备
-
- dio=1;//数据值1,
- clk=1;//第2个上升沿dio=1,表示选择单通道输入
-
- _nop_();
- clk=0;//时钟置0,为下一步上升沿做准备
-
- dio=0;//数据值0
- clk=1;//第3个上升沿dio=0,表示选择CH0
- _nop_();
- clk=0;
- dio=1;//将数据端口置为输入状态,方便读取
- clk=1;//为下一步读取做准备
- _nop_();
- for(i=0;i<8;i++)
- {
- clk=1;_nop_();
- clk=0;//下降沿读取一位数据
- dat<<=1;
- if(dio)
- {
- dat|=0x01;
- }
- else
- {
- dat|=0x00;
- }
- }
- //时序图中可见,前面8位与后面8位是共用最低位的,所以后面8位的
- //第一位必须再次读取前面8位的最后一位,这过程中不允许出现下降沿
- for(i=0;i<8;i++)
- {
-
- dat1>>=1;
- if(dio)
- {
- dat1|=0x80;
- }
- else
- {
- dat1|=0x00;
- }
- clk=1;_nop_();
- clk=0;//下降沿读取一位数据
- }
- cs=1;
- if(dat==dat1)
- {
- return dat;
- }
- else
- {
- return 0;
- }
- return dat;
- }
复制代码 全部资料51hei下载地址:
温湿度风速.rar
(91.91 KB, 下载次数: 31)
|