风速风向记录仪设计与实现报告

更新时间:2023-04-23 00:32:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验项目名称:风速风向记录仪设计与实现指 导 老 师:张腾飞项 目 成 员: 姓名:许 姓名: 姓名:朱惠娟结 题 时 间:

实验报告

彬 学号:B08050613 孙 强 学号:B08050112 学号:B08050107 2010—12-26

风速风向记录仪设计与实现

——项目报告

一:实验名称

风速风向记录仪设计与实现

二:实验目的

通过实验创新环节来巩固和加深对嵌入式单片机系统的理解,具备嵌入式单片机测控系统软硬件调试和系统设计的开发技能。综合利用所学知识提高分析问题、解决问题的实际动手能力和研究能力。

三:实验要求

1.量程范围要求风速0-60m/s,风向0-360度 2.分辨率要求风速0.1m/s,风向0.1度 3.精确度要求风速±0.6m/s,风向±0.6度 4.启动风速≤0.5m/s

5.系统能够记录历史数据信息,记录间隔2秒-24小时连续可调

6.提供与上位机的通讯接口。

四:实验内容

根据风向、风速监测系统的要求,基于嵌入式单片机完成风向、风速记录仪的设计与实现。

五:实物简介

风向风速仪简介

风向、风速仪用于测量瞬时风速风向,具有自动显示功能。主要

由支杆,风标,风杯,风速风向感应器组成,风标的指向即为来风方向,根据风杯的转速来计算出风速。内置或外接各种进口原装传感器,采用微功耗单片机对外部数据进行采样,并将采集的数据保存在系统不易失存储器内。通过RS-232或USB接口与个人电脑通讯。 用途

风向风速仪由微处理器和高动态特性的测风传感器组成。它适用于气象、能源、环保、农林以及军工等场所测量风向风速。 功能及特点

◆ 数据记录仪全程跟踪记录数据,数据准确、记录时间长。 ◆ 记录风速风向的参数的变化,可以随时记录数据。

◆ 记录时间间隔可以在记录仪应用软件上进行设置,2秒至24小时任意可调,风速风向的变化随着时间的变化而变化,监测过程中风俗风向的变化值实时保存在电脑的硬盘中,十分方便。 使用方法

1、 用随机附带的通讯电缆将记录仪与一般计算机的串行口相连接。

2、 在计算机上运行记录仪应用程序可接收仪器测得的风速风向数据。

3、脱开记录仪与计算机的连接(也可不脱机工作,在机计算机上实时显示记录情况),将记录仪置于需检测的场合。

六:实验原理

YH4系列风速仪主要由YH12X智能风速传感器和YH42X智能风速显示器两部分组成:

风速传感器组成:YH12X系列风速风向传感器主要由风杯、齿轮、用于计数和通讯的控制器,以及风向采集单元组成。

YH12X风速传感器工作原理:当风杯随着气流的运动而转动时,风速轴带动码盘

与风杯成正比地转动,从而输出电脉冲信号,将机械转动信号转换成电信号。风向测量采用进口红外光电管,格雷码盘等器件。当风向标随着气流的运动而转动时,风向轴带动格雷码盘同时转动,从而输出七位格雷码信号,将机械位置信号转换成光电脉冲信号,通过微处理器CPU记录每秒种的产生的光电脉冲的个数,快速运算处理后即可的出气流的运动速度。计算原理如下: 每秒种产生光电脉冲的个数:n 齿轮的圆周半径 : R (m) 齿轮的总个数: N 风杯轴承的传动系数:η 风杯的线速度 : V1 (m/s) 风速:V (m/s)

风速的计算公式为: V =V1*η

风杯的转动线速度: V1 =2∏R *360*n/N

CPU计算完成后通过通讯单元电路将当前风速信息传递给控制中心

或风速显示器。传感器也可通过转换处理将数据以其他形式输出,传递给其他智能设备。

YH42X风速显示器工作原理:风速显示器对接收到的风速信息进行处理,换算转化成实际风速风级显示到对应的显示器中,风速显示器还可以针对预先设定的报警参数,当风速超过其参数时发出对应的报警信息,本显示器可以设置三组报警参数,分别对应三组控制输出.同时风速显示器还能将风速值转化为电流信号或电压信号,以传输给PLC终端联动控制系统。

系统原理图:

PCB印制电路板设计图:

系统各单元电路的说明:

一、4个独立按钮的按键用来调节时间。

二、LCD1602---主要是显示实时时间、采样时间以及风向风速数据。 三、74LS245---是对风向传感器输出的7位格雷码进行整形驱动。 四、RS232---主要负责数据的传输发送。 仿真结果:

上位机运行:

传感器接口:

表5-4风速传感器管脚接口

表5-5风向传感器的管脚接口

元器件清单:

源程序代码:

#include<reg52.h> #include<stdio.h>

#include <intrins.h>

#define uint unsigned int #define uchar unsigned char //uchar table[20];

uchar temp,tp=0,timecon,time,X,set_flag=0,t_flag=0,key_flag=0; uchar key1=0,key2=0,key3=0,key4=0; uchar B0,B1,B2,B3,B4,B5,B6; uint shi,fen,miao;//实时时间 uint th,tl,count;//风速计数器计数值

uint ws_shi,ws_ge,ws_dian;//风速实时显示数据 uint shi_1,fen_1,miao_1;//实时时间显示数据

uint wd_x,wd_bai,wd_shi,wd_ge,wd_dian;//风向实时显示数据 uint s_shi=0,s_fen=0,s_miao=2;//记录数据时的时间数据 long int s_t,ST; //定时时间/s float WD;//风向数据

sbit lcdrs=P3^7;//写命令/数据控制 sbit lcden=P3^6;//LED片选型信号 sbit A0=P2^0; sbit A1=P2^1; sbit A2=P2^2; sbit A3=P2^3; sbit A4=P2^4;

sbit A5=P2^5;

sbit A6=P2^6;

void write_data(uchar date);//写数据 void write_com(uchar com);//写命令 void init(); //系统初始化 void init1(); //通信初始化 void led_init(); //液晶初始化 void led_display(); //液晶初始显示 void set_display() ; // 初始设置显示 void time_display();

//实时时钟

void S_WSpeed(); //风速处理 void S_WDirection(); //风向处理 void fs_display(); //风速显示 void fx_display(); //风向显示 void timesend_data(); //时间数据传输 void fssend_data(); //风速数据传输 void fxsend_data();

//风向数据传输

void write_sfm(uchar add,uchar date); uint keyscan(); void delay(uint z) { }

uint x,y;

for(x=z;x>0;x--) for(y=110;y>0;y--);

void main() { init(); //系统初始化 led_init(); //led初始化 led_display(); //led初始显示

P1=0X0F; while(1) {

if(key_flag==1) {

key_flag = 0; set_display();

//按键标志位

EA=1; }

if(set_flag==1) { }

set_flag=0; TR0=1;

//设置完毕标志位

//按键设置完后开始计时

if(t_flag==1) //采样完毕标志位,采样完毕后进行数据的处理、显示、传输

{

S_WSpeed(); S_WDirection(); fs_display(); fx_display(); timesend_data(); fxsend_data(); fssend_data(); t_flag=0;

}

}

}

void write_com(uchar com) { lcdrs=0; //写命令 P0=com; delay(10);

lcden=1; //EN高脉冲 delay(10);

lcden=0;

}

void write_data(uchar date) { lcdrs=1; //写数据 P0=date; delay(10);

lcden=1; //EN高脉冲 delay(10);

lcden=0;

}

void led_init()

{ lcden=0;

write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);

write_com(0x80);

}

void ex0() interrupt 0 //键盘 { EA=0; key_flag=1;

//液晶初始化

}

void init() { TMOD = 0x51; //定时器T0工作在方式1

EA=1;

TH0 = (65536-20000)/256; TL0 = (65536-20000)%256; TH1 =0; TL1 =0; EX0=1; ET0=1; ET1=1; TR1=0; TR0=0;

定时20ms ;T1工作于方式1的外部计数

IT0=0; }

void time0() interrupt 1 { }

timecon++;

//定时20ms中断,进行相应的数据处理

TH0 = (65536-20000)/256;

TL0 = (65536-20000)%256;

if(timecon==50) //1秒时间到 {

timecon=0; ST--;

//定时时间到了采集一秒钟的瞬时数据进行处理

time_display(); }

if(ST==1) { }

TMOD = 0x51; TH1=0; TL1=0; TR1=1;

if(ST==0) {

TR1=0; }

ST=s_t; shi_1=shi; fen_1=fen;

miao_1=miao;

t_flag=1; //采样完成标志位

//先把此时的时间数据保存起来,以便后面的数据传输

void S_WSpeed() //风速处理 { tl=TL1; //计数处理

TL1=0; th=TH1; TH1=0; count=th*256+tl; ws_shi=count/100; ws_ge=count%100/10; ws_dian=count%10;

}

void S_WDirection() //风向处理格雷码的转换 {

B6=A6; B5=A5^B6; B4=A4^B5; B3=A3^B4; B2=A2^B3; B1=A1^B2; B0=A0^B1;

WD=(B0+2*B1+4*B2+8*B3+16*B4+32*B5+64*B6)*2.8125; wd_x=WD*10;

wd_bai=wd_x/1000;

wd_shi=wd_x%1000/100; wd_ge=wd_x%100/10;

wd_dian=wd_x%10; }

void write_sfm(uchar add,uchar date) //显示时间的时/分/秒 { } {

uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+add); write_data(0x30+shi); write_data(0x30+ge);

void time_display()

miao++; if(miao==60) {

miao=0; fen++;

if(fen==60)

}

fen=0; shi++;

if(shi==24) { }

write_sfm(0,shi);

shi=0;

write_sfm(3,fen);

}

write_sfm(6,miao);

}

uint keyscan() //键盘扫描 {

uint num; P1=0xff; temp=P1;

temp=temp&0xff; //消抖

while(temp!=0xff) {

delay(5); temp=P1;

temp=temp&0xff; //消抖 while(temp!=0xff) {

temp=P1; switch(temp) {

case 0xfe:num=1; break;

case 0xfd:num=2; break;

case 0xfb:num=3; break;

case 0xf7:num=4;

break; }

while(temp!=0xff) //松手检测 { }

temp=P1;

temp=temp&0xff;

} {

}

P1=0xff; return num;

void led_display()

//实时时间显示 write_com(0x80); write_data(0x30); write_data(0x30); write_com(0x82); write_data(0x3a); write_com(0x83); write_data(0x30); write_data(0x30); write_com(0x85); write_data(0x3a); write_com(0x86); write_data(0x30); write_data(0x30); //风速显示 write_com(0x88); write_data(0xa0); write_data(0xa0); write_data(0xa0); write_data(0xa0);

write_com(0x8d); write_data('m'); write_data('/'); write_data('s'); //采样时间设置显示

write_com(0x80+0x40); write_data(0x30+2); write_data(0x30+3); write_data(0x3a); write_data(0x30+5); write_data(0x30+9); write_data(0x3a); write_data(0x30+5); write_data(0x30+9); //风向显示

write_com(0x80+0x49); write_data(0xa0);

}

write_data(0xa0); write_data(0xa0); write_data(0xa0); write_data(0xa0); write_com(0x80+0x4f); write_data(0xdf);

void set_display() {

X=keyscan(); switch(X) {

case 1: key1++;

if(key1==2||key1==3) key2=0; key1=key1%3; break;

case 2:

key2++; key2=key2%3; break; case 3: if(key1==1&&key2==0) //设置实时小时

{

shi++;

if(shi==24) shi=0;

write_com(0x80);

write_data((shi/10)+0x30); write_com(0x81);

write_data((shi%10)+0x30);

}

else if(key1==1&&key2==1) //设置实时分钟 {

fen++;

if(fen==60) {

fen=0; shi++; }

write_com(0x83);

write_com(0x84); write_data((fen%10)+0x30); }

else if(key1==1&&key2==2) // 设置实时秒 {

miao++; if(miao==60) { }

miao=0; fen++;

write_com(0x86);

write_data((miao/10)+0x30); write_com(0x87);

write_data((miao%10)+0x30);

}

else if(key1==2&&key2==0) //设置定时小时 {

s_shi++; if(s_shi==24)

s_shi=0;

write_com(0x80+0x40); write_data((s_shi/10)+0x30); write_com(0x80+0x41);

write_data((s_shi%10)+0x30); }

else if(key1==2&&key2==1) //设置定时分钟 {

s_fen++; if(s_fen==60) s_fen=0;

write_com(0x80+0x43);

write_data((s_fen/10)+0x30); write_com(0x80+0x44);

write_data((s_fen%10)+0x30);

}

else if(key1==2&&key2==2) //设置定时秒 {

s_miao++; if(s_miao==60)

s_miao=0;

write_com(0x80+0x46);

write_data((s_miao/10)+0x30);

write_data((s_miao%10)+0x30); } break; case 4: if(key1==1&&key2==0) //设置实时小时

{

shi--;

if(shi==-1)

shi=23;

write_com(0x80);

write_data((shi/10)+0x30); write_com(0x81);

write_data((shi%10)+0x30);

}

else if(key1==1&&key2==1) //设置实时分钟 {

fen--;

if(fen==-1) {

fen=59;

}

write_com(0x83);

write_data((fen/10)+0x30); write_com(0x84);

write_data((fen%10)+0x30); }

else if(key1==1&&key2==2) // 设置实时秒 {

miao--; if(miao==-1) { }

miao=59;

write_com(0x86);

write_data((miao/10)+0x30); write_com(0x87);

write_data((miao%10)+0x30); }

else if(key1==2&&key2==0) //设置定时小时 {

s_shi--;

if(s_shi==-1) s_shi=23;

本文来源:https://www.bwwdw.com/article/c4vq.html

Top