简易风洞设计(带有程序)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简易风洞设计

需要的材料

风机,小球,51单片机,风机驱动模块,液晶1602,超声波,电源

设计任务

设计制作一简易风洞及其控制系统。风洞由圆管、连接部与直流风机构成。圆管竖直放置,长度约40cm,内径大于4cm且内壁平滑,小球(直径4cm黄色乒乓球)可在其中上下运动;管体外壁应有A、B、C、D等长标志线,BC段有1cm间隔的短标志线;可从圆管外部观察管内小球的位置;连接部实现风机与圆管的气密性连接,圆管底部应有防止小球落入连接部的格栅。控制系统通过调节风机的转速,实现小球在风洞中的位置控制。

设计要求

(1)小球置于圆管底部,启动后5秒内控制小球向上到达BC段,并维持5秒以上。(20分)

(2)当小球维持在BC段时,用长形纸板(宽度为风机直径的三分之一)遮挡风机的进风口,小球继续维持在BC段。(10分)

(3)以C点的坐标为0cm、B点的坐标为10cm;用键盘设定小球的高度位置(单位:cm),启动后使小球稳定地处于指定的高度3秒以上,上下波动不超过±1cm。(10分)(4)以适当的方式实时显示小球的高度位置及小球维持状态的计时。(10分)

小球置于圆管底部,启动后5秒内控制小球向上到达圆管顶部处A端,且不跳离,维持5秒以上。(10分)

(5)小球置于圆管底部,启动后30秒内控制小球完成如下运动:向上到达AB段并维持3~5秒,再向下到达CD段并维持3~5;再向上到达AB段并维持3~5,再向下到达CD段并维持3~5;再向上冲出圆管(可以落到管外)。(20分)

(6)风机停止时用手将小球从A端放入风洞,小球进入风洞后系统自动启动,控制小球的下落不超过D点,然后维持在BC段5秒以上。(10分)

(7)其他自主发挥设计。(10分)

说明

(1)题中“到达XX段”是指,小球的整体全部进入该段内;

(2)题中“维持”是指,在维持过程中小球整体全部不越过该段的端线;

(3)小球的位置以其中心点为准(即小球的上沿切线向下移2cm,或下沿切线向上移2cm);

(4)直流风机的供电电压不得超过24V,注意防止风机叶片旋转可能造成的伤害;可在圆管及其周围设置传感器检测管内小球的位置;可将圆管、连接部与直流风机安装在硬质板或支架上,以便于使圆管保持竖直状态,并保持风洞气流通畅。

设计论证

该装置通过利用单片机输出pwm波控制风机转速,从而达到控制小球位置的目的。利用超声波检测小球离检测装置的距离通过单片机发送至外设lcd1602显示模块,并通过显示模块显示的数据利用键盘模块进行任务的设定。

部分程序代码

#include

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^3;

sbit led2=P1^4;

sbit RX=P3^2;

sbit TX=P1^5;

sbit LCM_RW=P1^1; //定义LCD引脚

sbit LCM_RS=P1^0;

sbit LCM_E=P2^5;

#define LCM_Data P0

//#define Key_Data P3_4 //定义Keyboard引脚

//#define Key_CLK P3_5

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

sbit in0=P1^0;

sbit in1=P1^1;

sbit ena=P3^0;

sbit k1=P3^6;

sbit k2=P3^7;

sbit k3=P3^5;

float a;

float zkb=10;

char val=2;

void delay(int z)

{ int x,y;

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

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

}

//1602

void Delay12us();

void Conut(void);

void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);

void Delay5Ms(void);

void Decode(unsigned char ScanCode);

void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadDataLCM(void);

unsigned char ReadStatusLCM(void);

unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = 0; //显示用指针

unsigned int time=0;

unsigned long S=0;

bit flag =0;

unsigned char disbuff[4] ={ 0,0,0,0,};

void delayms(unsigned int ms)

{

unsigned char i=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

//写数据

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙

LCM_Data = WDLCM;

LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时

LCM_E = 0; //延时

LCM_E = 1;

}

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{

if (BuysC) ReadStatusLCM(); //根据需要检测忙

LCM_Data = WCLCM;

相关文档
最新文档