简易风洞设计(带有程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;