学习型红外遥控器汇编语言程序
;************红外线接收程序******************
;*********************************************
;器件地址
EEPROM EQU 0A0H
;MODE EQU 070H ;高四位0111,是红外线设备型号
;低四位 ,是红外线设备的地址
;R2,R3 是延时计数器
;R4 :脉冲电平宽度计时器,算法,计数26次(也就是26US)R4加1
;R5 :脉冲个数计数器
;内存数据定义
SP_STATR EQU 01H
SP_END EQU 00H
ACK BIT 08H ;接收数据非应答标志
BITCNT DATA 15H ;IIC数据计数器 ;SADDP:类型+地址
BYTECNT DATA 16H ;IIC数据字节计数器 ;SCISTEP:串行通信进程
SLVADR DATA 14H ;被控器地址,EEPROM的地址 ;SCILEN:后4位数据长度(几个字节)
SUBADR DATA 17H ;被控器单元地址 ;SCICOM:前4位是命令
RCVDAT DATA 18H ;接收数据缓冲区 ;CRC :校验寄存器
XMTDAT DATA 19H ;发送数据缓冲区 ;SCODE :校验寄存器
CYCLE DATA 22H ;循环计数器 ;RBUFSP:接收缓冲区指针
DAT DATA 21H ;脉冲个数计数器 ;SCISP :发送数据缓冲区指针
STU DATA 20H ;学习过的置0,没有学习过的置1
ER DATA 13H ;出错标志位,为0则出错,为1则是正确
MODE DATA 09H ;高四位0111,是红外线设备型号
;低四位 ,是红外线设备的地址
;端口位定义
IN BIT P1.4; P0.0 ;红外线接收位
BZ BIT P0.5 ;蜂鸣器输出位
OUT BIT P1.7 ;红外线发射位
WP BIT P0.0;P1.4 ;写保护,为0时可读写,为1时不能写
SDA BIT P1.3 ;模拟IIC数据传送位
SCL BIT P1.2 ;模拟IIC时钟控制状态标志
LED BIT P0.7 ;
RECE BIT P0.6 ;串口接收发送位
ORG 0000H
AJMP MAIN
ORG 000BH ;定时器TO0中断入口地址
AJMP LOPP
ORG 0023H
AJMP SINT ;串口中断入口地址
ORG 063H
;***************主程序******************************
MAIN:
MOV STU,#00H
MOV SP,#0AH
MOV P0M2,#080h
CLR LED
MOV DAT,#00H ;脉冲个数计数器清0
MOV TMOD,#022H ;设置定时器0和1为方式2,定时控制方式,以运行控制位TR0,TR1启动定时器
MOV TH0,#00H ;加载计数初值
MOV TL0,#00H ;保存计术数值,计时
MOV TH1,#0FAH
MOV TL1,#0FAH ;波特率为4800
MOV SADEN,#0FFH
MOV SCON,#0F0H ;串口工作方式3,多机通信控制,允许接收
MOV TCON,#040H ;启动T1定时
MOV PCON,#00H ;波特率加倍
MOV IEN0,#092H ;允许定时T0中断,
;中断总充许
;允许串行中断
MOV WDCON,#017H
; MOV MODE,#70H ;高四位0111,是红外线设备型号
;低四位 ,是红外线设备的地址
LCALL GETADDR ;调用,检查地址子程式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV PT0AD,#010H ;禁止CIN1A(P0.4) 的数字输入功能
ANL P0M2,#0EFH ;CIN1A(P0.4)仅为输入功能
ORL P0M1,#010H
MOV CMP1,#028H ;正向输入为CIN1A
;选择内部1.23V作为参考电压
;比较结果输出到中断
; SETB EC1 ;打开中比较器1中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETB WP ;禁止写EEPROM
SETB TR1 ;启动串行中断,启动TR1定时
MOV ER,#00H
;;;;;;;;;@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;
LCALL LOP
AJMP MAIN
;;;;;;;;;@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;;
AFFL:
JBC B.7,AFFL1 ;中断返回时,接受命令正确,则调用命令处理程式
MOV WDRST,#01EH
MOV WDRST,#0E1H
AJMP AFFL ;等待中断
;********************命令处理************************************************
;主机命令: 第1个字节(前4位是设备娄型,后4位是设备地址)
; 第2个字节(前4位是命令,后4位是数据字节数)
; 第3~N个字节(EEPROM的地址)
; 最后一位是CRC
;接收前四位命令: 0111 7 是查询设备状态
; 0101 5 是学习红外线指令命令
; 0110 6 是发送红外线指令命令
;从机应答:
;发射前4位命令: 0111 7 命令已接受
; 0101 5 红外码学习正确
; 0000 红外码学习错或超时
;接收后四位数据长度为1个字节0001
;数据字节:为学习或发送的按键值(就是EEPROM 的地址)
;设备娄型,地址是01000000
AFFL1:
CLR LED
CLR ES ;串行中断关闭
CLR TR1
MOV R5, SUBADR
;********************判断红外线码学习还是发射**********************************
;取得EEPROM的高低字节地址
MOV A,22H ;把数据中的按键值入A
CJNE A,#04H,ORDER1 ;判断是错误码,还是正常按键值
AJMP TTMM ;命令=4,则转发送红外码子程序
ORDER1:
JNC TTM3 ;命令大于4,则置错误标志返回等待中断
JC TTMM ;命令小于4, 则顺继执行
TTMM:
MOV B,#60H ;把96放入乘数B中
MUL AB ;把接收到的键码乘以96,取得学习码EEPROM
;的按键地址
MOV SUBADR,A ;把乘积的低字节入EEPROM的低字节地址
MOV A,B ;把B 存A中
RL A ;把乘积的高字节左移一位
MOV SLVADR,#EEPROM
MOV B,SLVADR
ADD A,B ;把乘积的高字节与EEPROM的芯片地址相加
MOV SLVADR,A ;后放入高字节
CLR F0 ;清出错标志
MOV A,R5 ;命令前四位入A
CJNE A,#05H,ORDER ;是学习红外码和发射码吗?不是置错误标记
AJMP TTM1 ;
ORDER:
CJNE A,#06H,TTM3 ;是学习红外码吗?
TTMM1:
LCALL LOP ;SUBADR=0则调用学习红外码子程序
AJMP TTM2
TTM1:
LCALL LDD ;调用红外线发射子程式
TTM2:
JB F0,TTM3 ;调用子程序出错,置错误标记
SETB ES ;打开串行中断
SETB TR1
MOV ER,#05H ;调用子程式正确,则置正确标记
AJMP AFFL ;返回等待中断
TTM3:
MOV ER,#00H
SETB ES ;串行中断打开
SETB TR1
CLR LED
AJMP AFFL ;出错返回等待中断
;***********************************************************************
; 红外线接收存EEPROM程序
;***********************************************************************
由于程序太大,帖子无法全部贴出 请点这里下载程序的完整版本: http://www.51hei.com/ziliao/file/STC89C52学习型遥控器.rar
尘埃粒子计数器相关文章:尘埃粒子计数器原理 蜂鸣器相关文章:蜂鸣器原理
评论