|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2008-12-6 18:24:23
|
显示全部楼层
定时器还没学呢,找到了一个汇编的,不懂汇编,里边没有显示模块,没法测试,哪位帮忙把核心部分转成C的
;/////////////////////// 宏定义 ////////////////////////////////////////
STACK_START EQU 03Fh ;堆栈起始
DELAY_TIME_H EQU 0F8H ;计时器2ms中断
DELAY_TIME_L EQU 02FH
FLAG_REM BIT 00H ;已接收到遥控信号
FLAG_REM_TIMEOUT BIT 01H ;接收遥控信号超时
;/////////////////////// 变量 //////////////////////////////////////////
REM_CNT EQU 7EH ;已接收数据位数
REM_BUF EQU 7FH ;遥控数据缓冲区
;============================================================================
;------------------------- 主程序 -----------------------------------------
ORG 0000H
JMP MAIN
ORG 0003H ;外部中断
JMP INT_REM
ORG 000BH ;计时器中断
AJMP INT_TIMER
MAIN:
MOV SP,#STACK_START
MOV TH0,#DELAY_TIME_H
MOV TL0,#DELAY_TIME_L
MOV TMOD,#00100001B ;计时器模式
MOV TL1,#0FDH ; 9600 BPS
MOV TH1,#0FDH ; 8 位
MOV SCON,#01000000B ; 无校验
SETB TR0 ;开计数器
SETB TR1
SETB ET0 ;开中断
SETB EX0
SETB EA
CLR FLAG_REM
SETB FLAG_REM_TIMEOUT
MOV REM_CNT,#0
;-------------------------主循环---------------------------------------------
LOOP:
JB FLAG_REM,REM_HANDLE ;有遥控信号未处理
JMP LOOP
;--------------------------遥控数据处理--------------------------------------
REM_HANDLE:
MOV A,REM_BUF ;通过串口发送数据
MOV SBUF,A
JNB TI,$
CLR TI
ACALL DELAY_100MS
CLR FLAG_REM
JMP LOOP
;--------------------------外部中断(遥控输入)--------------------------------
; 遥控芯片: M50462AP
;
INT_REM:
CLR EX0 ;关中断
PUSH PSW ;保存现场
PUSH ACC
JB FLAG_REM,INT_REM_END ;有遥控信号未处理
;拒绝接收
SETB RS0
MOV R5,#50 ;延时200US去干扰
REM_DELAY:
JB P3.2,INT_REM_END
DJNZ R5,REM_DELAY
JB FLAG_REM_TIMEOUT,REM_START
;已超时,重新开始
MOV A,TH0 ;粗略计算两次间隔
ANL A,#0FH
CJNE A,#0BH,REM_SKIP_CHK_0
BIT_IS_0:
CLR C ;BIT IS 0
JMP REM_CHK_OK
REM_SKIP_CHK_0:
JC INT_REM_END ;<0BH
CJNE A,#0EH,REM_CHK_1 ;干扰
BIT_IS_1:
SETB C ;BIT IS 1
JMP REM_CHK_OK
REM_CHK_1:
JC BIT_IS_0 ;<0EH
JMP BIT_IS_1 ;>0EH
REM_CHK_OK:
MOV A,REM_BUF ;将一位数据存储
RRC A
MOV REM_BUF,A
INC REM_CNT ;接收位数计数器加一
MOV A,REM_CNT
CJNE A,#10H,REM_CHK_NEXT ;已接收到16位数据
SETB FLAG_REM ;接收到有效的遥控信号
;遥控码在 REM_BUF 里
REM_START:
MOV REM_CNT,#0
REM_CHK_NEXT:
MOV TH0,#DELAY_TIME_H ;设置超时计数器
MOV TL0,#DELAY_TIME_L
CLR FLAG_REM_TIMEOUT
INT_REM_END:
POP ACC ;恢复现场
POP PSW
SETB EX0
RETI
;-------------------------计时器中断-----------------------------------------
INT_TIMER:
SETB FLAG_REM_TIMEOUT
RETI
;--------------------------延时子程序----------------------------------------
DELAY_100MS:
MOV R7,#0C8H
DELAY_100MS_L0:
MOV R6,#0F8H
DELAY_100MS_L1:
DJNZ R6,DELAY_100MS_L1
NOP
DJNZ R7,DELAY_100MS_L0
RET
END |
|