1、 单片机原理与应用课程设计 院(系):工业中心 班级:106001 姓名:王永安 路体力 10014 指引教师:王党利 时间:.07.07 目录 一、 设计题目............................................................4 二、 总体方案设计及分析..................................................4 三、 硬件原
2、理图设计......................................................4 四、 软件流程图及程序设计................................................6 五、 设计总结和心得体会..................................................13 摘 要 本次课程设计通过keilC软件和Proteus软件设计一
3、种电电扇模仿控制系统设计。基于AT89C51芯片实现了用四位数码管实时显示电电扇工作状态,最高位显示风类:“自然风”显示“1” 、“常风”显示“2” 、“睡眠风”显示“3”。后3位显示定期时间:动态倒计时显示剩余定期时间,无定期显示“000”。设计一种“定期”键,用于定期时间长短设立;设立一种“摇头”键用于控制电机摇头。设计过热检测与保护电路,若电扇电机过热,则电机停止转动,电机冷却后电机又恢复转动。最后完毕了设计任务。 核心词:AT89C51 keilC软件 Proteus软件
4、 一、设计题目:电电扇模仿控制系统设计 1、用4个LED显示电电扇工作状态(1,2,3,4四档风力),显示风类:“自然风”、“常风”和“睡眠风”。 2、设计 “自然风”、“常风”和“睡眠风” 三个风类键用于设立风类; 设计一种“摇头” 键用于控制电机摇头。 3、设计一种“定期”键,用于定期时间长短设立; 4、设计过热检测与保护电路,若电电扇电机过热,则电机停止转动,蜂鸣器报警,电机冷却后电机又恢复转动。 5、用LCD作为顾客界面显示电扇运营模式等信息。 6、其她功能。 二、总体方案设计分析、讨论
5、 1、程序阐明:为了提高单片机工作效率,不让单片机工作消耗在延时上,因此在考虑单片几需要延时时间里,单片机并不是做无用功,仅仅是在执行消耗时间“空指令”,而依照实际考虑出发,从本程序设计思路来看,电机除了数码管显示和PWM调速某些需要一定延时外,其她指令都是uS级,可以忽视不计,因此可以将数码管显示和PWM 调速某些做在一起,即数码管每一位显示需延时几种毫秒时间可以用来做解决PWM调速功能使用,通过设定,变化脉宽从而调速! 通过实验,本办法可以十分有效节约单片机资源,并且各项功能可以较好 工作! 2、程序功能阐明:功能总共有三个按键控制“功能键/加”、“定期”、“摇头/减”,
6、其中“功能键”“摇头”为多功能键。 初始状态时:电扇不转;数码管显示 POFF; 当第一次按“功能/加”时电扇处在“自然风”电机转速最快; 当第二次按 “功能/加”时电扇处在“常风”电机转速为中速; 当第三次按 “功能/加”时电扇处在“睡眠风”电机转速为低速; 当电扇处在停止状态时 不可进入定期状态,只有当电扇运转时才干进入定期状态,当按下“定期”键进入定期状态后(定期批示灯亮),功能键/加 键 为定期时间加, 当按下“摇头/减 键时,为定期时间减,再次按下定期键时,定期功能启动,时间到停止,并显示“POFF”电扇运转时按下摇头,即电机开始
7、摇头。 三、 硬件原理图: 该图是通过proteus7.0仿真设计和模仿成果 电电扇硬件控制系统 四、软件流程图及程序设计 *************************************************************************/ #include"reg52.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int sbit led=P1^0;
8、 sbit duan=P2^6; sbit wei=P2^7; sbit k1=P3^6;// 功能键/加键(3) sbit k2=P3^4;//定期功能键(1) sbit k3=P3^5;//摇头键/减键 sbit pwm=P2^1; sbit zz=P2^1; sbit fz=P2^2; uint t=50000,g=1; //g用来表是选风功能,tt定期时间 uchar f,biao1=0,sudd ; int tt=0; uchar kk=1;
9、uint aa=5; /************才初始化函数**************************************/ void init () { EA=1; ET0=1; // TR0=1; TMOD=0X01; //定期器0工作方式1 16位 TH0=(65536-t)/256; TL0=(65536-t)%256; } /***********************************************
10、/ uchar code sz[]= { 0x3F,/*0*/ 0x06,/*1*/ 0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/ 0x07,/*7*/ 0x7F,/*8*/ 0x6F,/*9*/ 0x71,/*F*/// 10 0x5C,/*o*/ //11
11、0x73// p 12 }; void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=50;j>0;j--); } /********pwm调速 兼作延时**************************/ void pwmdelay(uchar qq) { pwm=1; delay(1); pwm=0; delay(qq); pwm=1;
12、} /************当电扇停止时显示函数*******************************/ void display2() { P0=sz[12]; duan=1; duan=0; P0=0xfe; wei=1; wei=0; delay(10); //pwmdelay(sudu); P0=sz[0]; duan=1; duan=0; P0=0xfd; wei=1; wei=0;
13、 delay(10); // pwmdelay(sudu); P0=sz[10]; duan=1; duan=0; P0=0xfb; wei=1; wei=0; delay(10); // pwmdelay(sudu); P0=sz[10]; duan=1; duan=0; P0=0xf7; wei=1; wei=0; delay(10); // pwmdelay(sudu); P0=0xff;
14、wei=1; wei=0; P0=0x00;//关闭数码管显示防止闪烁 duan=1; duan=0; } /**************显示 函数 *****************************/ void display(uint shu) { uchar qian,bai,shi,ge; qian=biao1; bai=shu/100; shi=(shu%100)/10; ge=(shu%10);
15、 P0=sz[qian]; duan=1; duan=0; P0=0xfe; wei=1; wei=0; //delay(1); pwmdelay(sudu); P0=sz[bai]; duan=1; duan=0; P0=0xfd; wei=1; wei=0; //delay(1); pwmdelay(sudu); P0=sz[shi]; duan=1; duan=0; P0=0xfb;
16、 wei=1; wei=0; // delay(1); pwmdelay(sudu); P0=sz[ge]; duan=1; duan=0; P0=0xf7; wei=1; wei=0; //delay(1); pwmdelay(sudu); P0=0x00;//关闭数码管显示防止闪烁 duan=1; duan=0; P0=0xff; wei=1; wei=0; } /******************
17、/ /***************键盘程序***********************************/ void kescan() { uchar biao2;//一键多功能标号 /**************************************/ if(k1==0)//功能键 一键多功能键 自然风 常风 睡眠风 停止 { delay(50); if(k1==0) { pwm=
18、0;//关闭电机 while(!k1);//等待释放按键 biao1++;//功能选取 if(biao1==4)//只容许四种状态 biao1=0; } } /***********************************************/ if(biao1!=0) //功能0时 不可以设立定期功能 { if(k2==0)//定期功能键 按一次设立 第二次确认 { delay(50); if(k2==0)
19、 { tt=000; //如果进入定期功能 则显示所有清零 TR0=0;//确认按键俺下后关闭定期器 while(!k2);//等待释放按键 biao2=1; while(biao2)//如果不再次按下K2则将始终保持设立状态 { led=0; if(k1==0) { delay(50); if(k1==0) {
20、 while(!k1); tt=tt+10; if(tt>990) // tt=0; } } if(k3==0) { delay(50); if(k3==0) { while(!k3); tt=tt-10; if(tt<0) // tt=99
21、0; } } display(tt);//刷新设立时间 if(k2==0) //k2与否再次按下 { delay(50); if(k2==0) { while(!k2); if(tt>0) //如果进入定期设立后没有设立时间则不能退出定期功能 biao2=0; } } } TR0=1;//设立
22、好定期功能后启动定期器 led=1; } TR0=1;//启动定期器 } } } /************功能函数**********************/ void gongnen() { while(biao1==0) { pwm=0; tt=0; kescan(); display2(); } if
23、biao1==1) //功能1 自然风 {sudu=0;} if(biao1==2)//功能2 常风 {sudu=4;} if(biao1==3) //功能3 睡眠风 {sudu=10;} } /*************************************/ void main() { init(); while(1) { kescan(); display(tt); gongnen();
24、 } } /*****************************************/ /*****************定期器0中断函数************************/ void t_0()interrupt 1 { TH0=(65536-t)/256; TL0=(65536-t)%256; f++; if(f==20) { f=0;tt--;} if(tt==0) // 如果定期到了 显示为000,电机关闭 { tt=
25、000; biao1=0;//使电机不转 TR0=0; } } 五、设计总结和心得体会 课程设计是培养学生综合所学知识,发现、提出、分析和解决实际问题,锻炼自身能力重要培养,是对咱们学生能力详细陪练和考察过程。 短短一周时间,咱们做完了咱们小组单片机实验,感触很深,咱们小组做是“电电扇模仿控制系统设计”对咱们很有挑战,虽然在别人眼中咱们实验很简朴,但是咱们还是遇到了诸多困难。 随着科学发展日新月异,单片机已成为当今计算机应用中活跃领域,在咱们生活中可以说是无处不在,因而作为电力系统学生不得不掌握它,这次实验设计,对咱们是一种挑战
26、更是一种考验,怎么才干找到课堂所学与实际应用最佳结合点?如何才干使自己更专业化?如何才干使自己设计更具备序性,而不会忙无一用,这都是咱们所要考虑和努力。这次课程设计我学到诸多东西,学到了怎么去制定设计,怎么去实现设计,并掌握了在执行过程中如何克服心理上不良情绪,不但巩固了所学知识,并且学习到了许多书上所没有东西,我从中掌握了系统研究办法,可以进行某些简易编程。 在这次设计任务中,通过咱们三人共同努力,教师精心指引,尚有和在网上找到资料,咱们重要掌握了动态发光显示数码管编程,掌握了数据运算编程办法,这也是编程必要掌握知识,固然仿真与调试也是一种很重要环节,也让咱们收获良多,这其中就是硬件和软件两某些,虽然咱们没有做硬件,但软件制作与编程咱们也做得很认真。你必要对程序每某些都很熟悉,掌握每句程序作用,这样你浮现问题时才干依照问题改编程序,咱们浮现问题最多也是在这个地方,对编程不全面理解,导致咱们不能顺利完毕这个程序任务,固然也有诸多细节问题,咱们三人小组第一次合伙还不是配合得较好,这也挥霍了咱们许多时间,这也是咱们没有把这方面学夯实因素,因此咱们要一次把设计完毕好,不但要学习好课堂知识,并且要注意好各方面细节。 通过这次课题设计使我懂得了理论与实践相结合是非常重要,从理论中得出结论,才干真正为社会服务,从而提高自己思考能力,同步在设计中发现自己局限性之处。






