本帖最后由 老鱼探戈 于 2011-4-21 19:37 编辑
B、把发射函数置于中断中,发射编码的时间不需要做进一步调整,而且时间很准的哦。看老鱼把他写成宏了,这样用起来多方便啊,呵呵。
EIR_SYNC equ 22+1 //23*13=300us
EIR_SYNCL equ 92+1 //92*13=1200us
EIR_38k_H equ 22+1 //300us
EIR_Low_1 equ 44+1 //600us
EIR_Low_0 equ 22+1 //300us
EIR_DataLng equ 25 //发送数据总长度(位)最后一为同步尾
EIR_SendLng equ EIR_DataLng*2+2
DIR_38kCnt reg 0x18
DIR_SdBitCnt reg 0x19
DIR_Data0 reg 0x1A
DIR_Data1 reg 0x1B
DIR_Data2 reg 0x1C
DSendTmCnt reg 0x1D
/*------------ 中断服务 --------------*/
org 08h
PUSH //保护现场
bcr INTFLAG,T0IF_B //清中断标志
TM_RELOAD E_25us
btrss FIR_Enb
lgoto LB_int_cnt
TM_RELOAD E_12_5us
MIR_Int //IR_TX
btrss DIR_38kCnt,0 //12.5us时要两次才算一次
lgoto LB_Int_Out
LB_int_cnt:
incr DSysClkCntms,1
// ............
// you other code
LB_Int_Out:
POP //恢复现场
Retie
//==================================================
//函数名称:MInt_IR
//输入参数:无
//输出参数:无
//函数功能:红外信号发送
//用 法: 将此宏置于13us的中断中,启动发送后将自动完成,当前只能完成24位发送,
//若需要更多,需要修改EIR_DataLng,添加 DIR_Data3..., 在RLR处添加,同时注意上面的
//Goto $+x要相应地改变
//==================================================
MIR_Int macro
decrsz DIR_38kCnt,1
lgoto $+20// 20 Int_01
bcr PIROut //IO_IR
movia EIR_Low_0
btrsc DIR_Data0,7
movia EIR_Low_1
btrsc DIR_SdBitCnt,0
movia EIR_38k_H
btrss FIR_Sync
movia EIR_SYNCL
movar DIR_38kCnt
bsr FIR_Sync
btrss DIR_SdBitCnt,0
lgoto $+4
RLR DIR_Data2,1 //带C左移
RLR DIR_Data1,1
RLR DIR_Data0,1
decrsz DIR_SdBitCnt,1
lgoto $+7
bcr FIR_Enb
lgoto $+5
//Int_01:
btrsc DIR_SdBitCnt,0
lgoto $+3
TurnB PTA,0X02 //有2字节
endm
以上是老鱼常用的几种发射方法,写的不好的地方请大家指正,热切希望您有更好的方法和思路与大家分享。
射频发射的原理是一样的,只是不需要自己产生载波信号,其实更简单。 |