关于汇编语言转换为C语言
我有一个程序是用汇编写的(网上下载的),本人不会汇编,那位老师汇编好,帮忙看看,能不能翻译一下:;*************************************
;STC89C51RC单片机,6M晶振
;CH375A,D0--D7接S51,P2.0--P2.7
;P0.7为红外输入
;P0.6为无线电信号输入
;P0.5为外部信号输入
;*************************************
CS EQU P0.4
A0 EQU P0.0
DX EQU P0.2
CE EQU P0.1
GET EQU P0.3
ORG 0000H
LJMP AMIT
ORG 0030H
AMIT: MOV SP,#0FBH
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R0,#08H
MOV R7,#68
MOV R2,#00H ;R2=00H为红外检测,R2=01H为无线信号检测,R2=02H为外接输入检测。
CLR P0.7
MOV TMOD,#01H
MOV TL0,#00H
MOV TH0,#00H
CLR TR0
;********CH372复位*********
FW: MOV A,#05H
MOV P2,A
CLR CS
SETB A0 ;写复位命令
CLR DX
NOP
NOP ;50NS就可以
SETB DX
LCALL DYL
;********CH372调整模式**********
MOV A,#15H ;调整模式(内置模式)
ACALL XML
MOV A,#02H
ACALL XSJ
ACALL DSJ
;*******************
JSCS: JB GET,$
MOV A,#22H ;接受中断数据
ACALL XML ;调用CH372写命令
ACALL DSJ ;调用CH372读数据
CJNE A,#01H,G1
AJMP OUT1
G1: CJNE A,#0F2H,G2
ACALL OUT2 ;如果CH372返回0F2则读端口2的命令
AJMP CHKOF
G2: CJNE A,#0F5H,G3
AJMP PEND
G3: CJNE A,#0F6H,G4
AJMP LEEP
G4: CJNE A,#0F9H,G5
ACALL INO
AJMP JSCS
G5: CJNE A,#0FAH,JSCS
ACALL INO
AJMP JSCS
;*******采集子程序********
CHKOF: CJNE A,#0A1H,F1 ;捕获输入信号。
AJMP TIM
F1: CJNE A,#0A2H,F2 ;如果收到A2则复位主程序。
AJMP AMIT
F2: CJNE A,#0A3H,F3 ;红外输入。
AJMP HWX
F3: CJNE A,#0A4H,F4 ;无线电信号输入。
AJMP WXD
F4: CJNE A,#0A5H,JSCS ;外部信号输入。
SETB P0.7
SETB P0.6
CLR P0.5
MOV R2,#02H
AJMP JSCS
HWX: SETB P0.5
SETB P0.6
CLR P0.7
MOV R2,#00H
AJMP JSCS
WXD: SETB P0.5
SETB P0.7
CLR P0.6
MOV R2,#01H
AML: AJMP JSCS
;***********判断输入端***********
TIM: CJNE R2,#0F1H,TI1
AJMP WTT
TI1: CJNE R2,#0F2H,TI2
AJMP UTT
TI2: CJNE R2,#0F0H,AML
;***********数据采集1红外输入************
CT: JNB GET,QH_1
JB P3.7,CT
SETB TR0
THO: JNB P3.7,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
JB P3.7,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
INC R0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
INC R0
DJNZ R7,THO
CLR TR0
AJMP FZCX
QH_1: AJMP JSCS
;***********数据采集2无线输入************
WTT: JNB GET,QH_2
JB P3.6,WTT
SETB TR0
THA: JNB P3.6,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
JB P3.6,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
INC R0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
INC R0
DJNZ R7,THA
CLR TR0
AJMP FZCX
QH_2: AJMP JSCS
;************数据采集3外部输入************
UTT: JNB GET,QH_2
JB P3.5,UTT
SETB TR0
THB: JNB P3.5,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
JB P3.5,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
INC R0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
INC R0
DJNZ R7,THB
CLR TR0
;*************数据发送***********
FZCX: MOV R7,#122
MOV R0,#08H
ZDDS: MOV A,#2AH ;CH372中断命令通知PC机
ACALL XML
NOP
NOP
MOV A,#02H ;可输入8个字节
ACALL XSJ
MOV A,@R0 ;送入要上传的数据
ACALL XSJ
INC R0
MOV A,@R0 ;送入要上传的数据
ACALL XSJ
INC R0
ACALL FYL
MOV A,#22H ;接受中断数据
ACALL XML
ACALL DSJ
ACALL FYL
ACALL INO
DJNZ R7,ZDDS
MOV R0,#08H
MOV R7,#61
AJMP JSCS
;********CH372读出数据**********
OUT2: MOV A,#28H ;读端口2的命令
ACALL XML
ACALL DSJ
NOP
ACALL DSJ
NOP
RET
;****************
OUT1: NOP
PEND: NOP
LEEP: NOP
AJMP AMIT
;******释放缓冲区子程序*****
INO: MOV A,#2BH ;释放当前USB 缓冲区
ACALL XML
NOP
NOP
RET
;*******写命令子程序*******
XML: MOV P2,A
CLR CS
SETB A0
CLR DX
NOP
NOP ;500NS就可以
SETB DX
RET
;*******写入数据子程序*******
XSJ: CLR A0 ;写入数据
NOP
NOP ;延时2US,根据主频来确定NOP的值
MOV P2,A
CLR DX
NOP
NOP ;50NS就可以
SETB DX
NOP
NOP ;延时1.2US根据主频调整
RET
;********读出数据子程序*********
DSJ: MOV P2,#0FFH
CLR A0 ;读出数据
CLR CE
NOP
NOP ;延时50NS就可以了
MOV A,P2
SETB CE
RET
;*********延时子程序******
DYL: MOV R6,#100
D1: MOV R5,#50
DJNZ R5,$
DJNZ R6,D1
RET
FYL: MOV R6,#2
FD1: MOV R5,#68
DJNZ R5,$
DJNZ R6,FD1
RET
END
这是一个单片机检测红外线编码的程序,我想看看它的编程思路和检测方法。 那位高手能给个编程思路也可以,其实这个程序就是
https://bbs.eeworld.com.cn/thread-63777-1-1.html
这里下载的:loveliness: 这个程序里面包括了红外线通信、无线通信、USB转串口的通信程序,比较复杂 如果只是想做红外线通信的话,一般是先进行握手信号的通信,通过握手信号来确定接收的数据是Command还是Data,然后进行相应的处理就可以了。建议搜一下纯粹红外通信的程序。 :handshake :L 多谢回复,我只是想知道,单片机如何识别红外线信号的?用中断?比如红外线遥控器发送一串数据,我如何识别这串数据,如何识别出01010111000110???
根据电平时间
<div class='shownolgin' data-isdigest='no'>0和1的占空比不一样</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <div class='shownolgin' data-isdigest='no'>:loveliness: 知道了,我想应该是用中断和定时器结合来检测脉冲宽度,再判断是1还是0.</div><script>showreplylogin();</script>
页:
[1]