历史上的今天
今天是:2025年01月06日(星期一)
2018年01月06日 | LPC900系列单片机UART和CCU模块实现红外通信程序
2018-01-06 来源:eefocus
LPC900系列单片机UART和CCU模块实现红外通信程序
$INCLUDE (REG932.INC)
;变量定义
BEEP BIT P2.7
KEY1 BIT P0.1
FE BIT SCON.7
PLEEN BIT TCR20.7
RCV_BUF DATA 30H ;接收缓冲区首地址(30H~3FH)
BRGR1_DATA DATA 09H ;波特率设为2400bit/s
BRGR0_DATA DATA 0B4H
ORG 0000H
AJMP MAIN
;主程序开始
ORG 0100H
MAIN:
MOV SP,#60H
MOV P0M1,#00H ;P0,P1口设置为准双向
MOV P0M2,#00H
MOV P1M1,#00H
MOV P1M2,#00H
MOV P2M1,#0C0H ;P2.6,P2.7设置为开漏
MOV P2M2,#0C0H
ACALL CCU_INIT ;CCU模块初始化,用以产生38KHz调制信号
ACALL UART_INIT
MAIN_L1:
JB KEY1,$
ACALL SEND_DATA ;发送16字节数据
MOV R7,#01H
ACALL DELAY
ACALL RCV_DATA ;接收16字节数据
ACALL COMPARE ;比较接收到的数据和发送的数据
JZ MAIN_L2
CLR BEEP ;如果正确则蜂鸣器短响一声
MOV R7,#01H
ACALL DELAY
SETB BEEP
AJMP MAIN_L1
MAIN_L2:
CLR BEEP ;如果错误则蜂鸣器长响一声
MOV R7,#05H
ACALL DELAY
SETB BEEP
AJMP MAIN_L1
;********************************************
; 名称: SEND_DATA
; 功能: 通过UART连续发送16字节数据(0~15)
; 入口参数:无
; 出口参数:无
; 注意: 此程序采用查询方式发送。
;********************************************
SEND_DATA:
MOV R7,#10H
CLR TI
CLR A
SEND_DL1:
MOV SBUF,A
JNB TI,$ ;等待一字节发送完毕
CLR TI
INC A
DJNZ R7,SEND_DL1
RET
;********************************************************************
; 名称: RCV_DATA
; 功能: 通过UART连续接收16字节数据
; 入口参数: RCV_BUF--用于接收数据的缓冲区首地址
; 出口参数: 接收到的16字节数据位于接收缓冲区
; 注意: 此程序采用查询方式进行接收。由于采取半双工通信,所以接收
; 数据之前要打开接收允许,接收完毕之后要关闭接收允许。
;********************************************************************
RCV_DATA:
MOV R7,#10H
MOV R0,#RCV_BUF
SETB REN ;串行接收允许
CLR FE
CLR RI
RCV_DL1:
JNB RI,$ ;等待接收一字节
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R7,RCV_DL1
CLR REN ;串行接收禁止
RET
;*********************************************
; 名称: COMPARE
; 功能: 比较缓冲区中的内容是否为0~15
; 入口参数: RCV_BUF--需要比较的缓冲区首地址
; 出口参数: ACC--比较正确则返回1,否则返回0。
;*********************************************
COMPARE:
MOV R7,#10H
MOV R0,#RCV_BUF
MOV R1,#00H
CLR A
COMP_L1:
MOV A,@R0
CJNE A,01H,COMP_RTN ;ACC与R1(01H)比较
INC R0
INC R1
DJNZ R7,COMP_L1
MOV A,#01H ;比较结果正确,返回01H
RET
COMP_RTN:
CLR A ;比较结果错误,返回00H
RET
;**********************************************************************
; 名称: CCU_INIT
; 功能: CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
; 作为红外线的载波
; 使用6MHz晶振时,CCU频率=((6000000/2)/6)*32=16MHz
; 定时器重装值=CCU频率/红外线载频=16000000/38000=421=01A5H
;**********************************************************************
CCU_INIT:
MOV TOR2H,#01H ;定时器重装值
MOV TOR2L,#0A5H
MOV OCRAH,#00H ;(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
MOV OCRAL,#0D2H
MOV TCR21,#85H ;PLL预分频为5+1
MOV CCCRA,#01H ;非反相的PWM
MOV TCR20,#00H
SETB PLEEN
NOP
JNB PLEEN,$ ;等待锁相环(PLL)稳定
ORL TCR20,#03H ;启动定时器,对称PWM模式
RET
;***************************************
; 名称: UART_INIT
; 功能: UART初始化,波特率2400bit/s
;***************************************
UART_INIT:
MOV PCON,#00H
MOV SSTAT,#00H ;双缓冲禁止,中断禁止,采用查询方式发送和接收
MOV SCON,#40H ;串口模式1,接收禁止
ORL PCON,#40H ;SMOD0=1,SCON的位7作为FE
MOV BRGCON,#00H
MOV BRGR1,#BRGR1_DATA
MOV BRGR0,#BRGR0_DATA
MOV BRGCON,#03H ;启动UART的波特率发生器
RET
;*****************************************************
; 名称: DELAY
; 功能: 延时(R7*0.1)秒(振荡器为6MHz)
; 入口参数:R7--延时时间
; 出口参数:无
; 注意: 如果入口参数R7等于0,则不延时而直接返回。
;*****************************************************
DELAY:
MOV A,R7
JZ DELAY_RTN
DELAY_L1:
MOV R6,#0C8H ;延时0.1S
DELAY_L2:
MOV R5,#0FAH
DELAY_L3:
NOP
NOP
NOP
NOP
DJNZ R5,DELAY_L3
DJNZ R6,DELAY_L2
DJNZ R7,DELAY_L1
DELAY_RTN:
RET
END
史海拾趣
|
wince 5.0 toolbar 怎么移动,和显示大图标? C#写了智能应用程序,用了TOOLBAR控件,怎么不能移动,跟菜单重合在一起,也不能显示大图标,在设备里只显示一点图标,大部分被截了,我怎么才能移动改变它的大小呢?谢谢!… 查看全部问答> |
|
瑞萨、飞思卡尔、Microchip、NEC、Atmel等等这些MCU大鳄都拥有自己的ARM架构。如今TI也有自己的架构,而且强劲地发展。 请问,这些MCU大鳄们的ARM架构是怎么样的?其各自的优缺点是什么? 那位达人可否概况下,谢谢… 查看全部问答> |
|
我对c8051 pic msp430的比较,还望大虾们给予指正 最近我对三种单片机进行了一些了解,对三种单片机的性能进行了对比,希望各位大家给予指导,看我说的对吗? 1、PIC的特点是不进行简单的累加,他根据内部资源的多少,有120多中型号,而且具有向下兼容性。C8051和MSP430这点相对PIC差了一点。 2、 ...… 查看全部问答> |
|
【设计工具】独家首发《xilinx PlanAhead进行FPGA设计》官方讲座 PlanAhead是xilinx新一代FPGA工程设计工具,它不仅具有ISE所具备的全部功能, 而且增强了对设计的分析能力。是xilinx重点推荐的下一代FPGA开发软件。本文是最新的PlanAhead使用介绍讲演稿,希望对大家有用处。 … 查看全部问答> |
|
256信道语音模块 项目预算:¥ 15,000~20,000 开发周期:60天 项目分类: 系统开发件 竞标要求: 项目标签: 无线射频 语音传输 ...… 查看全部问答> |
|
.cinit : > FLASHA | FLASHC | FLASHD, PAGE = 0 .pinit : > FLASHA ...… 查看全部问答> |
|
当端口发生中断的时候,怎么确定程序进入了哪个中断程序,我在P1.4按下开关之后,程序进入了ISR(CC2520_IRQ, cc2520_port1_interrupt)这个中断,为什么不是ISR(PORT1, irq_p1)中断函数,源程序中写的是ISR(PORT2, irq_p2),因为我开关接在P1.4所以 ...… 查看全部问答> |
|
replyreload += \',\' + 1803894; 本帖最后由 小崇伟 于 2015-1-14 09:52 编辑 昨天晚上花了点时间把这个过程写了一下,没什么难的地方,在此奉献给需要的小伙伴了。 记得帮忙顶贴,有问题可以加我QQ交流,仅限问题交流,其他的杂事没空理会,谢 ...… 查看全部问答> |




