“格力空调遥控器”程序设计说明
1 工程文件下载:
2 程序设计思想与总体框架说明
2.1 程序设计思想
该程序主要分为三个模块,即按键模块,数码管显示模块,红外通信模块。按键模块用定时器0计数,每个1ms对按键状态进行一次扫描,在连续扫描100次的过程中如果有一般的次数某个按键处于按下状态则表示该按键已经按下触发相关功能;数码管显示模块也是每隔1ms扫描一个数码管,将开关状态显示在第一个数码管,将温度值显示在第7,8个数码管上;红外通信模块用定时器1中断函数进行发送并控制其发送时间,根据格力空调遥控编码原理依次发送起始码+35位数据码+连接码+32位数据+停止码,低电平时发送38KHZ红外波,高电平不发送。
2.2 程序总体框架流程

图1 程序总体流程图
3 程序相关宏定义、变量和函数说明
3.1宏定义和变量说明
表1程序中相关宏和变量说明表
| 变量名 | 初始值 | 含义 | |
| 宏 | IR_OUT | P35 | 红外发射端口P3.5的别名 |
| TIMER01MSTH0 | 0xfc | 定时器0在12T、16位手动装载模式下定时1ms时寄存器TH0的初始值 | |
| TIMER01MSTL0 | 0x66 | 定时器0在12T、16位手动装载模式下定时1ms时寄存器TL0的初始值 | |
| TIMER113USTH1 | 0xF4 | 定时器1在12T、8位自动装载模式下定时13us时寄存器TH1的初始值 | |
| TIMER113USTL1 | 0xF4 | 定时器1在12T、8位自动装载模式下定时13us时寄存器TL1的初始值 | |
| TIMER1600USNUM | 46 | 定时器1在每13us中断一次的情况下计时600us需要的中断次数 | |
| TIMER11600USNUM | 123 | 定时器1在每13us中断一次的情况下计时1600us需要的中断次数 | |
| TIMER14500USNUM | 346 | 定时器1在每13us中断一次的情况下计时4500us需要的中断次数 | |
| TIMER19000USNUM | 692 | 定时器1在每13us中断一次的情况下计时9000us需要的中断次数 | |
| TIMER120000USNUM | 1538 | 定时器1在每13us中断一次的情况下计时20000us需要的中断次数 | |
| DIGTUBENUM | 8 | 数码管个数 | |
| DIGGROUPNUM | 8 | 数码管组数(用于扩展) | |
| KEYNUM | 8 | 按键个数 | |
| KEYSENSITY | 100 | 按键扫描次数,即每采集100次按键数据更新一次按键状态 | |
| Uint8 Timer01msFlag1 | 0 | 定时器计时1ms标志变量1,用于扫描数码管 | |
| Uint8 Timer01msFlag0 | 0 | 定时器计时1ms标志变量0,用于扫描按键 | |
| uint8 IRFLAG | 0 | 判断是否发送38KHZ红外波的标志变量,1表示发送,0表示不发送。 | |
| uint8 GreeInstructions[30][9] | 格力空调指令码 | ||
| uint8 digtalduan[18] | 0~f数码管显示值 | ||
| struct keyfunc | 按键相关结构体 | ||
| uint16 timer0Num | 0 | 定时器1中断次数,用于控制发送电平宽度。 | |
3.2 函数说明
表2程序中主要函数说明表
| 函数名 | 参数 | 返回值 | 功能描述 |
| Device.c | |||
| keyInit() | void | void | 初始化A/D,将通道P1.7作为AD输入。 |
| keyScan | void | void | 扫描按键,判断各按键状态 |
| digScan | Void | void | 数码管扫描,将相应数据显示到数码管上。 |
| Timer0Init() | void | void | 初始化定时器0,每1ms触发一次中断 |
| Timer1Init() | void | void | 初始化定时器1,每13us触发一次中断 |
| IRC.c | |||
| SendS | void | void | 发送起始码 |
| SendC | void | void | 发送连接码 |
| Send0 | void | void | 发送数据0 |
| Send1 | void | void | 发送数据1 |
| SendInstructions | uint8 openORClose,uint8 temperature | void | 发送一整条格力空调遥控指令 |
| Interupt.c | |||
| int_timer0 | Void | void | 定时器0中断函数,每中断将标志变量Timer01msFlag0,Timer01msFlag1置1。 |
| int_timer1 | void | void | 定时器1中断函数,用来控制红外发射以及发送电平宽度。 |
| Main.c | |||
| configinIt | 初始化IO。 | ||
| main | void | void | 初始化IO,定时器,AD,扫描数码管和按键并作出相应的动作。 |
4 相关寄存器配置
4.1 定时器0相关寄存器配置
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
IE |=0x02;
TL0 = TIMER01MSTL0;
TH0 = TIMER01MSTH0;
TF0 = 0;
TR0 = 1;
4.2 定时器1相关寄存器配置
AUXR &= 0xBF;
TMOD &= 0x0F;
TMOD |= 0x20;
IE |=0x08;
IP |=0x08;
TF1 = 0;
TR1=0;
4.3 IO相关寄存器配置
P2M0=0xff;
P2M1=0x00;
P0M0=0xff;
P0M1=0x00;
P3M0|=0xA0;
P3M1|=0x80;
IR_OUT=0;
P2=0x00;
P0=0x00;

