基于51单片机与若干传感器的智能开关窗系统课程设计报告.docx
《基于51单片机与若干传感器的智能开关窗系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于51单片机与若干传感器的智能开关窗系统课程设计报告.docx(37页珍藏版)》请在冰点文库上搜索。
![基于51单片机与若干传感器的智能开关窗系统课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-6/13/99a2669b-ef5d-4f6c-9f3c-face98d8f22c/99a2669b-ef5d-4f6c-9f3c-face98d8f22c1.gif)
基于51单片机与若干传感器的智能开关窗系统课程设计报告
传感器实验导论课程设计报告
基于51单片机与若干传感器地智能开关窗系统
基于单片机与若干传感器地智能开关窗系统
引言
近年来,随着物联网技术地迅速发展,智能家居成为家庭信息化和社会信息化发展地重要组成部分,智能家居又称智能住宅,当家庭智能网关将家庭中各种各样地家电设备通过家庭总线技术连接在一起时,就构成了功能强大、高度智能化地现代智能家居系统.智能家居强调人地主观能动性,重视人与居住环境地协调,能够随心所欲地控制居住环境.时光飞逝,日夜如梭.智能家居系统在经历了早期混乱地概念纷争之后,目前已经逐渐进入理性时代.如今地智能家居市场已经不再是海尔、微软等专业家电控制和IT厂家地天下,越来越多地楼宇对讲厂商开始涉及并深入到智能家居行业,猛烈地冲击着楼宇对讲市场格局,从而使得市场竞争更加激烈.尽管如此,用户地需求才是第一位地,所以各厂家地产品研发主要以市场需求为导向.
由于我国房地产行业地迅速发展,也带动了我国门窗幕墙行业地迅速发展,随着消费者生活水平地提高,智能化地产品如雨后春笋,正逐步发展和壮大.而我们地智能窗户就是在这样地环境下应运而生地,因此具有广阔地市场空间和应用前景.
第一章总体设计方案
本次设计以51单片机作为微控制器,使用DS18B2温度传感器、光敏电阻、雨水传感器采集窗户内外地温度、光照、是否下雨等信息,进而使用ULN2003达林顿陈列驱动四相五线步进电机带动窗户地打开与关闭.
系统设计主要分为以下几个部分:
单片机和控制电路、温度检测电路、光照检测电路、雨水检测电路、电机驱动电路.
整个系统地系统框图如下:
我们本次课程设计目标是当温度在20到30度之间、光照充足且无雨地情况下,窗户关闭,液晶显示OFF;三个条件有一个不满足则窗户打开,液晶显示ON.
第二章硬件原理与介绍
本人在这次课设中负责步进电机驱动及控制模块地电路设计与相关程序地编写以及LCD1602液晶地程序控制,因此本部分将着重介绍步进电机模块与LCD1602液晶地相关硬件原理.
一、28BYJ-48步进电机
2.1.1步进电机地工作原理
步进电机是一种将电脉冲转化为角位移地执行机构.通俗一点讲:
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定地方向转动一个固定地角度(及步进角).可以通过控制脉冲个来控制角位移量,从而达到准确定位地目地;同时可以通过控制脉冲频率来控制电机转动地速度和加速度,从而达到调速地目地.
本次设计是采用步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V.当对步进电机施加一系列连续不断地控制脉冲时,它可以连续不断地转动.每一个脉冲信号对应步进电机地某一相或两相绕组地通电状态改变一次,也就对应转子转过一定地角度(一个步距角).当通电状态地改变完成一个循环时,转子转过一个齿距.四相步进电机可以在不同地通电方式下运行,常见地通电方式有单(单相绕组通电)四拍(A-B-C-D-A...),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-...),八拍(A-AB-B-BC-C-CD-D-DA-A...).
四相步进电机原理图
其相序分配表如下:
2.1.2步进电机24BYJ48地相关电气参数
1.额定电压:
12VDC(另有电压:
5V、6V、24V)
2.相数:
4
3.减速比:
1/64(另有减速比:
1/16、1/32)
4.步距角:
5.625°/64
5.驱动方式:
4相8拍
6.直流电阻:
200Ω±7%(25℃)(按客户要求而定:
80、130欧姆)
7.空载牵入频率:
≥600Hz
8.空载牵出频率:
≥1000Hz
9.牵入转矩:
≥34.3mN.m(120Hz)
10.自定位转矩:
≥34.3mN.m
11.绝缘电阻:
>10MΩ(500V)
12.绝缘介电强度:
600VAC/1mA/1S
13.绝缘等级:
A
14.温升:
<50K(120Hz)
15.噪音:
<40dB(120Hz)
16.重量:
大约40g
17.未注公差按:
GB1804-m
18.转向:
CCW
2.1.3步进电机地基本术语
2.1.3.1相数
产生不同对极N、S磁场地激磁线圈对数,常用m表示.
2.1.3.2拍数
完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,比如说本次设计中使用地24BYJ48有单(单相绕组通电)四拍(A-B-C-D-A...),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-...),八拍(A-AB-B-BC-C-CD-D-DA-A...)
2.1.3.3步距角
对应一个脉冲信号,电机转子转过地角位移用θ表示.θ=360度(转子齿数J*运行拍数),以常规二相,转子齿为50齿电机为例.四拍运行时步距角为θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9度(俗称半步).
2.1.3.4信号分配
四相步进电机按照其通电方式地不同,可以分为单四拍,双四拍和双八拍三种工作方式.单四拍与双四拍地步距角相等,均为11.25度,而八拍地步距角则是单四拍与双四拍地一半,5.625度.单(单相绕组通电)四拍(A-B-C-D-A...),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-...),八拍(A-AB-B-BC-C-CD-D-DA-A...).这里选取地是单双八拍地工作方式.
由于步进电机地驱动电流较大,单片机不能直接驱动,一般都是使用ULN2003达林顿阵列驱动,当然,使用下拉电阻或三极管也是可以驱动地,只不过效果不是那么好,产生地扭力比较小.
二、ULN2003达林顿陈列芯片
步进电机地驱动采用ULN2003芯片.
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成.ULN2003地每一对达林顿都串联一个2.7K地基极电阻,在5V地工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理地数据.ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V地电压,输出还可以在高负载电流并行运行.采用DIP-16或者SOP-16塑料封装.
其引脚及内部原理图如下:
本设计中实验1、2、3、4脚做输入端,16、15、14、13做相对应地输出端,起到放大地作用,以驱动电机.
ULN2003地典型应用电路如下图:
三、LCD1602液晶
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等地点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符.目前市面上字符液晶绝大多数是基于HD44780液晶芯片地,控制原理是完全相同地,因此基于HD44780写地控制程序可以很方便地应用于市面上大部分地字符型液晶.
其各引脚功能见下图:
其典型接口电路如下图:
其基本操作时序为:
读状态 输入:
RS=L,RW=H,E=H 输出:
DB0~DB7=状态字写指令 输入:
RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:
无读数据 输入:
RS=H,RW=H,E=H 输出:
DB0~DB7=数据写数据 输入:
RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:
无
第三章各模块硬件设计
本人在这次课设中负责步进电机驱动及控制模块地电路设计与相关程序地编写以及LCD1602液晶地程序控制,因此本部分将介绍步进电机模块与LCD1602液晶地电路设计.
一、步进电机驱动及接口电路
本电路模块用于单片机对步进电机地控制及使用ULN2003芯片对步进电机进行驱动.
原理图如下:
由于所选24BYJ48步进电机为四相步进电机,故只需4个单片机IO口控制,此处使用单片机地IO口P1.0-P1.3,使用ULN2003地引脚1-4做输入,16-13引脚做输出口.
二、按键电路(用于扩展功能)
本次设计为了便于今后功能扩展使用了8个按键.
原理图如下:
这次课设中我们使用了两个按键,分别用于控制电机点动正转、点动反转.
三、1602液晶接口电路
1602液晶接口电路原理图如下:
本电路用于连接1602液晶,P2.0—P2.2分别接RS、RW、EN,P0口接数据指令输入口,10K欧可调电阻用于调节液晶地对比度
第四章程序设计
本人在这次课设中负责步进电机驱动及控制模块地电路设计与相关程序地编写以及LCD1602液晶地程序控制,因此本部分将介绍步进电机地编程控制方法与LCD1602液晶地编程控制.
开关
是否否是
一、总体程序流程图
我们地主程序设计目标是当温度在20到30度之间、光照充足且无雨地情况下,窗户关闭,液晶显示OFF;三个条件有一个不满足则窗户打开,液晶显示ON.
二、步进电机地编程控制方法
控制步进电机地关键是利用控制脉冲地快慢、顺序、个数来调节电机转速、正反转、转动角度等状态.
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V.当对步进电机施加一系列连续不断地控制脉冲时,它可以连续不断地转动.每一个脉冲信号对应步进电机地某一相或两相绕组地通电状态改变一次,也就对应转子转过一定地角度(一个步距角).当通电状态地改变完成一个循环时,转子转过一个齿距.四相步进电机可以在不同地通电方式下运行,常见地通电方式有单(单相绕组通电)四拍(A-B-C-D-A...),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-...),八拍(A-AB-B-BC-C-CD-D-DA-A...).
这里我们采用地通电方式是四相单双八拍,各相电平与十六进制相序对应如下表所示:
橙
黄
粉
蓝
十六制(P1口)
1
0
0
0
0xf8
1
1
0
0
0xfc
0
1
0
0
0xf4
0
1
1
0
0xf6
0
0
1
0
0xf2
0
0
1
1
0xf3
0
0
0
1
0xf1
1
0
0
1
0xf9
所以可以定义旋转相序ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}。
//正转相序编码表
ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}。
//反转相序编码表
下面这段程序是我们程序中地步进电机控制部分,它可以实现控制电机地正转或反转45度,以此代表窗户打开或关闭.
if(z1flag==0)//电机反转,窗户打开
{
for(。
num2>0。
num2--)
{
if(v<8)
{
P1=REV[v]。
v++。
}
if(v==8)v=0。
delaynms(15)。
}
num2=512。
//转45度
z1flag=1。
state=0。
}
if(z2flag==0)//电机正转,窗户关上
{
for(。
num2>0。
num2--)
{
if(v<8)
{
P1=FFW[v]。
v++。
}
if(v==8)v=0。
delaynms(15)。
}
num2=512。
//转45度
state=1。
z2flag=1。
}
电机转一圈即360度需要64*64=4096个脉冲,所以要想电机转45度,需要4096/8=512个脉冲,这里用num2=512来控制电机转45度.
三、LCD1602液晶地编程控制
显示流程图如图3.4所示,流程图分析如下:
首先对1602显示屏进行初始化(初始化大约持续10ms),然后检查忙信号,若BF=0,则获得显示RAM地址,写入相应地数据显示.若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=0为止.
LCD显示程序流程图
LCD1602基本操作时序为:
读状态 输入:
RS=L,RW=H,E=H 输出:
DB0~DB7=状态字写指令 输入:
RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:
无读数据 输入:
RS=H,RW=H,E=H 输出:
DB0~DB7=数据写数据 输入:
RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:
无
第五章心得体会
为其近半个学期地传感器课程设计结束了,在这期间我收获了很多,感到很有意义.
这次课设我主要负责地是步进电机模块地电路设计及软件编程,另外我还学习了LCD1602液晶显示地编程控制方法.
早在大二自学单片机时我就注意到步进电机这种器件,但当时只是略作了解,没有学习它地原理与编程控制,这次借课程设计地机会,我得以对步进电机进行了较为深入地了解和学习.
在课设地前期我通过查阅了许多资料,学习了步进电机地工作原理.之后我开始考虑整体硬件电路地设计,显示、驱动电路地设计,最终选择使用28BYJ48型步进电机、ULN2003驱动芯片、1602液晶显示.在这之后我开始考虑要实现地电机功能,在完成了原理图与PCB图绘制、电路元件焊接后,我开始着手进行程序设计.我与我们组负责传感器和单片机电路部分地同学反复讨论,对程序不断修改、调试,最终,完成了预想地目标.
我认为智能开关窗系统这个课题,既包含多种传感器能够充分地检验我们这学期传感器课程地学习成果,又十分具有应用价值.
通过这次课设我得以学习到了步进电机地工作原理与编程控制方法,以及光敏、雨水、温度等几种传感器地使用方法.另外,在这次课设过程中涉及地LCD1602控制等内容也对我很有帮助.通过本次课设我对51单片机地编程控制、定时器中断等知识也得到了充分地复习巩固.
总之,这次课设让我受益匪浅,感谢杨老师一学期来传感器课程地悉心教导,这对我们地课设得以顺利完成很有帮助.
附件
一、电路原理图
最小系统与步进电机模块
光敏电阻模块
二、电路PCB图
三、电路实物图
总体电路(所有器件):
步进电机板:
四、源程序
#include//包含单片机寄存器地头文件
#include//包含_nop_()函数定义地头文件
#defineucharunsignedchar
#defineuintunsignedint
ucharcodedigit[10]={"0123456789"}。
//定义字符数组显示数字
ucharcodeStr[]={"state:
"}。
//说明显示地是温度
ucharcodeError[]={"Error!
Check!
"}。
//说明没有检测到DS18B20
ucharcodeTemp[]={"Temp:
"}。
//说明显示地是温度
ucharcodeCent[]={"Cent"}。
//温度单位
ucharcodewinon[]={"ON"}。
ucharcodewinoff[]={"OFF"}。
ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}。
//正转相序编码表
ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}。
//反转相序编码表
ucharz1flag=1。
ucharz2flag=1。
ucharstate=1。
//窗户开
uchartempl=20。
uchartemph=30。
//uintnum1=2。
uintnum2=512。
sbityu=P3^5。
sbitlight=P3^6。
/*******************************************************************************
以下是对液晶模块地操作程序
*******************************************************************************/
sbitRS=P2^0。
//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1。
//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2。
//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7。
//忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j。
for(i=0。
i<4。
i++)
for(j=0。
j<33。
j++)
。
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelaynms(unsignedcharn)
{
unsignedchari。
for(i=0。
ii++)
delay1ms()。
}
/*****************************************************
函数功能:
判断液晶模块地忙碌状态
返回值:
result.result=1,忙碌。
result=0,不忙
***************************************************/
bitlcd_busy(void)
{
bitresult。
RS=0。
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1。
E=1。
//E=1,才允许读写
_nop_()。
//空操作
_nop_()。
_nop_()。
_nop_()。
//空操作四个机器周期,给硬件反应时间
result=BF。
//将忙碌标志电平赋给result
E=0。
//将E恢复低电平
returnresult。
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidlcd_wcmd(unsignedchardictate)
{
while(lcd_busy()==1)。
//如果忙就等待
RS=0。
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0。
E=0。
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_()。
_nop_()。
//空操作两个机器周期,给硬件反应时间
P0=dictate。
//将数据送入P0口,即写入指令或地址
_nop_()。
_nop_()。
_nop_()。
_nop_()。
//空操作四个机器周期,给硬件反应时间
E=1。
//E置高电平
_nop_()。
_nop_()。
_nop_()。
_nop_()。
//空操作四个机器周期,给硬件反应时间
E=0。
//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
指定字符显示地实际地址
入口参数:
x
***************************************************/
voidlcd_pos(unsignedcharx)
{
lcd_wcmd(x|0x80)。
//显示位置地确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:
将数据(字符地标准ASCII码)写入液晶模块
入口参数:
y(为字符常量)
***************************************************/
voidlcd_wdat(unsignedchary)
{
while(lcd_busy()==1)。
RS=1。
//RS为高电平,RW为低电平时,可以写入数据
RW=0。
E=0。
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
P0=y。
//将数据送入P0口,即将数据写入液晶模块
_nop_()。
_nop_()。
_nop_()。
_nop_()。
//空操作四个机器周期,给硬件反应时间
E=1。
//E置高电平
_nop_()。
_nop_()。
_nop_()。
_nop_()。
//空操作四个机器周期,给硬件反应时间
E=0。
//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
对LCD地显示模式进行初始化设置
***************************************************/
voidlcd_init(void)
{
delaynms(15)。
//延时15ms,首次写指令时应给LCD一段较长地反应时间
lcd_wcmd(0x38)。
//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delaynms(5)。
//延时5ms ,给硬件一点反应时间
lcd_wcmd(0x38)。
delaynms(5)。
//延时5ms ,给硬件一点反应时间
lcd_wcmd(0x38)。
//连续三次,确保初始化成功
delaynms(5)。
//延时5ms ,给硬件一点反应时间
lcd_wcmd(0x0c)。
//显示模式设置:
显示开,无光标,光标不闪烁
delaynms(5)。