电子系统综合设计与实践报告模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子系统综合设计与实践蜂鸣器乐曲演奏
院(系)名称信息工程学院
电子与通信工程系
专业名称14通信工程设备
学生姓名郑军强1301100094 王龙龙1301100080
李帅
指导教师石钦亮
2016年12 月1日
模拟风扇控制系统
摘要
电风扇简称电扇,香港称为风扇,日本及韩国称为扇风机,是一种利用电动机驱动扇叶旋转,来达到使空气加速流通的家用电器,主要用于清凉解暑和流通空气。
广泛用于家庭、办公室、商店、医院和宾馆等场所。
1882年,美国纽约的克罗卡日卡齐斯发动机厂的主任技师休伊•斯卡茨•霍伊拉,最早发明了商品化的电风扇。
如今的电风扇已一改人们印象中的传统形象,在外观和功能上都更追求个性化,而电脑控制、自然风、睡眠风、负离子功能等这些本属于空调器的功能,也被众多的电风扇厂家采用,并增加了照明、驱蚊等更多的实用功能。
这些外观不拘一格并且功能多样的产品,预示了整个电风扇行业的发展趋势。
其主要原因:一是风扇和空调的降温效果不同——空调有强大的制冷功能,可以快速有效地降低环境温度,但电风扇的风更温和,更加适合老人儿童和体质较弱的人使用;二是电风扇有价格优势,价格低廉而且相对省电,安装和使用都非常简单。
关键词:STC89S51,直流电机,数码管,138译码器等.
目录
引言 (4)
1、系统方案 (4)
2、设计任务及要求 (5)
1、工作模式 (5)
2、数码管显示 (5)
3、按键控制 (6)
3.1 S4控制风扇工作模式 (6)
3.2 S5定时器 (7)
3.3 S6 停止 (9)
3、重点、难点 (9)
4.结束语 (9)
参考文献 (10)
引言
电风扇是一种利用电动机驱动扇叶旋转,来达到时空气加速流通的家用电器,主要用于清凉解暑和流通空气,广泛用于家庭,办公室,商店,医院等场所。
如今的电风扇也一改人们印象中的传统形象,在外观和功能上都更追求个性化,人性化,也增加了照明,驱蚊等更多的实用功能。
电风扇曾一度被认为是空调产品冲击下的淘汰品,其实并非如此,家用电风扇并没有随着空调的普及而消失于市场,近年来反而出现了市场销售复苏的趋势。
其主要原因:一是风扇和空调的降温效果不同,空调有强大的制冷功能,可以快速有效的降低坏境温度,但电风扇更温和,更加适合老人儿童和体质较弱的群体使用;二是电风扇有价格优势,价格低廉而且相对省电,安装和使用也非常简单。
1、系统方案
“模拟风扇控制系统”能够模拟风扇工作,通过按键控制风扇的转速和定时时间,数码管显示风扇的工作模式,动态倒计时的显示剩余的工作时间,系统上主要有数码管显示,单片机最小系统、按键输入和电机的控制保护电路组成。
本实验通过4个按键(K4、K5、K6、K7),分别控制风扇系统的工作模式、定时、清
数码管显示
LED 指示灯
PWM 输出
按键输入
DS18B20
MC
U
“0”。
K4按一下,电机工作在“睡眠风”的状态,再按一次,电机工作在“自然风”状态,第三次按K4,工作在“常风”状态,当第四次按下K4,电机回到“睡眠风”工作状态。
K5负责定时功能,当按下K5,定时1分钟,数码管倒计时显示,第二次按下K5,定时2分钟,当第三次按下K5,无定时,当定时结束,电机自动停止工作。
K6是清“0”的功能,当按下K6,风扇工作在任何模式下,都停止工作,定时结束。
并通过8个数码管显示电机的工作模式,定时剩余时间等等。
通过18B20显示当前的温度。
2、设计任务及要求
1、工作模式
设备具有“睡眠风”、“自然风”、“常风”三种工作模式可以通过按键切换,通过单片机P3^4引脚输出脉宽调制信号控制电机运行状态,信号频率为1KHz。
2、数码管显示
数码管实时显示设备当前工作模式和剩余工作时间(倒计时),如图2所示。
一 1 一0 0 5 0
工作模式:睡眠风熄灭剩余工作时间:50秒
unsigned char tab[]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};
DisplayData[0]=0x40;
DisplayData[1]=tab[b%10];
DisplayData[2]=0x40;
DisplayData[4]=tab[0];
DisplayData[5]=tab[seconed%1000/100]&0x7f;
DisplayData[6]=tab[seconed%100/10];
DisplayData[7]=tab[seconed%10];
DigDisplay();
“睡眠风”状态下,对应数码管显示数值为1,自然风模式下,显示数值为2,常风模式下,显示数值为3.
3、按键控制
使用S4、S5、S6、S7四个按键完成按键控制功能。
3.1 S4控制风扇工作模式
按键S4定义为工作模式切换按键,每次按下S4,设备循环切换三种工作模式。
工作过程如下;
睡眠风自然风常风
在程序设计中,采用对按键是否按下的检测,当检测到按键有按下的操作后,通过用b限定按键的操作次数,第一次按下(b=1)为睡眠风,第二次(b=2)为自然风,第三次(b=3)为常风,当第四次按下后b=0,回到循环,重复操作。
电机转速的调节,不同模式下的风扇转动速度不同,驱动直流电动机时,在栅极施加恒定的高电平,则电动机在额定电压下以额定的转速旋转。
若在栅极施加了脉冲幅度为5V,脉冲周期相同而宽度不同的信号(即占空比不同)时,则转速发生变化。
占空比大时转速高,占空比小时,转速低;当占空比小到某值时,点顶级停止旋转。
改变占空比即可直接控制电动机的旋转。
分别在b=1、b=2,b=3下实现不同的转速。
void dj()
{
DigDisplay_2();
if(K4==0)
{
Delay10ms();
if(K4==0)
{
b++;
if(b==4)
{
b=1;
}
}
while(!K4);
}
if(b==1)
{
P3=0xFE;
DigDisplay_2(); PWM=1;
Delay100us(6); PWM=0;
Delay100us(4); }
if(b==2) { P3=0xfD;
DigDisplay_2(); PWM=1;
Delay100us(7); PWM=0;
Delay100us(3); }
if(b==3) {
P3=0xFB;
DigDisplay_2(); PWM=1;
Delay100us(8); PWM=0;
Delay100us(2); } }
3.2 S5定时器
按键S5定义为“定时按键”每次按下S5,定时时间增加1分钟,设备的剩余工作时间重置为当前定时时间,重新开始倒计时,工作过程如下:
针对于定时功能,采用定时器的方法,在工作模式1下,定时总中断,定时器0允许开关全部打开,TH0=(65536-50000)/256; TL0=(65536-50000)%256;定时时间为50ms ,在定时器0中命名count++,当count==20时,定时时间1s (50x20=1000ms=1s ),然后在定时器0之前定义的seconed 的值,采用seconed —的语句实现定时倒计时,倒计时
1分钟 2分钟
0分钟
在数码管上的显示调用DigDisplay_2()函数。
前面介绍过。
对于K5控制定时,由目的可知,无定时、定时1分钟、定时2分钟,之后回到无定时状态,依次循环。
通过定义的变量c控制定时的时间,当c=3时,重新定义c=0,循环控制,seconed表示定时时间,由于要实现无论在任何工作状态时只要按下K6,一切工作结束,所以要添加一个K6按键的扫描,当检测到K6按下,break直接跳出。
void ds()
{
TMOD=0x01; //定时器0 16位定时器
TR0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1;
if(K5==0)
{
Delay10ms();
if(K5==0)
{
c++;
if(c==3)
{
c=0;
}
}
while(!K5);
}
if(c==0)
{
seconed=0;
DigDisplay_2();
dj();
}
if(c==1)
{
seconed=60;
while(K5==1)
{
DigDisplay_2();
dj();
if(K6==0)
{
break;
}
}
}
if(c==2)
{
seconed=120;
while(K5==1)
{
DigDisplay_2();
dj();
if(K6==0)
{
break;
}
}
}
}
3.3 S6 停止
按键S6定义为“停止”按键,按下S6按键,立即清零剩余工作时间,PWM信号停止输出,直到通过S5从新色指定时时间。
3、重点、难点
本设计的重点、难点在于对电机定时的程序控制,如何用定时器实现1分钟、2分钟的时间控制以及在数码管上倒计时显示。
定时器的一个周期定时时间在90ms左右,单靠一个周期定义不可能实现长时间的定时,所以采用循环累加的方法,让定时器进行20次的定时循环(20*50=1000ms=1s),实现1s的定时。
在赋值的seconed中,以seconed—进行60次、120次的循环,实现定时60s、120s的功能。
4.结束语
通过本次设计,使我学到了许多书本上无法学到的知识,也使我深刻体会到单片机技术应用领域的广泛。
不仅让我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生更大的兴趣。
在本次设计过程中,我学会了在网络上查找有关设计的个
硬件的资源。
本系统是以单片机AT89C51芯片为核心部件,实现了电风扇系统控制功能,在软件上是花费时间最多的,我们上网找资料,上图书馆,尽可能的了解有关于电风扇的知识。
通过这次设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。
在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。
不但加深我对在课程上所学到的单片机理论知识的认识和理解,重新让自己认识到了这门学科的在应用方面的广阔前景,并且通过知识与应用于实践的结合更加丰富了自己的知识。
扩展了知识面,不但掌握了本专业的相关知识,而且对其他专业的知识也有所了解,而且较系统的掌握单片机应用系统的开发过程,因而自身的综合素质有了全面的提高。
经过这次一个较完整的产品设计和制作过程,对于认识到自己在知识方面存在的不足,明确今后的学习方向是非常有益的,为将来的的就业提前打了下坚实的基础。
的初期阶段,难度很大,没有头绪。
通过求助老师,理清思路。
同时,在图书馆里、网上查阅资料,攻克设计中的道道难题。
在克服困难的过程中,我学到了许多,特别是在课堂上学不到的东西。
总的感受有以下几方面:
1、通过本次设计,我不但对单片机有了更深的了解,对一个课题如何画流程图,编程序等有了一定的认识。
2、进一步加强了我的动手能力和运用专业知识的奴隶,从学习到如何去思考和解决问题,以及如何灵活地改变方法实现设计方案。
3、让我了解到单片机技术对当今人们生活的重要性。
同时这次设计的经历也使我受益匪浅,让我知道做任何事情都应脚踏实地,刻苦努力地去做,只有这样,才能做好。
参考文献
[1]杨雪.基于AT89C51单片机全部自动洗衣机仿真设计[J].黑龙江:黑龙江科技信息,2013(05).
[2]宋雪松.手把手教你学51单片机[M]. 北京:清华大学出版社,2015(10).
[3]张毅刚.单片机原理及应用-C51编程+Proteus仿真[M]. 北京:高等教育出版社,2012(11).
[4] 楼然苗.51系列单片机设计实例[M].北京:北京航空航天大学出版社,2003.
[5]朱宇光.单片机应用新技术教程[M].北京:电子工业出版社,2000.
程序:
#include<reg51.h>
#include<intrins.h>
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit PWM=P3^4;
unsigned char tab[]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90}; unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char seconed,count;
unsigned int c,b,x;
unsigned char DisplayData[8];
void Delay100us(unsigned int a);
void DigDisplay();
void DigDisplay_2();
void Delay10ms();
void dj();
void ds() void ds()
{
TMOD=0x01; //定时器0 16位定时器
TR0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1;
if(K5==0)
{
Delay10ms();
if(K5==0)
{
c++;
if(c==3)
{
c=0;
}
}
while(!K5);
}
if(c==0)
{
seconed=0;
DigDisplay_2(); dj();
}
if(c==1)
{
seconed=60;
while(K5==1)
{
DigDisplay_2(); dj();
if(K6==0)
{
break;
}
}
}
if(c==2)
{
seconed=120;
while(K5==1)
{
DigDisplay_2(); dj();
if(K6==0)
{
break;
}
}
}
}
//电机
void dj()
{
DigDisplay_2();
if(K4==0)
{
Delay10ms();
if(K4==0)
{
b++;
if(b==4)
{
b=1;
}
}
while(!K4);
}
if(b==1)
{
P3=0xFE;
DigDisplay_2();
PWM=1;
Delay100us(6);
PWM=0;
Delay100us(4);
}
if(b==2)
{ P3=0xfD;
DigDisplay_2();
PWM=1;
Delay100us(7);
PWM=0;
Delay100us(3);
}
if(b==3)
{
P3=0xFB;
DigDisplay_2();
PWM=1;
Delay100us(8);
PWM=0;
Delay100us(2);
}
}
//定时
void Time() interrupt 1
{
TR0=(65536-50000)/256; TL0=(65536-50000)%256;
while(K6==0)
{EA=0;
seconed=0;
}
count++;
if(count==20)
{
count=0;
seconed--;
if(seconed==0)
{
seconed=0;
TR0=0;
if(seconed==0)
{
while(K5==1)
{
PWM=0;
}
}
}
}
}
//延迟10ms
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
//延迟100us
void Delay100us(unsigned int a) //@12.000MHz {
unsigned char j;
j = 78;
while(a--)
{
while (--j);
}
}
//温度
void DigDisplay_2()
{
DisplayData[0]=0x40;
DisplayData[1]=tab[b%10];
DisplayData[2]=0x40;
DisplayData[4]=tab[0];
DisplayData[5]=tab[seconed%1000/100]&0x7f;
DisplayData[6]=tab[seconed%100/10];
DisplayData[7]=tab[seconed%10];
DigDisplay();
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=DisplayData[i];//发送段码
j=40; //扫描间隔时间设定
while(j--);
P0=0x00;//消隐
}
}
/******************************************************************************* *
* 普中科技
-------------------------------------------------------------------------------- * 实验名 : 18B20温度显示试验
* 实验说明 : 数码管显示温度值,并且将温度值通过串口发送到电脑上。
* 连接方式 : 见连接图
* 注意 :
*******************************************************************************/ #include<reg51.h>
//--定义使用的IO--//
sbit K6=P1^5;
void ds();
/******************************************************************************* * 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
while(1)
{
ds();
if(K6==0)
{
break;
}
}
}。