基于单片机的一种风速测量仪的设计与制作

收藏和点赞,您的关注是我创作的动力


一、设计介绍

    风速、风向的测量在气象预报、环境监测、风力发电、航空航天等领域中有着重要意义。随着传感器技术、微处理器技术和网络通信技术的发展,相比传统的人工观测,数字化、智能化的气象仪器在观测精度、速度和稳定性等方面都有较大优势,因此针对数字化的气象仪器进行设计具有较大意义,尤其是便携式小型化的仪器,虽然通过天气预报可以知道当前的风速风向信息,但是这些都是大范围的,无法感知某一局部区域的风速风向,因此本文围绕风速风向仪进行设计。
本次基于单片机的风速风向仪设计与实现,整个系统包括单片机最小系统STC89C52,RM-FS-N01风速传感器,RM-FX-N01风向传感器,压力传感器采集的数据变换并传送至单片机进行处理,再由液晶显示屏显示测量的风速值。对于风向系统利用编码器在0~360°范围内进行测量收集信号,在多圈旋转的情况下能够实现单圈自动归零,通过单片机进行数据的转化处理,测量风向也通过液晶显示屏显示。软件部分的设计采用模块化编程方式,方便程序的维护和改进。

二、设计内容

  本课题为“基于单片机的风速风向仪设计与实现”,在功能上设计如下:
(1)具有基本测量功能,可以检测风速,风向;(2)具有显示信息的功能,可以显示风速、风向的基本信息;(3)具有语音播报功能,可以播报当前的风速风向大小;(4)可以通过按键设定阈值,当风速风向超过阈值时,进行声音提示(5)具有无线传输功能,可以将检测的数据传输到手机APP;根据上述功能,设计了如图2.1所示的系统总体架构,整个系统包括单片机最小系统STC89C52,RM-FS-N01风速传感器,RM-FX-N01风向传感器,MY1680语音播报模块,OLED液晶,ESP8266无线通信模块,蜂鸣器,ADC0832模数转换器等等,在开发环境上,采用Altium完成系统原理图的设计,通过Keil平台和C语言完成软件程序的编写。
在这里插入图片描述

图2-1系统总体设计框图

三、风速风向电路设计

  在风速风量测量仪中需要实现对风速和风向的检测,在此出于设计的实际情况选择的是直接通过风速传感器来完成该功能,选用的是RM-FS-N01风速传感器和RM-FX-N01风向传感器,这两种传感器,都支持5V进行供电,并且会将检测到的风速和风向,以模拟量的形式进行输出,因此单片机控制器只需要去检测去模拟量输出的电压大小,就可以得到风速和风向参数,其电路如图所示。
在这里插入图片描述

图3-2风速和风向检测电路图
   在本次设计中,采用的是STC89C52单片机,该单片机并没有内嵌了模数转换器,因此需要选择外部的ADC模数转换器,通过参考网络资源在此选择了ADC0832芯片,该芯片是一款8位精度的低成本,低功耗的模数转换器,其采用串行的数据输出方式,单片机只需要三根线与其CLK,CS,DI进行连接,就可以获取模拟量数据。整个ADC0832芯片一共具有8个引脚,采用5V进行供电,其转换速率高达250KHZ,功耗低至10mW,并且具有CH0和CH1两路模拟数据输入功能,需要注意的是,这两路输入数据的电压大小应当小于ADC0832的供电电源,否则可能造成芯片的损坏,在控制上需要注意的是,单片机读取速度不能太快,否则ADC0832会来不及转换,这样会造成数据的错误。单片机在获得正确数据量后,再将其进行换算就可以得到检测到的模拟量电压值。在此风速输出连接到ADC0832的2脚CH0,风向输出连接到ADC0832的3脚CH1,单片机的P1.2连接到ADC0832的1脚CS,P1.1连接到ADC0832的7脚CLK,P1.0连接到ADC0832的5脚和6脚DI,DO。
   进行A/D转换时,须将CS使能置于低电平并保持到转换结束。当芯片开始转换工作的同时由单片机处理器向芯片的时钟输入端输入CLK时钟脉冲,为ADC0832提供工作频率。DO和DI引脚一同连接单片机的P1.0引脚,根据工作时序当单片机P1.1输出高电位给ADC0832的CLK引脚时,ADC0832的DO引脚向单片机P1.0引脚输出AD转换的数字量结果,由单片机P1.0引脚向ADC0832的DI引脚输出控制信号与通道选择控制命令。具体工作原理如下。在时钟的上升沿,DI端的数据移入ADC0832内部的多路地址移位寄存器。在第一个时钟期间,DI为高,表示启动位,紧接着输入两位配置位。当输入启动位和配置位后,选择输入模拟通道,转换开始。转换开始后,经过一个时钟周期延迟,以使选定的通道稳定。ADC0832接着在第4个时钟下降沿输出转换数据。数据输出时先输出最高位(DATA7-DATA0);输出完转换结果后,又以最低位开始重新输出一遍数据(DATA7-DATA0),两次发送的最低位共用。当CS为高电平时,内部所有寄存器清0,输出变为高阻态。
风速风向采集模块输出的模拟信号由2脚与3脚输入到ADC0832中,经过转换后将数字信号从6脚输出送入到单片机的P1.0引脚进行处理。

程序设计

   本文软件设计是以一个主程序实现对各个子程序的协调调用,进而按照要求实现预设计的功能,本系统的风速风量测量仪主程序流程图如图4.1所示,在风速风量测量仪程序启动后,然后进行系统初始化,初始化函数包括:分串口初始化,液晶显示初始化。在系统的初始化工作完成后,首先由单片机发出工作开始信号,启动风速风向仪,进入循环调用ADC083采集程序以读取风向,读取风速风向,并通过显示模块显示,然后根据阈值进行报警判定,接着检测是否有按键按下,如果有则进行按键处理,之后再通过显示模块显示更新后的风速及风向。

风速风向检测子程序设计:

在此搭配了ADC0832模数转换器来对风速风向进行检测,其流程如图4.3所示,风向检测:当程序开始后,选择CH1通道,此时在第三个CLK时钟,DAT会给低低电平,然后读前8位数据,再读后8位数据,如果前后8位一致则输出结果,如果不一致则输出0,接着释放ADC0832,然后通过液晶进行显示风向。风速检测采用的是CH0通道,设计思路与风向相同。
在这里插入图片描述

图4-1风速风向检测子程序流程图

四、主要代码

主程序:
void main(void)
{
   
static u8 buff[20];//
unsigned char i,n;
uchar shezhi_flag=1,t;//设置变量
unsigned char Tx_Buf[7];
uint caiji_time=0;
int type;
float val=0,qs_fs=0;//风度
float qs_fx=0;//风向变量
InitUART();
OLED_Init(); //OLED初始化
sprintf((char*)buff,"fazhi:%2d",data1); 
22
OLED_P8x16Str(0,0,buff);
sprintf((char*)buff,"fengsu:%2d.%1dm/s",(uint)qs_fs/10,(uint)qs_fs%10); 
OLED_P8x16Str(0,4,buff);
while(1)
{
    
delayms(10);
/*输出值(V) 对应风向
≈0 北风
≈0.7143 东北风
≈1.4286 东风
≈2.1429 东南风
≈2.8571 南风
≈3.5714 西南风
≈4.2857 西风
≈5 西北风*/
//读取风向
qs_fx=adc0832(0)*5/25.5; 
if(qs_fx>48) 
{
   
type=1;
OLED_P8x16Str(0,2," xibei feng 315");
}
else if(qs_fx>40)
{
   
type=2;
OLED_P8x16Str(0,2," xi feng 270");
}
else if(qs_fx>33)
{
   
type=3;
OLED_P8x16Str(0,2," xinan feng 225");
}
else if(qs_fx>26)
{
   
type=4;
OLED_P8x16Str(0,2," nan feng 180");
} 
else if(qs_fx>19)
{
   
type=5;
OLED_P8x16Str(0,2,"dongnan feng 135");
}
else if(qs_fx>12)
{
   
type=6;
OLED_P8x16Str(0,2," dong feng 90");
}
23
else if(qs_fx>5) 
{
   
type=7;
OLED_P8x16Str(0,2," dongbei feng 45");
}
else if(qs_fx>=0)
{
   
type=8;
OLED_P8x16Str(0,2," bei feng 0");
} 
//读取风速
val+=adc0832(1)*50/2.55;
if(++caiji_time>=15)
{
    
qs_fs=val/caiji_time;
qs_fs=qs_fs*0.27;
val=0;
caiji_time=0;
sprintf((char*)buff,"fengsu:%2d.%1dm/s",(uint)qs_fs/10,(uint)qs_fs%10); 
OLED_P8x16Str(0,4,buff);
} 
if((uint)</
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值