东华大学单片机课设空调遥控器.docx
《东华大学单片机课设空调遥控器.docx》由会员分享,可在线阅读,更多相关《东华大学单片机课设空调遥控器.docx(34页珍藏版)》请在冰豆网上搜索。
东华大学单片机课设空调遥控器
JonMMx2000
2012年6月21日——2012年7月5日
东华大学信息学院自动化系
单片机课程设计
空调机遥控发射机
姓名:
纪凯玲
学号:
150940401
目录:
一.项目概述…………………………………………2
二.系统设计………………………………………………3
三.硬件设计…………………………………………………5
四.软件设计……………………………………………11
五.系统仿真及调试……………………………………34
六.结果与展望………………………………………37
七.参考文献…………………………………………38
附录:
硬件电路原理图……………………………39
一、项目概述
空调遥控器可以用来庙宇空调机的控制温度(室内温度)、工作状态(常态、除湿、通风)、风扇风速(强、弱、中)以及定时时间(空调工作多少小时自动开机或延时多少小时自动开机)。
使用者在遥控器上庙宇预期的空调机工作状态、控制温度及延时时间后,这些参数即送至空调机,空调机按要求开始工作。
该遥控器的要求如下:
(1)数字显示器:
第一组显示时间,发送前指示设定的延时时间:
0——9h,发送后指示剩余的延时时间;第二组显示控制温度15——35℃。
(2)工作状态指示器3组:
第一组指示设定的工作状态:
常态、除湿、通风;第二组指示延时开机、延时停机、取消等三种延时要求;第三组指示空调机的三种工作速度:
慢速、中速、高速。
(3)红外发射管,发射的调制频率是45KHz。
(4)3节5号电供电。
(5)面板示意图见图。
设计以AT89C51为核心的遥控器电路,并编写相关的系统软件(汇编、C51程序均可)。
二、系统设计
i.设计思想
用两组LCD1602作为数字显示器分别显示主从机的时间和温度值,其中时间的切换利用AT89C51内部自带的定时器,工作状态利用LED灯的亮灭来指示,其中LED亮代表相对应的工作模式被选中,各种工作状态的切换使用8个独立按键来实现。
ii.方案可行性分析
数字显示器使用LCD1602显示时间和温度值,其中时间的切换利用AT89C51内部自带的定时器0,定时初值为3cb0,定时器工作模式为’01’16位定时器,工作状态利用LED灯的亮灭来指示,其中LED亮代表相对应的工作模式被选中,各种工作状态的切换使用8个独立按键来实现,分别位‘工作状态设定键’、‘延时状态设定键’、‘风速选定键’、‘温度+键’、‘温度-键’、‘延时时间位选定键’、‘延时时间设置键’、‘发送键’;按下‘发送键’后信息的发送使用串行口的方式发送给上位机并显现出来,当延时时间到启动空调。
利用串口查询的方式实现两台单片机之间通信的功能。
iii.总体方案
根据设计思想,将设计划分为四个模块:
按键模块、LED状态显示模块、LCD显示模块、双机串口通信模块。
a.按键模块
按键实现各种工作状态的切换,分别为‘工作状态设定键’、‘延时状态设定键’、‘风速选定键’、‘温度+键’、‘温度-键’、‘延时时间位选定键’、‘延时时间设置键’、‘发送键’,具体说明如下图1:
K1工作状态设定键(常态、除湿、通风)
K2延时状态设定键(延时开、延时关、取消)
K3风速选定键(慢、中、快)
K4温度设定键(增加+)
K5温度设定键(减少-)
K6延时时间位选定键(XXXXXX)
K7延时时间设置键(默认为循环增加)
K8发送键
图1 -按键说明-
b.LED状态显示模块
工作状态利用LED灯的亮灭来指示,其中LED亮代表相对应的工作模式被选中,分别为‘正常’、‘除湿’、‘通风’、‘定时开’、‘定时关’、‘风速慢’、‘风速中’、‘风速高’,如下图2:
D1正常
D2除湿
D3通风
D4延时开(如果D4/D5两灯全灭则取消延时)
D5延时关
D6慢
D7中
D8高
图2 -LED灯状态说明-
c.LCD显示模块
用一个LCD显示模块显示主机(遥控)显示面板上的设定温度和延时时间;用另一个LCD显示模块显示从机(空调)显示面板上的温度和开关机状态。
d.双机串口通信模块
利用串口查询的方式实现两台单片机之间通信的功能,单片机1(模拟遥控器)作为发送机,单片机2其(模拟空调)作为接收机。
主机P3.0/RXD、P3.1/TXD分别接从机的P3.1/TXD、P3.0/RXD引脚。
三、硬件设计
i.硬件电路工作原理
a.按键模块
按键实现各种工作状态的切换,分别为‘工作状态设定键’、‘延时状态设定键’、‘风速选定键’、‘温度+键’、‘温度-键’、‘延时时间位选定键’、‘延时时间设置键’、‘发送键’。
硬件原理图如下图3-1:
图3-1 ―按键硬件原理图―
当K1按下时,保持P0高5位状态,按下第一次最后一位置0,倒数第二、三位置1按下第二次时到数第二位置0,倒数第一、三位置1,按下第三次时倒数第三位置0,倒数第一、二位置1,依次循环,代码实现P0=(states1[i]&(P0|0x07));
当K2按下时,保持P0倒数第1、2、3位和正数第1、2、3状态按下第一次时倒数第一位亮表示延时开,按下第二次时倒数第五位亮表示延时关,按下第三次时倒数第3、4位皆灭表示取消延时,依次循环,代码实现:
P0=(states2[j]&(P0|0x18));
当K3按下时,保持P0低5位不变,按下最高两位置1,第三位置0,表示慢速,按下第二次时第二位置0,第一、三位置1,表示中速,按下第三次时第一位置0,第一、二位置1,依次循环,代码实现:
P0=(states3[k]&(P0|0xe0));
b.LED状态显示模块
工作状态利用LED灯的亮灭来指示,其中LED亮代表相对应的工作模式被选中,分别为‘正常’、‘除湿’、‘通风’、‘定时开’、‘定时关’、‘风速慢’、‘风速中’、‘风速高’,硬件原理图如下图3-2-1、图3-2-2:
图3-2-1 -主机(遥控)LED状态说明-
图3-2-2 -从机(空调)LED状态说明-
c.LCD显示模块
用一个LCD显示模块显示主机(遥控)显示面板上的设定温度和延时时间;用另一个LCD显示模块显示从机(空调)显示面板上的温度和开关机状态。
硬件原理图如图3-3-1、图3-3-2所示。
如图3-3-1 -主机(遥控)LCD连接原理-
如图3-3-1 -从机(空调)LCD连接原理-
d.双机串口通信模块
利用串口查询的方式实现两台单片机之间通信的功能,单片机1(模拟遥控器)作为发送机,单片机2其(模拟空调)作为接收机。
主机P3.0/RXD、P3.1/TXD分别接从机的P3.1/TXD、P3.0/RXD引脚。
硬件原题图如图3-4。
如图3-4 -双机串口通信连接原理-
e.总硬件原理图
将各个模块连接得如下图3-5所示的总体硬件连接原理图。
如图3-5 -总电路-
ii.参数计算
a.延时开关空调中,时间的切换利用AT89C51内部自带的定时器0,定时器工作模式为’01’为16位定时器设定为50ms,AT89C51的晶振为12MHz,50ms为50000个机器周期,定时值为50000,定时初值为
所以定时初值为0x3CB0.
b.发送机和接收机串口采用方式1,8位UART,波特率可变,其中T1的采用方式3(8位自填装模式),选用常用串口的波特率2400bits,计数初值为
由
得
所以计数初值为0xF4F4.
四、软件设计
i.软件设计思想
主机从机均实现51单片机对LCD的控制,故将LCD的定义放在同一个文件中,在主机从机的主函数中使用外部声明函数进行引用。
LCD初始化子程序voidinitLCM(void)进行清屏,打开显示屏;
LCD延时子程序voiddelay_LCM(uint)实现延时K*1ms,12.000mhz;
LCD检测忙子程序voidlcd_wait(void)实现LCD内部等待;
写指令到LCD子函数voidWriteCommandLCM(ucharWCLCM,ucharBusyC)使LCD进入写模式;
写数据到LCD子函数voidWriteDataLCM(ucharWDLCM)使LCD进入写模式;
显示指定坐标的一个字符子函数voidDisplayOneChar(ucharX,ucharY,ucharDData)实现显示指定坐标的一个字符;
显示指定坐标的一串字符子函数voidDisplayListChar(ucharX,ucharY,unsignedchar*DData)实现显示指定坐标的一串字符子;
主机程序中,进行LCD初始化后,通过死循环while(1)不断扫描各按键状态,获取各状态,直至扫描到发送键K8被按下,则发送已获取的数据。
从机采用串口查询方式接收主机发送过来的数据,当单片机2的RI信号有效时,从机进行清楚中断标志后开始接收主机发送来的数据。
ii.程序流程图
a.主机(遥控)发送如图4-1、图4-2:
K1~K3:
图4-1 K1~K3流程图
K4~K8:
图4-2 K4~K8流程图
b.从机(空调)接收流程图如图4-3:
图4-3 从机接收程序流程图
iii.程序清单
a.LCD定义文件:
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineBUSY0x80//lcd忙检测标志
#defineDATAPORTP2//定义P0口为LCD通讯端口
sbitLCM_RS=P3^3;//数据/命令端
sbitLCM_RW=P3^4;//读/写选择端
sbitLCM_EN=P3^5;//使能信号
voiddelay_LCM(uint);//LCD延时子程序
voidlcd_wait(void);//LCD检测忙子程序
voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数
voidWriteDataLCM(ucharWDLCM);//写数据到LCM子函数
voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数
voidinitLCM(void);//LCD初始化子程序
voidDisplayListChar(ucharX,ucharY,unsignedchar*DData);
//显示指定坐标的一串字符子函数
/*********延时K*1ms,12.000mhz**********/
voiddelay_LCM(uintk)
{
uinti,j;
for(i=0;i{
for(j=0;j<60;j++)
{;}
}
}
/**********写指令到LCM子函数************/
voidWriteCommandLCM(ucharWC