【红外学习 1】STC89C54RD+ 红外学习、解码、发送 掉电记忆 C程序源码

本文介绍了基于STC89C54RD+的红外遥控学习和解码系统,使用LCD1602显示遥控器的NEC编码,并能保存学习的编码以便发送。硬件包括红外1838接收器和矩阵键盘,功能包括学习遥控器编码、显示编码及发送学习的编码。涉及关键文件如STARTUP.A51、IR-stc89C54.c等。
摘要由CSDN通过智能技术生成

青绿色为遥控器发射端波形,
黄颜色为一体化接收端波形,

 

静态时:

 

发送一个电平,接收一个电平

 

发送一个编码,接收一个按键的编码

 

波形参考

 

DIY硬件平台:
STC89C54RD+
LCD1602
红外1838接收
红外发送管
矩阵键盘
功能:
学习遥控器的编码
显示遥控器的NEC编码
发送学习到的编码

 

STARTUP.A51

STARTUP.A51
 
 
$NOMOD51
;------------------------------------------------------------------------------
;  This file is part of the C51 Compiler package
;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
;  Version 8.01
;
;  *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
;  STARTUP.A51:  This code is executed after processor reset.
;
;  To translate this file use A51 with the following invocation:
;
;     A51 STARTUP.A51
;
;  To link the modified STARTUP.OBJ file to your application use the following
;  Lx51 invocation:
;
;     Lx51 your object file list, STARTUP.OBJ  controls
;
;------------------------------------------------------------------------------
;
;  User-defined <h> Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
;     <i> Note: The absolute start-address of IDATA memory is always 0
;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN        EQU     80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
;     <i> The absolute start address of XDATA memory
XDATASTART      EQU     0     
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
;     <i> The length of XDATA memory in bytes.
XDATALEN        EQU     0      
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
;     <i> The absolute start address of PDATA memory
PDATASTART      EQU     0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
;     <i> The length of PDATA memory in bytes.
PDATALEN        EQU     0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
;  The following EQU statements define the stack pointer for reentrant
;  functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
;  <q> IBPSTACK: Enable SMALL model reentrant stack
;     <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
;     <i> Set the top of the stack to the highest location.
IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.      
;  <q> XBPSTACK: Enable LARGE model reentrant stack
;     <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.    
;  <q> PBPSTACK: Enable COMPACT model reentrant stack
;     <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
;
;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
; </h>
;</h>
;------------------------------------------------------------------------------
;
;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
;  <e>Compact Model Page Definition
;
;  <i>Define the XDATA page used for PDATA variables. 
;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF> 
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE           EQU     0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR       DATA    0A0H
;
; </e>
;------------------------------------------------------------------------------
 
; Standard SFR Symbols 
ACC     DATA    0E0H
B       DATA    0F0H
SP      DATA    81H
DPL     DATA    82H
DPH     DATA    83H
 
                NAME    ?C_STARTUP
 
 
?C_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATA
 
                RSEG    ?STACK
                DS      1
 
                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP
 
                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1
 
                RSEG    ?C_C51STARTUP
 
STARTUP1:
 
IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF
 
IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF
 
IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF
 
IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF
 
IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
 
                MOV     ?C_IBP,#LOW IBPSTACKTOP
ENDIF
 
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
 
                MOV     ?C_XBP,#HIGH XBPSTACKTOP
                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
 
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
                MOV     ?C_PBP,#LOW PBPSTACKTOP
ENDIF
 
                MOV     SP,#?STACK-1
 
; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0   
;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
                CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
#endif
;</h>
                LJMP    ?C_START
 
                END

 

 

IR-stc89C54.c

IR-stc89C54.c
 
 
/*************************************************************************
*工程名称:红外发射-解码-遥控学习一体模块                                *
*单片机型号:STC89C54RD+                                                 *
*晶振频率:12MHz                                                          *
*内部EEPROM有90个扇区,每个扇区512个字节,本程序只用12个扇区,           *
*解码格式为:NEC红外编码  红外解码最好有个1S的解码间隔                   *
*其他未能解码的红外编码脉冲均被完整复制,可以直接学习并控制相应设备       *
*最大存储红外编码位数:120位(含一位起始脉冲)                            *
*作者:新兴光电                                                          *
*日期:2015-1-6                                                          *
*************************************************************************/
 
//#include <reg52.h>      //下面已经有一个STC的头文件了,51的就不用加上了 
#include "STC89C5xRC.H"
#include <intrins.h> 
#include "LCD1602.h"
#include "EEPROM.h"     
 
#define uchar unsigned char
#define uint unsigned int
 
//sfr T2CON  = 0xC8;          //定时器2控制寄存器 
//sfr RCAP2L = 0xCA;         //定时器/计数器2重装/捕获低位
//sfr RCAP2H = 0xCB;         //定时器/计数器2重装/捕获高位
//sfr TL2    = 0xCC;
//sfr TH2    = 0xCD;
//单片机端口定义 
#define KEY_OUT P1      //4*3键盘信号输出端 
sbit KEY_send=P2^0;     //遥控功能按键 
sbit KEY_code=P2^1;    //遥控解码功能按键 
sbit KEY_study=P2^2;    //遥控学习功能按键 
sbit BEEP = P2^3;         //蜂鸣器驱动接口 
sbit IR_T=P2^4;         //红外线数据发送口 
sbit IR_R=P3^3;         //红外线数据接收口 
//以下为键盘扫描用到的寄存器 
uchar KEY_H_scan,KEY_V_check,KEY_value;  //KEY_H_scan为行扫描信号,KEY_V_check为列检测,KEY_value为最终键值
uchar KEY_temp
本系统采用STC公司的89C58RD单片机为控制中心。 实现功能有: 实时显示时间和日历 实时显示温度和湿度 可以对房间温度和湿度进行自动控制 具有声光防盗报警功能 无线控制功能 红外人体感应功能 低功耗模式(防盗模式)与正常模式任意切换 开机图片,程序在线下载等 测量水的温度 EEPROM数据保存 材料清单: STC89C58RD 单片机 DS1302 时钟芯片 DHT11 温湿度传感器 DS18B20 高精度温度传感 HC-SR501 红外人体感应模块 LCD12864 液晶显示模块 4路无线遥控 无线控制 其他 继电器,LED灯,STC下载器,9015,9013,10k电阻,4.7k电阻,有源蜂鸣器,微动按键,11.0592MHz和32.768KHz晶振 ,30pf瓷片电容,10uf电解电容,纽扣电池等等,一些元器件组成。 功能的实现 1.DHT11芯片采集温湿度数据传输给单片机进行处理然后后显示在LCD12864液晶屏上,并可以通过设置温湿度上下阀值(可以通过按键调节)来控制房间内的温湿度(通过继电器来进行控制)。 2.DS1302产生时钟数据传输给单片机进行处理然后显示在液晶屏上面,时间可以通过按键进行调节。 这个作品中一共有3个主要部分,一个是最下面的主控板,上面有STC89C54RD+,DS1302,继电器,蜂鸣器,DS18B20等等。第二个是中间的传感器板,上面有DHT11,HC-SR501 ,遥控接收器等等。第三个就是显示部分的LCD12864了~~ 电路图和程序几点说明: 1.电路图进行了多次改进(标号是多少就是表明是第几次改进了),但是可能和我硬件还是有不同的地方,不过应该是没有错误的,还有其实用protues是不能正常仿真出实物效果来, 因为protues里面的LCD12864是不带字库的,还有些原器件protues里面没有,当时又不想自己画,所以直接找某些差不多的原件进行代替了~~ 2.程序也进行了多次改进(最后标号是多少,就是表明是第几次改进了),因为那时候刚把51学的差不多了,所以所有的程序是自己一行一行敲出来的,包括所有的驱动程序程序里面进行的非常详细的注释,在每一个驱动程序的开始也对该驱动程序进行了详细的介绍~~所以非常适合新手学习,而且里面也用到了多个不同的芯片,那些芯片驱动程序的注释比较详细,而且也可以直接拿到其他项目上去用的~~~ 主控板正面 传感器 传感器板正面 系统方案 整体流程图 附件内容包含: 智能家居系统电路图和程序 智能家居系统设计报告 所有的芯片资料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值