ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:291.30KB ,
资源ID:3268811      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3268811.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(微机课程设计报告风扇控制.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

微机课程设计报告风扇控制.docx

1、微机课程设计报告风扇控制1、 设计的题目名称及要求 22、 实验设备 23、 设计思想、实施方案和硬件电路图 24、 典型程序模块及典型编程技巧分析 75、 课程设计中遇到的问题及解决方法 96、 实验程序的流程图 107、 程序清单及程序注释 168、 收获与体会 429、 参考文献 42一、课程设计的题目名称及要求设计题目:家用电扇控制实验与驱动电路设计基本设计要求: 1. 编程语言为汇编语言和C语言; 2. 控制硬件电路基于80x86微机接口电路; 3. 驱动电路(主回路)仅需设计; 4. 控制器功能包括:按钮三个,分别为风速、类型和停止,LED指示灯六个,指示风速强、中、弱,类型为睡眠

2、、自然和正常。指标如下: 1) 电扇处于停转状态时,所有指示灯不亮,只有按下“风速”键时,才会响应,进入起始工作状态;电扇在任何状态,只要按停止键,则进入停转状态。 2) 处于工作状态时,有:初始状态为:风速-“弱”,类型-“正常”按“风速”键,其状态由“弱”“中”“强” “弱” 往复循环改变,每按一下按键改变一次;按“类型”键,其状态由“正常”“睡眠”“自然”“正常” 往复循环改变;3) 风速的弱、中、强对应于电扇的转动由慢到快。4) 类型的不同选择,分别为:正常 电扇连续运转;自然 电扇模拟自然风,即转4s,停8s;睡眠 电扇慢转,产生轻柔的微风,运转 8s,停转8s;5) 按照风速与类型

3、的设置输出相应的控制信号。附加功能扩展:根据控制性能要求,在“睡眠”和“自然”类型下仍可选择不同的“风速”,工作时总共有“3*3”种不同的模式,而且通过按键的分时复用可在“停止”与“工作”两种状态间反复切换而不必重载程序。 二、实验设备PC机一台(装有TDPIT软件)、唐都TD-Pit实验箱。三、设计的思想和实施方案由于本次课程设计控制的对象是直流电机,在上个学期学习的电机与电力拖动时已知直流电机可通过改变给定电压的大小调节其转速,但实际测试时风扇的转速变化不够明显,故采用了两种方案:1、 用汇编语言编写的程序通过改变电压控制直流电机的转速。2、 用C语言编写的程序采用PWM波控制直流电机的转

4、速。方案1较容易实施,但由于对PWM波比较陌生,方案2需要搜索了一些PWM控制方式的相关资料,所得资料如下:PWM控制就是对脉冲的宽度进行调制的技术。即通过对一系列脉冲的宽度进行调制来等效地获得所需要波形(含形状和幅值)。在采样控制理论中有一条重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同,冲量即窄脉冲的面积。效果基本相同是指环节的输出响应波形基本相同。上述原理称为面积等效原理。简单点说,就是通过调节时间周期很小的方波的占空比就可以明显地调节直流电机的转速。 图1、TD-PIT直流电机及驱动电路单元驱动电机的电压由DA0832提供,DA0832的输出OUT接驱动电

5、路的A端,驱动电路的12V和A端分别接直流电机的1端和2端。图2、DA0832单元 解决了电机的控制问题后,课题要求有6个LED灯显示相应的风速和类型以及3个按键做相应的控制,于是本人想到了用一片8255做LED灯的驱动电路和小键盘的读取接口。8255内部包含3个8位的输入输出端口A、B和C,端口A和端口B都可以用作一个8位的输入口或8位的输出口,端口C既可以作为一个8位的输入口或8位的输出口,又可以作为两个4位的输入输出口(C口上半部分和C口下半部分)使用,还可以配合A口和B口工作,分别用来产生A口和B口的输出控制信号和输入A口和B口的端口状态信号。本次设计,我对8255的使用是这样的:82

6、55工作于方式0,A口低四位接键盘及数码管显示单元的Y4-Y1;C口接LED及开关单元的LED灯D0-D7;B口和A口高四位悬空。选择C口做LED灯的接口是因为C口能方便地通过编程置位和复位,从而方便的点亮和熄灭相应的LED信号。图3、8255单元键盘及数码管显示单元的X1接地,Y1对应“风速”,Y2对应“类型”,Y3对应“停止”,X2、X3、X4悬空。本次实验未用到数码管,故A、B、C、D、E、F、G、DP悬空。图4、小键盘及数码管显示单元图5、硬件电路总接线图如上图示:该图涉及到系统总线、可编程外围接口芯片8255、DA0832、键盘及数码管显示单元、直流电机及其驱动电路。8255和DA0

7、832的D0D7 依次接系统总线的XD0XD7,DA0832的A1和A0分别接系统总线的XA3和XA2;WR和RD 依次接系统总线上的XIOW和XIOR;8255的CS接系统总线的IOY0,DA0832的CS接系统总线的IOY1;DA0832的OUT接驱动电路的A端;8255的PC0-PC7接低八位LED。四、典型程序模块及典型编程技巧分析1、C语言与汇编语言的共同典型模块(1)主函数(或主程序)MAIN当程序运行时,PC机屏幕上显示提示菜单,完成硬件初始化电机不转动且LED无显示,8255工作方式0、A口输入、C口输入,并等待小键盘的输入。若当小键盘有键按下且键值是“110(Y3Y2Y1)”

8、时电机启动,PC机屏幕显示电机转动的风速强弱,LED显示风速和类型(低速、正常PC0和PC4为1); 若当小键盘有键按下且键值为“011”时,退出程序。编程小技巧:将读入的A口数据与07H“与”运算可屏蔽A口其他位对输入信息的影响。(2)不带键盘检测的延时模块DELLY用与键盘检测时防抖。(3)小键盘检测模块KEY 当小键盘无输入时返回调用该模块的下一条指令,如果有小键盘输入则延时一定的时间(调用不带键盘检测的延时模块),若输入为“110”则改变风速,若输入为“101”则改变类型,若输入为“011”则停止风扇转动并熄灭LED指示灯。(4)带键盘检测的延时模块DELLY2 由于希望“睡眠”和“自

9、然”类型下风扇能实时响应小键盘的控制,所以在这两种类型中的延迟用的是带键盘检测的延时模块。2、C语言的特别模块风扇控制集成模块WIND_MODE本模块将风扇的转速和类型控制集于一体,先检测风速强弱的标志FLAG,再检测类型标志FLAG2,从而对直流电机和LED灯进行相应的控制。在电机的运行过程中实时调用小键盘检测模块以及时响应输入。3、汇编语言的特别模块汇编语言中的的风速和类型控制并不作为独立过程,而是用标号标示在主程序中,通过条件判断和跳转指令给DA0832相应的电压数字量和延时,用做标志的是LIGHT1和LIGHT2,即通过灯控信号识别直流电机的控制信号。编程小技巧:由于灯控信号是通过82

10、55的C口输出的,而C口可通过控制字进行置位(1)和复位(0),如果要熄灭一盏已点亮的LED灯,可将该LED对应的灯控信号(比如LIGHT1)与0EH“与”运算再输出到8255的控制字。五、课程设计中遇到的问题及解决方法1、直流电机的控制方式:用哪种方式能改变直流电机的转速,使其有明显的转速变化以区分“弱”、“中”、“强”三种风速是最开始遇到的问题。通过查找资料,并在实验室调节DA0832的输出(占空比不变时改变电压数字量、电压不变时改变占空比)观察风扇的转速变化,最终确定调节PWM波的占空比为有效的控制方式。2、小键盘检测:由于采用的是软件延时,小键盘的检测究竟需要多久的延时才使程序在检测到

11、一次按键时,刚好使风速或者类型改变一次(而不是两次或以上)是个很棘手的问题。为此曾多次调节键盘检测延时的参数,也多次由于延时不当使程序执行时造成死机。最后终于调出了合适的延时参数。3、自然和睡眠类型下风扇需要转一会停一会,如何在风扇停转的这段延时中使风扇能实时响应小键盘的输入,这是又一个大问题。在多次调整程序的结构觉得毫无作用的时候,本人想到了增加一个带键盘检测的延时模块,从而轻松解决了该问题。4、当按下小键盘的按键时X端和Y端的状态是低电平还是高电平直接关系到输入检测问题。通过查询TD-PIT实验平台用户手册和使用数字万用表了解了X端和Y端在按键按下时的电平状态,据此可获得所要检测的数字输入

12、信号。5、程序编译连接没通过,尤其是C语言,提示的错误不存在,很可能是因为函数的括号没成对出现或者某个语句缺少分号结尾而产生。或者是输入的符号用了全角或者中文输入而没注意,这些通过养成良好的编程习惯可以很大程度地避免。6、程序在调试中没问题,可是一运行就死机,这种问题经常发生,有可能是硬件的问题,也可能是调试时不够仔细,没调试完所有功能就急着运行了。这需要仔细耐心地把程序的所有功能都调试一遍,防止意外的执行结果产生。六、实验程序的流程图流程图1-1:MAIN函数流程图流程图1-2:风扇运行模式特别说明:圆点线部分由于页面大小无法全部画出,该部分与风速标志值为“1”时只在风速上有差别(分别为3对

13、应强风,2对应中风),未画出的两个部分和中间的部分一起构成三个分支。流程图1-3:小键盘检测流程图1-4:带键盘检测的延时模块流程图1-5:不带键盘检测的延时模块特别说明:汇编语言的程序流程和C语言的大同小异,只是标志符号有所不同。七、程序清单及程序注释1、C语言程序清单/使用芯片:08328255/家用风扇控制#include #include #include #include #include void key(char *f_point,char *f2_point); void delay(long int time); /不带键盘检测的延时模块void delay2(long in

14、t time,char *f_point,char *f2_point); /带键盘检测的延时模块void wind_mode(char,char);/*根据查看配置信息修改下列符号*#define IOY0 0xC400#define IOY1 0xC440/*#define MY8255_A IOY1 + 0x00*4#define MY8255_B IOY1 + 0x01*4#define MY8255_C IOY1 + 0x02*4#define MY8255_MODE IOY1 + 0x03*4/*#define DA0832 IOY0 + 0x00*4char ch1,flag=1

15、,flag2=1;void main()char f; outp(MY8255_MODE,0x90); outp(DA0832,0x00); printf(WELCOME TO USE IT!nCHOOSE 1 TO CHANGE SPEED!InCHOOSE 2 TO CHANGE TYPE!nCHOOSE 3 TO QUITE!n); while(1) loop1: f=inp(MY8255_A); f=f&0x07; if(f!=0x07) switch(f) case 0x06: wind_mode(flag,flag2);break; case 0x03: outp(DA0832,0

16、x00);flag=1;flag2=1;break; case 0x05: outp(DA0832,0x00);outp(MY8255_MODE,0x90);exit(0);break; /*风速模式*void wind_mode(char f,char f2)long int a,b; char *f_point,*f2_point; f_point=&f; f2_point=&f2; switch(f) /*flag=1则设置风速为弱,占空比1/3* case 1: printf(wind_weakt); outp(MY8255_MODE,0x01); /屏幕以及指示灯提示风速 while

17、(f=1) switch(f2) case 1:outp(MY8255_MODE,0x0c); outp(MY8255_MODE,0x09); b=1; for(a=0;ab;a+) /flag2=1,正常模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x200); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); break; case 2:outp(MY8255_MODE,0x08); outp(MY8255_MODE,0x0b); b=0x200000; for(a=0

18、;a(b/0x28);a+) /flag2=2,自然模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x200); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); if(f2!=2|f!=1) break; if(f2!=2|f!=1) break; outp(DA0832,0x00); delay2(b,f_point,f2_point); break; case 3:outp(MY8255_MODE,0x0a); outp(MY8255_MODE,0x0d); b=0x4

19、00000; for(a=0;a(b/0x50);a+) /flag2=3,睡眠模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x100); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); if(f2!=3) /小键盘有输入,跳出FOR循环 f2=1;break; if(f!=1) break; if(f2!=3|f!=1) break; outp(DA0832,0x00); delay2(b,f_point,f2_point); if(f2!=3) f2=1; break

20、; outp(MY8255_MODE,0x00); flag=f; flag2=f2; break; /* /*flag=2则风速为中,占空比1/2* case 2: printf(wind_mediumt); /屏幕以及指示灯提示风速 outp(MY8255_MODE,0x03); while(f=2) switch(f2) case 1:outp(MY8255_MODE,0x0c); outp(MY8255_MODE,0x09); b=1; for(a=0;ab;a+) /flag2=1,正常模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x100); c

21、h1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); break; case 2:outp(MY8255_MODE,0x08); outp(MY8255_MODE,0x0b); b=0x200000; for(a=0;a(b/0x28);a+) /flag2=2,自然模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x100); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); if(f2!=2|f

22、!=2) break; if(f2!=2|f!=2) break; outp(DA0832,0x00); delay2(b,f_point,f2_point); break; case 3:outp(MY8255_MODE,0x0a); outp(MY8255_MODE,0x0d); b=0x400000; for(a=0;a(b/0x50);a+) /flag2=3,睡眠模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x100); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_poin

23、t); if(f2!=3) /小键盘有输入,跳出FOR循环 f2=1;break; if(f!=2) break; if(f2!=3|f!=2) break; outp(DA0832,0x00); delay2(b,f_point,f2_point); if(f2!=3) f2=1; break; outp(MY8255_MODE,0x02); flag=f; flag2=f2; break; /* /*flag=3则风速为强,占空比2/3* case 3: printf(wind_strongt); /屏幕以及指示灯提示风速 outp(MY8255_MODE,0x05); while(f=3

24、) switch(f2) case 1:outp(MY8255_MODE,0x0c); outp(MY8255_MODE,0x09); b=1; for(a=0;ab;a+) /flag2=1,正常模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x50); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); break; case 2:outp(MY8255_MODE,0x08); outp(MY8255_MODE,0x0b); b=0x200000; for(a=0;a(b/

25、0x28);a+) /flag2=2,自然模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x50); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); if(f2!=2|f!=3) break; if(f2!=2|f!=3) break; outp(DA0832,0x00); delay2(b,f_point,f2_point); break; case 3:outp(MY8255_MODE,0x0a); outp(MY8255_MODE,0x0d); b=0x400000;

26、 for(a=0;a(b/0x50);a+) /flag2=3,睡眠模式 ch1 = 0x00; outp(DA0832, ch1); delay(0x50); ch1 = 0xff; outp(DA0832, ch1); delay(0x100); key(f_point,f2_point); if(f2!=3) f2=1;break; if(f!=3) break; if(f2!=3|f!=3) break; outp(DA0832,0x00); delay2(b,f_point,f2_point); if(f2!=3) f2=1;break; if(f!=3) break; break; outp(MY8255_MODE,0x04); flag=1; flag2=f2; break; /* return; /*小键盘检测*void key(char *f_point,char *f2_point) char C;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2