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