您现在正在浏览:首页 > 职教文章 > 职教论文 > 红外遥控电风扇控制系统设计

红外遥控电风扇控制系统设计

日期: 2010/11/11 浏览: 0 来源: 学海网收集整理 作者: 佚名

红外遥控电风扇控制系统设计

概述

?? 遥控电风扇是 90年代初期在广东珠江三角洲地区作做大量的研发和生产,并有专门的掩模芯片作为主控芯片使用,现本人用单片机作了接收和发射的配套使用的系统方案。红外遥控电路现在已成为一种设计电路的时尚,现简单地介绍了红外线遥控发射、接收系统的原理,给出用 89C2051作为遥控接收系统解码器的一种巧妙实现方法,以及完整的51汇编程序代码。包括发射、接收的原理图及其编程的主程序、发送程序、接收程序、定时中断程序的流程过程,从而完成此设计的要点,参考流程方框图的构思过程,可以编写应用软件。遥控电风扇控制系统分为两大部分:遥控器和电风扇控制板,下面分别加以描述。

一、遥控器

? 为了能远离距的控制电风扇,采用了红外遥控器。通常红外遥控器由发射和接收两部分组成,发射部分由单片机 80C2051等构成。接收部分装在电风扇的控制器内,由89C51等构成。

1. 工作原理及组成部分

(1)CPU 采用AT89C2051单片机,AT89C2051的功能:

?? 和 MCS-8051产品兼容、2KB可重编程闪速存储器、耐久性:1000写/擦除周期、2.7V~6V的操作范围、全静态操作:0Hz~24MHz、两级加密程序存储器、128×8位内部RAM、15根可编程I/O引线、6个中断源、可编程串行UART通道、直接LED驱动输出、片内模拟比较器、低耗空载和掉电方式。

(2)电源采用4节7号电池来提供电源,并用一个二极管(IN4148)进行降压。

(3)调制部分:采用CD40106进行缓冲放大并整形.发送的数字信号与38K的载波进行相与,将其调制在一起,整形并缓冲放大,经过8050进行放大驱动红外发射管,使其发射红外光。

(4)红外发射方原理见图(1)所示。

?

(图 1 )遥控器原理框图

2.红外发射

(1)发射部分包括键盘矩阵、编码调制、红外发送器。使用89C2051芯片 将按键信号调制在 38KHz 的载波信号上通过三极管放大后发射出去。红外编码为: 全码 =引导码+系统码+系统反码+数据码+数据反码。89C2051 的 P1口构成矩阵式键盘,用T1产生定时中断,驱动P3.3产生一个38K的方波,作为红外线的调制基波。将发送的数据和P3.0进行逻辑与后,经过40106整形,用三极管驱动红外发射管发射。

(2)按键功能

K1:低档、中档、高档;键值为 01H

K2彩灯:键值为 02H

K3:自然风、睡眠风、正常风键;值为03H

K4定时;键值为04H

K5开/关机;键值为05H

(3)当无键按下时,延时10秒后进入待机状态,系统处于低功耗模式。当有按键按下时,INT0中断产生中断,同时唤醒CPU进行工作状态。

3.红外发射的编码方式

?? 遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本 NEC的uPD6121G组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

(1)采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。

“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管发射。

(2)遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制0FFH;后16位为8位操作码(功能码)及其反码。

(3)遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间。

(4)其相关的波形图如下:

(图 2)遥控编码

4.硬件设计

硬件设计见电路原理图(3)所示。

(图3)遥控器电路原理图

5.软件设计

(1)采用中断的处理程序完成整个系统的操作,INT0中断处理完成键盘扫描以及发送。

(2)程序流程图:

(图 4)遥控器软件流程图

二、 电风扇控制板

1.工作原理及组成部分: 红外接收部分包括光电转换放大器、解调、解码电路。

(1)CPU板将单片机、控制、键盘组合在一起完成了人机对话。 用 AT89C51单片机来作主芯片控制,采用红外T1838接收头,用双向可控硅MC97A6控制电机档位,具有红外遥控功能。

(2)电源部分:交流220V经变压器降压为2×8V,全波整流后再由三端稳压器LM7805稳压,供给控制板。

(3) 电风扇控制板框图

?

(图 5 )电风扇控制板框图

2.设计方案

(1)控制部分

(图 6)电机引线图

K1:低、中、高档,相应的指示灯亮。参见(图6)

K2:控制彩灯,相应的指示灯亮

K3:自然风、睡眠风、正常风控制 。参见(图8)、(图9)、(图10)

K4: 定时30分钟,1小时,2小时,4小时。相应的指示灯点亮。参见(图7)

K5:具有开机功能和关机功能

?

(图7)定时时循环图

(2)风类

自然风的处理流程 :

?

( 图 8) 自然风的循环图

睡眠风的处理流程 :

?

( 图 9) 自然风的循环图

正常风的处理流程 :

?

(图10)正常风循环

(3)工作方式:分为手动和遥控两种方式。

4.硬件设计:参见(图11)

(图 11)电风扇控制板电路原理图

5.软件设计:

(1)红外遥控输入在 P3.2(INT0),面板按键P3.3(INT1)。

(2) 遥控的解码过程:

(图12)编码

(图13)数据帧图形

?? 单片机收到一个中断后,开始计数,?然后在主程序有一个判断子程序,首先判断是否>8MS,是否有高电平,再判断是否>4MS的低电平,然后再判断是否是0或1,循环32次完成,32个码的接收和存储。

(3)程序流程图 :

?

(图14)控制板主程序流程

?

?

(图15)键值处理流程

?

?

?

;=============电风扇红外发射(遥控器)程序===================================== ;按键说明: ;K1:低风档,键值为 01 ;K2:中风档,键值为 02 ;K3:高风档,键值为 03 ;K4:彩灯档,键值为 04 ;K5:自然风档,键值为05 ;K6:睡眠风档,键值为06 ;K7:正常风档,键值为07 ;K8:定时档,键值为08 ;K9:开关机,键值为9 ;采用 4×1.5V 供电,用89C2051作CPU芯片,当没有按键按下时,进入待机状态 ;按键采用INT0进行中断,只采用了8个按键 ;============================================================================== $include(2051RAM.INC) ;$include(REG51.INC)

?ORG?0000H ?JMP?MAIN ?ORG?0003H???;INT0的中断入口 ?JMP?KEY_INT0 ?ORG?000BH???;T0的中断入口 ?JMP?FM_T0 ?ORG?0100H ;------------------------------------------------------------------------------ ;进入主程序 ;------------------------------------------------------------------------------ MAIN:?MOV?R0,#7FH??;预使用单元清0 ?CLR?A MAIN0: ?MOV?@R0,A ?DJNZ?R0,MAIN0??;清缓冲的地址单元值 ?MOV?SP,#60H ??? ?MOV?P1,#00001111B??;将P1置输入 ?CLR?KEYON??? ?CLR?IT0???;设置电平触发 ?SETB?PT0??? ?SETB?EX0 ?SETB?EA??? ?MOV?40H,#0FFH ?MOV?41H,#0FFH ?MOV?42H,#0FFH? ?CLR?DATAOUT????? ?CLR?FMOUT???;38K的中断初始值 ?MOV?TMOD,#02H??;T0的工作方式2 ?MOV?TH0,#0F7H??;送初值?? ?SETB?FMOUT??? ?CLR?TR0???;1/3的高电平标志 ?MOV?R2,#02H???;2/3的循环次数? ?DJNZ?40H,LOOP1 ?DJNZ?41H,LOOP1 ?DJNZ?42H,LOOP1 ?MOV?PCON,#01H??;进入待机 LOOP1:?JMP?MAIN ?? ;=============================================================? ;中断程序:完成其按键按下的标志位 ;============================================================= KEY_INT0: ?PUSH?ACC ?PUSH?PSW ?CLR?EX0 ?MOV?A,P1??? ?CPL?A??? ?ANL?A,#0FH ?MOV?R2,A???;将行号存入R2中 ?MOV?P1,#0F0H??;将列置输入端 ?MOV?A,P1??? ?CPL?A ?ANL?A,#0F0H???;取列号并存入A中 ?MOV?R1,#03H???;置列初号 ?MOV?R3,#03H???;置循环次数 ?CLR?C PINT01:?RLC?A???;取列号 ?JC?PINT01??? ?DEC?R1 ?DJNZ?R3,PINT01 ?? PINT02:?MOV?A,R2???;取行号 ?MOV?R2,#00H ?MOV?R3,#03H???;置循环次数 PINT03:?RRC?A??? ?JC?PINT04 ?INC?R2 ?DJNZ?R3,PINT03 PINT04:?MOV?A,R2 ?CLR?C??? ?RLC?A??? ?RLC?A ?ADD?A,R1 ?MOV?SENDBUF+2,A??;键号存于32H单元中 ?CPL?A ?MOV?SENDBUF+3,A??;存键号的反码 ?MOV?SENDBUF,#0FFH??;系统码在30H单元中 ?MOV?SENDBUF+1,#00H??;系统反码在31H单元中 ?LCALL?SEND ?SETB?ET0???;发送引导码 ?SETB?TR0???;启动T0 ?LCALL?PP???;发送一帧数据.包括系统码和数据码 ?CLR?TR0???;当发送完后关断定时器 ?CLR?ET0???;关T0的中断 ?SETB?EX0???;执行完后打开外INT0 ?MOV?40H,#0FFH ?MOV?41H,#0FFH ?MOV?42H,#0FFH ?POP?PSW ?POP?ACC ?RETI ;============================================================================= FM_T0:?JB?F0,IT01 ?DJNZ?R2,GRET ?MOV?R2,#2 IT01:?CPL?FMOUT ?CPL?F0 GRET:?RETI ;==============================================================================??? ;引导脉冲子程序 SEND:?SETB?DATAOUT ?LCALL?DY9000us ?CLR?DATAOUT ?LCALL?DY4500us ?RET? ;==============================================================================

;发送四个缓冲单元中的内容程序:

PP:?MOV?R3,#4??;发送的字节数 ?MOV?R1,SENDBUF? PP0:?MOV?R2,#08H??;让其循环8次 ?MOV?A,@R1??;将数据首址 ?CLR?C??;清CY PP1:?RRC?A??;右环移带进位 ?JC?ONE??;若C等1 ZER0:?SETB?DATAOUT??;若C等0 ?CALL?DY562us ?CLR?DATAOUT ?CALL?DY562us ?? ONE:?SETB?DATAOUT ?CALL?DY562us ?CLR?DATAOUT ?CALL?DY1687us ?DJNZ?R2,PP1 ?INC?R1 ?DJNZ?R3,PP0??;等四个字节的发送完 ?RET ;=========================================================================?? DY1687us: ?MOV?R31,#38 L2:???? PUSH?? ?R31 L3:??? ?DJNZ?? ?R31,L3 ??????? POP??? ?R31 ??????? DJNZ?? ?R31,L2 ??????? RET ;========================================================================?? DY562us:? ?MOV?R31,#20 L22:??? PUSH?? ?R31 L33:??? DJNZ?? ?R31,L33 ??????? POP??? ?R31 ??????? DJNZ?? ?R31,L22 ??????? RET?? ;========================================================================== ;延时9000us子程序: DY9000us:? ?MOV?R31,#91 L2A:??? PUSH?? ?R31 L3A:??? DJNZ?? ?R31,L3A ??????? POP??? ?R31 ??????? DJNZ?? ?R31,L2A ??????? RET? ;============================================================================== ;延时4500us子程序?? DY4500us:?? ?MOV?R31,#67 L2B:??? PUSH?? ?R31 L3B:??? DJNZ?? ?R31,L3B ??????? POP??? ?R31 ??????? DJNZ?? ?R31,L2B ??????? RET?? ;==============================================================================

DY10S:?MOV?R6,#10 L2C:?MOV?R4,#2 L3C:?MOV?R5,#248 ?DJNZ?R5,$ ?DJNZ?R4,L3C ?DJNZ?R6,L2C ?RET END? ??? ????

?

?

INC文件内容

?

;------------------------------------------------------------------------------- ; AT89C2051 内存RAM分配? Fiel = 2051ram.INC ;------------------------------------------------------------------------------- $SAVE $NOLIST

R31??DATA?1FH

KEYON??BIT?20H.0??;按键按下的标志

SENDBUF??DATA?30H??;定义发送系统码缓冲的地址

FMOUT??BIT?P3.3??;38K输出 DATAOUT??BIT?P3.0??;数据输出

$RESTORE

;========================电风扇红外接收(控制板)程序===========? ;用89C51单片机来作主芯片控制,采用红外1838接收头,可控硅采用MC97A6 ;风扇具有红外遥控功能 ;K1:低档,相应的指示灯亮 ,中档,相应的指示灯亮 , 高档,相应的指示灯亮???? ;K2:彩灯,相应的指示灯亮 ;K3:自然风控制?????? 睡眠风的控制?正常风的控制?????? ;K4:定时30分钟,1小时,2小时,4小时 ;K5:开关机功能 ;自然风的处理流程:停--->开低档--->延时6秒--->开中档--> ;延时6秒--->开高档--->循环 ;睡眠风的处理流程:停6S--->开低档10S--->停延时10S-->开中档10S--> ;停延时10S-->开高档10S--->循环 ;正常风的处理流程:开低档10S--> 开中档10S--> 开高档10S---> 循环

;========================================================== $INCLUDE(REG51.INC) $INCLUDE(89C51RAM.INC) ?ORG?0000H ?JMP?START ?ORG?0003H ?JMP?JISH_INT0?;红外遥控中断设置 ?ORG?000BH ?JMP?LP0??;定时中断 ?ORG?0013H ?JMP?KEY_INT1?;按键中断? ?ORG?0100H START:? ?MOV?R0,#7FH??;预使用单元清0 ?CLR?A MAIN0: ?MOV?@R0,A ?DJNZ?R0,MAIN0 ?? ?MOV?SP,#60H ?MOV?TMOD,#01H ?MOV?TH0,#3CH??;定时50MS ?MOV?TL0,#0B0H ? ?SETB?LLOW???;关低风 ?SETB?MDI???;关中风 ?SETB?HIGHT???;关高风 ?SETB?LLAP???;关彩灯 ?MOV?P0,#0FFH??;关所有的指示灯 ?? ?SETB?EX0 ?SETB?EX1 ?SETB?EA???;CPU开中 ??? MAIN:?JB?LKEYON,KEYHANDLE?;检按键标志位 ?JB?REC,KEYHANDLE??;检接收中断标志位

?JMP?MAIN???;转主程序 ? ;==============================================================================? ;键值的处理的程序 ;键盘处理程序 ;K1键:完成弱、中、强控制,相应的指示灯点亮 ;K2键:完成彩灯控制,相应的指示灯点亮 ;K3键:完成自然风、睡眠风、正常风的控制,相应的指示灯点亮 ;K4键:完成定时的控制,同时0.5H,1H,2H,4H,相应的指示灯点亮 ;K5键:开/关机 ;============================================================================== KEYHANDLE: ?CLR?LKEYON ?CLR?LREC ?MOV?A,MRD ???? ?CJNE?A,#01H,KEY2??;当键值=01H时,? ;------------------------------------------------------------------------------ ;低、中、高、的控制 ;------------------------------------------------------------------------------ KEY1:?JB?DANG01,DIFENG ?JB?DANG02,ZHONGFENG?;DANG02 中档标志位 ?JB?DANG03,QIANGFENG?;DANG03 强档标志位? ?JMP?MAIN ;------------------------------------------------------------------------------ ;低档控制? DIFENG:? ?JNB?DANG01,FAN0 ?SETB?LLOW???;完成了低档的程序,关低 ?SETB?MDI???;关中 ?SETB?HIGHT???;关高 ?CALL?DY20MS???;保证三个SCR全部为关断状态 ?CLR?LLOW???;开低风 ?CLR?LED_L???;开低档指示灯 ?CLR?DANG01 FAN0:?JMP?MAIN

;------------------------------------------------------------------------------ ;中档控制 ZHONGFENG:? ? ?JNB?DANG02,FAN0 ?SETB?LLOW???;关低 ?SETB?MDI???;关中 ?SETB?HIGHT???;关高 ?CALL?DY20MS???;保证三个SCR全部为关断状态 ?CLR?MDI ?CLR?LED_M ?CLR?DANG02 ? ?AJMP?MAIN???;跳转到 ;------------------------------------------------------------------------------ ;高档控制 QIANGFENG: ? ?JNB?DANG03,FAN0? ?SETB?LLOW???;关低 ?SETB?MDI???;关中 ?SETB?HIGHT???;关高 ?CALL?DY20MS???;保证三个SCR全部为关断状态 ?CLR?HIGHT ?CLR?LED_H ?CLR?DANG03 ?AJMP?MAIN???;跳转到 ;------------------------------------------------------------------------------ ;彩灯控制 ;------------------------------------------------------------------------------? KEY2:? ?CJNE?A,#02H,KEY3??;K4的处理程序彩灯的处理程序 ?JB?PLAP,LED1 ?CLR?LLAP???;第一次按时将彩灯打开, ?CLR?LED_LAP??? ?SETB?PLAP??? ?JMP?MAIN???;返回 LED1:?SETB?LLAP???;第二次按时将彩灯关断 ?SETB?LED_LAP ?CLR?PLAP? ?JMP?MAIN???;跳转到 ;------------------------------------------------------------------------------ ;风类处理过程 ;------------------------------------------------------------------------------? KEY3:? ?CJNE?A,#03H,KEY4_A??;K3的处理程序处理风类 ?JB?SMF,SKEEP ?JB?ZCF,SPRING_A ?JB?ZRF,WATERM ?JMP?MAIN ?KEY4_A:JMP?KEY4 ?SPRING_A: ??JMP?SPRING ;------------------------------------------------------------------------------ ;自然风控制??? WATERM:? ?JNB?ZRF,FAN1 ?CLR?ZRF ?SETB?LLOW???;处理自然风,关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN0??;查询 ?JB?LKEYON,ZHUAN0??;查询 ?CALL?DY6S ?CLR?LLOW ?JB?LREC,ZHUAN0??;查询 ?JB?LKEYON,ZHUAN0??;查询? ?CALL?DY6S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN0??;查询 ?JB?LKEYON,ZHUAN0??;查询 ?CALL?DY20MS ?CLR?MDI ?JB?LREC,ZHUAN0??;查询 ?JB?LKEYON,ZHUAN0??;查询 ?CALL?DY6S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN0??;查询 ?JB?LKEYON,ZHUAN0??;查询 ?CALL?DY20MS ?CLR?HIGHT ?CALL?DY6S ?AJMP?WATERM ZHUAN0:?SETB?SMF FAN1:?JMP?MAIN ?? ;------------------------------------------------------------------------------ ;睡眠风控制 SKEEP:? ? ?JNB?SMF,FAN2 ?CLR?SMF SLEEP1:?SETB?LLOW???;处理睡眠风,关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY6S ?CLR?LLOW???;开低档 ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ? ?CLR?MDI???;开中档 ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ?? ?CLR?HIGHT???;开高档 ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?JB?LREC,ZHUAN1??;查询 ?JB?LKEYON,ZHUAN1??;查询 ?CALL?DY10S ?AJMP?SKEEP ZHUAN1:?CLR?SMF ?SETB?ZCF FAN2:?JMP?MAIN?? ;------------------------------------------------------------------------------ ;正常风控制? ?? SPRING: ? ?JNB?ZCF,FAN3 ?CLR?ZCF SPRING1: ?SETB?LLOW???;处理正常风,关低'中'高 ?SETB?MDI ?SETB?HIGHT ?CALL?DY20MS ?CLR?LLOW???;开低档? ?JB?LREC,ZHUAN2??;查询 ?JB?LKEYON,ZHUAN2??;查询 ?CALL?DY10S ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?LCALL?DY20MS ?JB?LREC,ZHUAN2??;查询 ?JB?LKEYON,ZHUAN2??;查询 ?CLR?MDI???;开中档 ?CALL?DY10S ? ? ?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?LCALL?DY20MS ?JB?LREC,ZHUAN2??;查询 ?JB?LKEYON,ZHUAN2??;查询 ?CLR?HIGHT???;开高档 ?CALL?DY10S ?AJMP?SPRING ZHUAN2:?CLR?ZCF FAN3:?JMP?MAIN? ?? ;------------------------------------------------------------------------------ ;定时控制 ;------------------------------------------------------------------------------?? KEY4:? ?CJNE?A,#04H,KEY5?;K4的定时的处理程序 ?JB?SJ01,DY1H?? ?JB?SJ02,DY2H ?JB?SJ03,DY4H ?JNB?SJ00,FAN4 ?CLR?SJ00 ?SETB?TR0???;0 5H处理??? ?JMP?MAIN ? DY1H:? ?JNB?SJ01,FAN4 ?CLR?SJ01 ?SETB?TR0 ?JMP?MAIN ?? DY2H:? ?JNB?SJ02,FAN4 ?CLR?SJ02 ?SETB?TR0 ?JMP?MAIN ? DY4H:? ?JNB?SJ03,FAN4 ?CLR?SJ02 ?SETB?TR0 FAN4:?JMP?MAIN ;------------------------------------------------------------------------------ ;开关机 ;------------------------------------------------------------------------------? KEY5:? ?CJNE?A,#05H,POTHER??;开关机处理程序 ?JB?KAI,GUAN ?CLR?MDI??? ?CLR?LED_M??? ?SETB?KAI ?JMP?MAIN???;返 ? GUAN:?SETB?LLOW???;关低'中'高 ?SETB?MDI ?SETB?HIGHT ?CLR?KAI ?JMP?MAIN POTHER: ?JMP?MAIN???;其他键的不处理直接返回? ;============================================================================== ;T0定时中断处理 ;==============================================================================?? LP0: ?PUSH?ACC???;中断处理 ?PUSH?PSW ?MOV?TH0,#3CH??;定时50MS ?MOV?TL0,#0B0H ?DJNZ?CUZHI,GRET??;1S到后向下执行 ?MOV?CUZHI,#20???;给50MS的寄存器给初值 ?INC?SEN??? ?MOV?A,SEN ?CJNE?A,#60,GRET??;1分钟到后向下执行 ?INC?MIN ?MOV?A,MIN ? ?JB?SJ01,LOOP_1H??;定时1小时的处理 ?JB?SJ02,LOOP_2H??;定时2小时的处理 ?JB?SJ03,LOOP_4H??;定时4小时的处理 ?CJNE?A,#30,GRET??;半小时到后向下执行?? ?MOV?P1,#0FFH??;关断所有档位 ?MOV?P0,#0FFH ?SETB?SJ01???;将1H的标志位进行置 1 ?JMP?GRET LOOP_1H: ?CJNE?A,#60,GRET??;1小时到后向下执行 ?MOV?P1,#0FFH ?MOV?P0,#0FFH ?CLR?SJ01???;将1H的标志位进行置 0 ?SETB?SJ02???;将2H的标志位进行置 1 ?JMP?GRET LOOP_2H: ?CJNE?A,#60,GRET??;1小时到后向下执行 ?INC?HOUR ?MOV?A,HOUR ?CJNE?A,#2,GRET?? ?MOV?P1,#0FFH??;关断 ?MOV?P0,#0FFH ?CLR?SJ02???;关断2H的标志位 ?SETB?SJ03???;将4H的标志位进行置位 ?JMP?GRET???;中断返回 LOOP_4H: ?CJNE?A,#60,GRET??;1小时到后向下执行 ?INC?HOUR ?MOV?A,HOUR ?CJNE?A,#4,GRET??;4小时到后向下执行 ?MOV?P1,#0FFH??;关断 ?MOV?P0,#0FFH ?CLR?SJ03???;将4H的标志位进行清零 ?JMP?GRET???;中断返回 GRET:? ?CLR?TR0 ?POP?PSW ?POP?ACC ?RETI

;==============================================================================? ;INT0中断处理程序:对接收数据进行接收??? ;============================================================================== JISH_INT0: ?PUSH?ACC ?PUSH?PSW ?CLR?EX0???;关断中断? ?MOV?R6,#10???;避开9MS时间的引导码 SB:?CALL?DY882US ?JB?P3.2,EXIT??;,EX检测为1时退出 ?DJNZ?R6,SB???;检测为0时,引导码过 ?JNB?P3.2,$;???;检测为0时,等待 ?ACALL?DY4700US??;避开4。5MS时间的引导码 ?MOV?R7,#16???;避开系统码 JJJJA:?JNB?P3.2,$ ?LCALL?DY882US ?MOV?C,P3.2???;将P3.2送C中 ?JNC?UUUA???;若C=0则转 ?LCALL?DY1000US UUUA:?DJNZ?R7,JJJJA ?MOV?R1,#MRD ?MOV?R2,#2 PP:?MOV?R3,#8???;右移的次数 JJJJ:?JNB?P3.2,$???;=0则等 ?LCALL?DY882US ?MOV?C,P3.2???;送C中 ?JNC?UUU ?LCALL?DY1000US UUU:?MOV?A,@R1???;送存贮的首址 ?RRC?A ?MOV?@R1,A???;送存贮单元中 ?DJNZ?R3,JJJJ???;完成一个字节,没完则 ?INC?R1 ?DJNZ?R2,PP ?MOV?A,MRD ?CPL?A ?CJNE?A,31H,EXIT??;进行数据码和数据的反码进行比较 EXIT:?POP?PSW ?POP?ACC ?SETB?LREC???;置REC的标志位 ?SETB?EX0???;打开INT0的中断 ?RETI ??? ;============================================================================== ;INT1的中断处理 ;============================================================================== KEY_INT1: ?PUSH?ACC ?PUSH?PSW ?CLR?EX1???;关断INT1 ?LCALL?SCANKEY ?CALL?KEY_K10???;置高、中、低的标志位 ?CALL?FENG_3???;置风类的标志位 ?CALL?JS???;置定时时间标志位 ?SETB?LKEYON???;按键标志位 ?SETB?EX1???;打开中断位 ?POP?PSW ?POP?ACC ?RETI ;------------------------------------------------------------------------------ ;定时的置位标志程序 ;------------------------------------------------------------------------------? JS: ?CLR?SJ00 ?CLR?SJ01 ?CLR?SJ02 ?CLR?SJ03 ?? ?MOV?A,MRD ?CJNE?A,#04H,KEY_K4D??; ?INC?TIME ?MOV?A,TIME ?CJNE?A,#5,KEY_K4 ?MOV?TIME,#1 KEY_K4: ?MOV?A,TIME ?CJNE?A,#1,KEY_K4A??;等1则置ZRF ?SETB?SJ00 ?JMP?KEY_K4D

KEY_K4A:? ?CJNE?A,#2,KEY_K4B??;等2则置SMF ?SETB?SJ01 ?JMP?KEY_K4D KEY_K4B: ?CJNE?A,#3,KEY_K4C??;等3则置ZCF ?SETB?SJ02 ?JMP?KEY_K4D KEY_K4C: ?CJNE?A,#4,KEY_K4D??;等3则置ZCF ?SETB?SJ03 ?JMP?KEY_K4D KEY_K4D: ?RET ;------------------------------------------------------------------------------ ;高中低档的置标志位子程序 ;------------------------------------------------------------------------------ KEY_K10: ?CLR?DANG01 ?CLR?DANG02 ?CLR?DANG03 ?? ?MOV?A,MRD ?CJNE?A,#01H,KEY_K1C??; ?INC?FENG ?MOV?A,FENG ?CJNE?A,#4,KEY_K1 ?MOV?FENG,#1 KEY_K1: ?MOV?A,FENG ?CJNE?A,#1,KEY_K1A ?SETB?DANG01 ?JMP?KEY_K1C KEY_K1A:? ?CJNE?A,#2,KEY_K1B ?SETB?DANG02 ?JMP?KEY_K1C

KEY_K1B: ?CJNE?A,#3,KEY_K1C ?SETB?DANG03 ?JMP?KEY_K1C KEY_K1C: ?RET ;------------------------------------------------------------------------------ ;自然风、睡眠风、正常风的置标志位子程序 ;------------------------------------------------------------------------------ FENG_3: ?CLR?ZRF ?CLR?SMF ?CLR?ZCF ?? ?MOV?A,MRD ?CJNE?A,#03H,KEY_K3C??; ?INC?FLEI ?MOV?A,FLEI ?CJNE?A,#4,KEY_K3 ?MOV?FLEI,#1 KEY_K3: ?MOV?A,FLEI ?CJNE?A,#1,KEY_K3A??;等1则置ZRF ?SETB?ZRF ?JMP?KEY_K3C KEY_K3A:? ?CJNE?A,#2,KEY_K3B??;等2则置SMF ?SETB?SMF ?JMP?KEY_K3C KEY_K3B: ?CJNE?A,#3,KEY_K3C??;等3则置ZCF ?SETB?ZCF ?JMP?KEY_K3C KEY_K3C: ?RET ;============================================================================== ;扫描键盘程序。 ;==============================================================================? SCANKEY: ?MOV?A,P1??? ?CPL?A??? ?ANL?A,#0FH ?MOV?R2,A???;将行号存入R2中 ?MOV?P1,#0F0H??;将列置输入端 ?MOV?A,P1??? ?CPL?A ?ANL?A,#0F0H???;取列号并存入A中 ?MOV?R1,#03H???;置列初号 ?MOV?R3,#03H???;置循环次数 ?CLR?C PINT01:?RLC?A???;取列号 ?JC?PINT01??? ?DEC?R1 ?DJNZ?R3,PINT01 ?? PINT02:?MOV?A,R2???;取行号 ?MOV?R2,#00H ?MOV?R3,#03H???;置循环次数 PINT03:?RRC?A??? ?JC?PINT04 ?INC?R2 ?DJNZ?R3,PINT03 PINT04:?MOV?A,R2 ?CLR?C??? ?RLC?A??? ?RLC?A ?ADD?A,R1 ?MOV?MRD,A???;键号存于MRD单元中? ?RET ;==============================================================================????? DY20MS: ??MOV?53H,#8AH?????? DELAY_0: ?PUSH??? 53H DELAY_1: ?DJNZ??? 53H,DELAY_1 ??????? POP???? 53H ??????? DJNZ??? 53H,DELAY_0 ??????? RET?????? ;==============================================================================?? DY6S:? ?MOV?R7,#12H DEYLAY_00: ?MOV?53H,#0DDH?????? DELAY_11: ?PUSH??? 53H DELAY_22: ?DJNZ??? 53H,DELAY_22 ??????? POP???? 53H ??????? DJNZ??? 53H,DELAY_11 ??????? DJNZ?R7,DEYLAY_00 ??????? RET?????? ;==============================================================================??????? DY8S:?MOV?R7,#16 ? DEYLAY_33: ?MOV?53H,#0DDH?????? DELAY_44: ?PUSH??? 53H DELAY_55: ?DJNZ??? 53H,DELAY_55 ??????? POP???? 53H ??????? DJNZ??? 53H,DELAY_44 ??????? DJNZ?R7,DEYLAY_33 ??????? RET???? ;==============================================================================?? DY10S:?MOV?R7,#20 ?MOV?R7,#12H DEYLAY_66: ?MOV?53H,#0DDH?????? DELAY_77: ?PUSH??? 53H DELAY_88: ?DJNZ??? 53H,DELAY_88 ??????? POP???? 53H ??????? DJNZ??? 53H,DELAY_77 ??????? DJNZ?R7,DEYLAY_66 ?????? ?RET???? ;==============================================================================?

DY882US:MOV?R4,#20 D1:?MOV?R5,#20 ?DJNZ?R5,$ ?DJNZ?R4,D1 ?RET DY1000US: ?MOV?R4,#2 D3:?MOV?R5,#248 ?DJNZ?R5,$ ?DJNZ?R4,D3 ?RET DY4700US: YS2:?MOV?R4,#10 D2:?MOV?R5,#235 ?DJNZ?R5,$ ?DJNZ?R4,D2 ?RET

END

89C51RAM? INC文件内容

?

;------------------------------------------------------------------------------- ;89C51的RAM分配

;------------------------------------------------------------------------------- $SAVE $NOLIST ?KEYON?BIT?05H??;按键中断位 ?REC?BIT?06H??;遥控中断位 ?LLOW?BIT?P2.0??;低风控制位 ?MDI?BIT?P2.1??;中风控制位 ?HIGHT?BIT?P2.2??;高风控制位 ?LLAP?BIT?P2.3 ? ?LED_L?BIT?P0.0??;低档指示控制 ?LED_M?BIT?P0.1??;中档指示控制 ?LED_H?BIT?P0.2??;高档指示控制 ?LED_LAP?BIT?P0.3??;彩灯指示控制 ?LEDHALF?BIT?P0.4??;半小指示控制 ?LEDOH?BIT?P0.5??;1小时指示控制 ?LEDTH?BIT?P0.6??;2小时指示控制 ?LEDFH?BIT?P0.7??;4小时指示控制 ? ?SJ00?BIT?20H.0??;半小时控制标志? ?SJ01?BIT?20H.1??;1小时控制标志 ?SJ02?BIT?20H.2??;2小时控制标志 ?SJ03?BIT?20H.3??;4小时控制标志 ?DANG01?BIT?20H.4??;弱风档标志位 ?DANG02?BIT?20H.5??;中风档标志位 ?DANG03?BIT?20H.6??;强风档标志位 ? ?ZRF?BIT?21H.0??;自然风的标志位 ?SMF?BIT?21H.1??;睡眠风的标志位 ?ZCF?BIT?21H.2??;正常风的标志位 ? ?LKEYON?BIT?22H.0??;按键中断标志 ?LREC?BIT?22H.1??;接收中断标志 ?KAI?BIT?22H.2??;开关机标志 ?PLAP?BIT?22H.3??;彩灯控制标志 ? ? ?MRD?DATA?30H??;数据码寄存器 ? ?SEN?DATA?40H??;秒寄存器 ?MIN?DATA?41H??;分钟寄存器 ?HOUR?DATA?42H??;小时寄存器 ?CUZHI?DATA?43H??;50MS的初值寄存器 ?FENG?DATA?50H??;高中低的循环次数寄存器 ?FLEI?DATA?51H??;风类的循环次数寄存器 ?TIME?DATA?52H??;时间的循环次数寄存器 ??;DATA?53H??;延时的寄存器?

$RESTORE

REG51 INC 文件内容

?

?

;------------------------------------------------------------------------------- ; Copyright 1995-1996 KEIL Software, Inc. ; 8051 Processor Declarations ;------------------------------------------------------------------------------- $SAVE $NOLIST ; ; BYTE Register P0????? DATA??? 80H P1????? DATA??? 90H P2????? DATA??? 0A0H P3????? DATA??? 0B0H PSW???? DATA??? 0D0H ACC???? DATA??? 0E0H B?????? DATA??? 0F0H SP????? DATA??? 81H DPL???? DATA??? 82H DPH???? DATA??? 83H PCON??? DATA??? 87H TCON??? DATA??? 88H TMOD??? DATA??? 89H TL0???? DATA??? 8AH TL1???? DATA??? 8BH TH0???? DATA??? 8CH TH1???? DATA??? 8DH IE????? DATA??? 0A8H IP????? DATA??? 0B8H SCON??? DATA??? 98H SBUF??? DATA??? 99H

; BIT Register ; PSW CY????? BIT???? 0D7H AC????? BIT???? 0D6H F0????? BIT???? 0D5H RS1???? BIT???? 0D4H RS0???? BIT???? 0D3H OV????? BIT???? 0D2H P?????? BIT???? 0D0H ; TCON TF1???? BIT???? 8FH TR1???? BIT???? 8EH TF0???? BIT???? 8DH TR0???? BIT???? 8CH IE1???? BIT???? 8BH IT1???? BIT???? 8AH IE0???? BIT???? 89H IT0???? BIT???? 88H ; IE EA????? BIT???? 0AFH ES????? BIT???? 0ACH ET1???? BIT???? 0ABH EX1???? BIT???? 0AAH ET0???? BIT???? 0A9H EX0???? BIT???? 0A8H ; IP PS????? BIT???? 0BCH PT1???? BIT???? 0BBH PX1???? BIT???? 0BAH PT0???? BIT???? 0B9H PX0???? BIT???? 0B8H ; P3 RD????? BIT???? 0B7H WR????? BIT???? 0B6H T1????? BIT???? 0B5H T0????? BIT???? 0B4H INT1??? BIT???? 0B3H INT0??? BIT???? 0B2H TXD???? BIT???? 0B1H RXD???? BIT???? 0B0H ; SCON SM0???? BIT???? 9FH SM1???? BIT???? 9EH SM2???? BIT???? 9DH REN???? BIT???? 9CH TB8???? BIT???? 9BH RB8???? BIT???? 9AH TI????? BIT???? 99H RI????? BIT???? 98H $RESTORE


红外遥控电风扇控制系统设计.doc

返回顶部