找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4006|回復: 11
打印 上一主題 下一主題
收起左側(cè)

求助匯編語言看不懂,請幫忙把下面程序翻譯成C語言

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:141313 發(fā)表于 2017-1-17 19:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

PinBEEP EQU P2.3
IrPin EQU P3.2
SCL EQU P2.1
SDA EQU P2.0
AddressH EQU 0AH
AddressL EQU 0BH

Address EQU 0EH
I2CData EQU 0FH
IrDataA EQU 10H
IrDataB EQU 11H
IrDataC EQU 12H
IrDataD EQU 13H
LED1 EQU 18H
LED2 EQU 19H
LED3 EQU 1AH
LED4 EQU 1BH
LedT0 EQU 1CH
Flag EQU 20H
FlagKeyRP EQU 20H.0 ;禁止按鍵重復執(zhí)行
OutBuf EQU 40H
ComBuf EQU 50H

;=====================================================================================
ORG 0000H
JMP START
;=====================================================================================
ORG 000BH   ;定時器0中斷入口
;定時中斷主要作顯示用
INT_TO:
PUSH ACC
PUSH PSW
CLR TF0  ;清定時0中斷標?
MOV TH0,#0F6H ;2.5MS
MOV TL0,#03DH ;
MOV A,#11110000B ;關(guān)數(shù)碼管
ORL P2,A
MOV DPTR,#TABLE
MOV A,LedT0
CJNE A,#0,INT_T0_1
MOV A,LED1
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
MOV LedT0,#1
LJMP INT_T0_END
INT_T0_1:
   
MOV A,LedT0
CJNE A,#1,INT_T0_2
MOV A,LED2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
MOV LedT0,#2
LJMP INT_T0_END
INT_T0_2:
   
  MOV A,LedT0
CJNE A,#2,INT_T0_3
MOV A,LED3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
MOV LedT0,#3
LJMP INT_T0_END
INT_T0_3:
   
MOV A,LED4
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
MOV LedT0,#0
LJMP INT_T0_END
   
INT_T0_END:
POP PSW
POP ACC
RETI
TABLE:
DB 00101000B ;0
DB 11101011B ;1
DB 00110010B ;2
DB 10100010B ;3
DB 11100001B ;4
DB 10100100B ;5
DB 00100100B ;6
DB 11101010B ;7
DB 00100000B ;8
DB 10100000B ;9
DB 01100000B ;A
DB 00100101B ;b
DB 00111100B ;C
DB 00100011B ;d
DB 00110100B ;E
DB 01110100B ;F
DB 11110111B ;-
DB 11111111B ;
;=====================================================================================
START:
CLR Flag
mov sp,#60h
;===================================================
;串口初始化
MOV SCON,#00H
MOV TCON,#00H
MOV IE,#00H
;TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
;        0    0   1  0   0    0   0  1
MOV TMOD,#00100001b  ;T1八位重載,T0十六位定時模式
MOV TH1,#0FFH
MOV TL1,#0FFH  ;波特率28800
;SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
;        0   1   0   1   0   0  0  0
MOV SCON,#01010000b
SETB TR1
CLR RI
;===================================================
;定時器中斷初始化
; MOV TMOD,#01H ;設(shè)定T0為十六位定時模式。
MOV TH0,#0F6H ;2MS
MOV TL0,#03DH ;
SETB TR0  ;開定時器0
SETB ET0  ;致能定時0中斷
CLR TF0  ;清定時0中斷標志
SETB EA   ;開總中斷
MOV LedT0,#00H
MOV LED1,#0
MOV LED2,#0
MOV LED3,#0
MOV LED4,#0
;=====================================================================================
MAIN:
;=====================================================================================
;遙控掃描
MAIN_IR:
JB IrPin,MAIN_IR_NEXT
JMP IR
MAIN_IR_NEXT:
;=====================================================================================
;按鍵掃描
MAIN_KEY:
MOV A,P3
ORL A,#00000111B
CPL A
JZ MAIN_KEY_NO
CALL DELAY2400 ;延時去抖
MOV A,P3
ORL A,#00000111B
CPL A
JZ MAIN_KEY_NO
;
JMP KEY_GOTO
MAIN_KEY_NO:
CLR FlagKeyRP
MAIN_KEY_NEXT:
;=====================================================================================
;串口接收
MAIN_RS232_RX:
JNB RI,MAIN_RS232_RX_NEXT
CALL RS232_Receive
JNZ MAIN_RS232_RX_NEXT
JMP RS232_GOTO
MAIN_RS232_RX_NEXT:

JMP MAIN
;=====================================================================================
;遙控處理
IR_GOTO:
MOV R0,#OutBuf
MOV A,#85  ;開始位
MOV @R0,A
MOV R0,#OutBuf+1
MOV A,#2  ;遙控信息
MOV @R0,A
MOV R0,#OutBuf+2
MOV A,IrDataA
MOV @R0,A  ;用戶碼1
MOV R0,#OutBuf+3
MOV A,IrDataB
MOV @R0,A  ;用戶碼2
MOV R0,#OutBuf+4
MOV A,IrDataC
MOV @R0,A  ;數(shù)據(jù)碼1
MOV R0,#OutBuf+5
MOV A,IrDataD
MOV @R0,A  ;數(shù)據(jù)碼2
CALL RS232_SendData ;發(fā)送
JMP MAIN_IR_NEXT
;=====================================================================================
;遙控處理
KEY_GOTO:
JB FlagKeyRP,KEY_GOTO_END
SETB FlagKeyRP
MOV B,A
MOV R0,#OutBuf
MOV A,#85  ;開始位
MOV @R0,A
MOV R0,#OutBuf+1
MOV A,#1  ;按鍵信息
MOV @R0,A
MOV R0,#OutBuf+2
MOV @R0,B  ;按鍵值
CALL RS232_SendData ;發(fā)送
KEY_GOTO_END:
JMP MAIN_KEY_NEXT
;=====================================================================================
RS232_GOTO:
MOV R0,#ComBuf
MOV A,@R0
XRL A,#85
JNZ RS232_GOTO_END ;開始碼不等于85,則退出
MOV R0,#ComBuf+1
MOV A,@R0
CJNE A,#1,$+6
LJMP RS232_GOTO_LED
CJNE A,#2,$+6
LJMP RS232_GOTO_DIGIT
CJNE A,#3,$+6
LJMP RS232_GOTO_READ_2402
CJNE A,#4,$+6
LJMP RS232_GOTO_WRITE_2402
RS232_GOTO_END:
JMP MAIN
;================================================================
RS232_GOTO_LED:
MOV R0,#ComBuf+2
MOV A,@R0
CPL A
MOV P1,A
CALL BEEP ;響一下
JMP MAIN
;================================================================
RS232_GOTO_DIGIT:
MOV R0,#ComBuf+2
MOV A,@R0
ANL A,#00001111B
MOV LED1,A
MOV R0,#ComBuf+3
MOV A,@R0
ANL A,#00001111B
MOV LED2,A
MOV R0,#ComBuf+4
MOV A,@R0
ANL A,#00001111B
MOV LED3,A
MOV R0,#ComBuf+5
MOV A,@R0
ANL A,#00001111B
MOV LED4,A
CALL BEEP ;響一下
JMP MAIN
;================================================================
RS232_GOTO_READ_2402:
MOV R0,#ComBuf+2
MOV A,@R0
MOV Address,A
CALL I2C_READ ;讀出數(shù)據(jù)
JC RS232_GOTO_READ_2402_END ;讀數(shù)數(shù)失敗
;發(fā)送數(shù)據(jù)
MOV B,A
MOV R0,#OutBuf
MOV A,#85  ;開始位
MOV @R0,A
MOV R0,#OutBuf+1
MOV A,#3  ;24C02數(shù)據(jù)信息
MOV @R0,A
MOV R0,#OutBuf+2
MOV A,Address
MOV @R0,A  ;地址
MOV R0,#OutBuf+3
MOV A,I2CData
MOV @R0,A  ;數(shù)據(jù)
CALL RS232_SendData ;發(fā)送
JMP MAIN
RS232_GOTO_READ_2402_END:
JMP MAIN
;================================================================
RS232_GOTO_WRITE_2402:
MOV R0,#ComBuf+2
MOV A,@R0
MOV Address,A
MOV R0,#ComBuf+3
MOV A,@R0
MOV I2CData,A
CALL I2C_WRITE ;讀出數(shù)據(jù)
JC RS232_GOTO_WRITE_2402_END ;讀數(shù)數(shù)失敗
CALL BEEP ;響一下
RS232_GOTO_WRITE_2402_END:
JMP MAIN

;=====================================================================================
; RS232 通訊子程序
;=====================================================================================
;=====================================================================================
;接收數(shù)據(jù),6字節(jié)
;=====================================================================================
RS232_Receive:
CLR RI
MOV R0,#ComBuf
MOV @R0,SBUF
MOV R7,#6
RS232_Receive_LOOP:
;超時檢測
MOV R3,#250
    RS232_Receive_DELAY_R3:
MOV R4,#250
    RS232_Receive_DELAY_R4:
JB RI,RS232_Receive_GO
DJNZ R4,RS232_Receive_DELAY_R4
DJNZ R3,RS232_Receive_DELAY_R3
JMP RS232_Receive_ERROR
    RS232_Receive_GO:
INC R0
MOV @R0,SBUF
CLR RI
DJNZ R7,RS232_Receive_LOOP
RS232_Receive_RIGHT:
SETB C
RET
RS232_Receive_ERROR:
CLR C
RET
;=====================================================================================
;發(fā)送數(shù)據(jù),6字節(jié)
;=====================================================================================
RS232_SendData:
MOV R0,#OutBuf
MOV R7,#6
    RS232_SendData_18BYTE:
CLR TI
MOV SBUF,@R0
JNB TI,$ ;等待發(fā)送完成
CLR TI
INC R0
DJNZ R7,RS232_SendData_18BYTE
RET

;=====================================================================================
; AT24C01 處理子程序
;=====================================================================================
/*------------------------------------------------------
寫一個字節(jié) Address地址 I2CDatata寫入的數(shù)據(jù)
------------------------------------------------------*/
I2C_WRITE:
MOV R6,#30  ;等待30MS
    I2C_WRITE_A:
call I2C_START
MOV A,#10100000B
call I2C_SEND8BIT
call I2C_ACK
JNC I2C_WRITE_A_GO ;=1,表示無確認,再次發(fā)送
CALL DELAY1000
DJNZ R6,I2C_WRITE_A
JMP I2C_WRITE_ERROR
    I2C_WRITE_A_GO:

MOV A,Address
call I2C_SEND8BIT
call I2C_ACK
MOV A,I2CData
call I2C_SEND8BIT
call I2C_ACK
call I2C_STOP
CLR C
RET
I2C_WRITE_ERROR:
SETB C
RET

/*------------------------------------------------------
讀一個字節(jié) Address地址 Data讀出的數(shù)據(jù)
------------------------------------------------------*/
I2C_READ:
MOV R6,#30  ;等待30MS
    I2C_READ_A:
call I2C_START
MOV A,#10100000B
call I2C_SEND8BIT
call I2C_ACK
JNC I2C_READ_A_GO ;=1,表示無確認,再次發(fā)送
CALL DELAY1000
DJNZ R6,I2C_READ_A
JMP I2C_READ_ERROR
    I2C_READ_A_GO:
MOV A,Address
call I2C_SEND8BIT
call I2C_ACK
MOV R6,#30  ;等待30MS
    I2C_READ_B:
call I2C_START
MOV A,#10100001B
call I2C_SEND8BIT
call I2C_ACK
JNC I2C_READ_B_GO ;=1,表示無確認,再次發(fā)送
CALL DELAY1000
DJNZ R6,I2C_READ_B
JMP I2C_READ_ERROR
    I2C_READ_B_GO:
call I2C_RECEIVE8BIT
MOV I2CData,A
call I2C_ACK
call I2C_STOP
CLR C
RET
I2C_READ_ERROR:
SETB C
RET

;發(fā)送開始信號
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;發(fā)送結(jié)束信號
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
;發(fā)送接收確認信號
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0
CLR C
SJMP I2C_ACK_END
    I2C_ACK0:
SETB C
    I2C_ACK_END:
CLR SCL
RET
;送八位數(shù)據(jù)
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A

MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET

;接收八位數(shù)據(jù)
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
;=====================================================================================
; 遙控接收子程序
;=====================================================================================
IR:
;以下對遙控信號的9000微秒的初始低電平信號的識別,波形見圖5。
   MOV  R6,#9
IR_SB:
ACALL  DELAY882 ;調(diào)用882微秒延時子程序
JB IrPin,IR_ERROR ;延時882微秒后判斷P3.2腳是否出現(xiàn)高電平如果有就退出解        ;碼程序
  DJNZ  R6,IR_SB ;重復10次,目的是檢測在8820微秒內(nèi)如果出現(xiàn)高電平就退        ;出解碼程序
;識別連發(fā)碼,和跳過4.5ma的高電平。
JNB IrPin, $  ;等待高電平避開9毫秒低電平引導脈沖
ACALL DELAY2400
JNB IrPin,IR_Rp ;這里為低電平,認為是連發(fā)碼信號,見圖6。
ACALL DELAY2400  ;延時4.74毫秒避開4.5毫秒的結(jié)果碼
;以下32數(shù)據(jù)碼的讀取 ,0和1的識別 請看圖2
MOV R1,#IrDataA ;設(shè)定IrDataA為起始RAM區(qū)
MOV R2,#4
IR_4BYTE:  
MOV R3,#8
IR_8BIT:
JNB IrPin,$  ;等待地址碼第一位的高電平信號
LCALL DELAY882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電        ;平狀態(tài)
MOV C,IrPin  ;將P3.2引腳此時的電平狀態(tài)0或1存入C中
JNC IR_8BIT_0 ;如果為0就跳轉(zhuǎn)到IR_8BIT_0
LCALL DELAY1000
IR_8BIT_0:
MOV A,@R1  ;將R1中地址的給A
RRC A  ;將C中的值0或1移入A中的最低位
MOV @R1,A  ;將A中的數(shù)暫時存放在R1中
DJNZ R3,IR_8BIT ;接收地址碼的高8位
INC R1    ;對R1中的值加1,換下一個RAM
DJNZ R2,IR_4BYTE ;接收完16位地址碼和8位數(shù)據(jù)碼和8位數(shù)據(jù),
       ;存放在1AH/1BH/1CH/1DH的RAM中
;解碼成功
JMP IR_GOTO
IR_Rp:
;這里為重復碼執(zhí)行處
;按住遙控按鍵時,每過108ms就到這里來
LJMP MAIN ;退出解碼子程序
IR_ERROR:
;錯語退出
LJMP MAIN ;退出解碼子程序

;=============================882
DELAY882: ;1.085x ((202x4)+5)=882
MOV R7,#202
    DELAY882_A:
     NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000: ;1.085x ((229x4)+5)=999.285
MOV R7,#229
    DELAY1000_A:
     NOP
NOP
DJNZ R7,DELAY1000_A
RET
;=============================2400
DELAY2400: ;1.085x ((245x9)+5)=2397.85
MOV R7,#245
    DELAY2400_A:
     NOP
NOP
     NOP
NOP
NOP
    NOP
NOP
DJNZ R7,DELAY2400_A
RET
;=========================================
;接收正確 響一下
BEEP:
CLR PinBEEP
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
CALL DELAY2400
SETB PinBEEP
RET
END
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:138155 發(fā)表于 2017-1-18 08:44 | 只看該作者
這么大程序量 怎么翻譯啊 重寫差不多
回復

使用道具 舉報

板凳
ID:139514 發(fā)表于 2017-1-18 09:09 | 只看該作者
你要不要講一下你這程式是什麼功能,還有註解多一點,每個區(qū)塊的程式講一下大概內(nèi)容,
要不然這樣子一行一行看滿累的....
回復

使用道具 舉報

地板
ID:149988 發(fā)表于 2017-1-18 12:03 | 只看該作者

RE: 求助匯編語言看不懂,請幫忙把下面程序翻譯成C語言

匯編語言和C51語言是兩種完全不同的語言,語句語法處理上差異甚大。它不可能像把英語翻譯成漢語那樣,某個單詞對應漢字是什么。不可能一句匯編語言對應一句C51語言,只能是,要做一個工程,用匯編語言怎么寫,用C51語言怎么寫,最終效果一樣就可以了。
回復

使用道具 舉報

5#
ID:162242 發(fā)表于 2017-1-18 14:19 | 只看該作者
需要先了解震蕩周期
回復

使用道具 舉報

6#
ID:143803 發(fā)表于 2017-1-18 20:41 來自手機 | 只看該作者
你把軟件需求貼出來,照軟件需求更簡單一些
回復

使用道具 舉報

7#
ID:123289 發(fā)表于 2017-1-19 15:46 | 只看該作者
匯編語言看不懂,不建議攻單片機這個行業(yè)。

評分

參與人數(shù) 1黑幣 +35 收起 理由
lxa0 + 35 贊同!

查看全部評分

回復

使用道具 舉報

8#
ID:162539 發(fā)表于 2017-1-20 16:10 | 只看該作者
知道功能的話,還不如重新編寫的省事!
回復

使用道具 舉報

9#
ID:111634 發(fā)表于 2017-1-21 18:07 | 只看該作者
yzwzfyz 發(fā)表于 2017-1-19 15:46
匯編語言看不懂,不建議攻單片機這個行業(yè)。

同感!
回復

使用道具 舉報

10#
ID:153041 發(fā)表于 2017-1-23 13:01 | 只看該作者
一小段還有可能幫你,這么多,你以為大家都是代碼農(nóng)民工,還免費的。
回復

使用道具 舉報

11#
ID:104472 發(fā)表于 2017-1-23 14:57 | 只看該作者
功能有點多,232,按鍵,紅外,存儲,像是一個完整的項目,應該是從書上找到,建議找相關(guān)的c程序,如果是實在要這個程序的話,就一部分一部分改,一個功能一個功能動。
回復

使用道具 舉報

12#
ID:141313 發(fā)表于 2017-1-23 15:41 | 只看該作者
jiajuntao 發(fā)表于 2017-1-23 14:57
功能有點多,232,按鍵,紅外,存儲,像是一個完整的項目,應該是從書上找到,建議找相關(guān)的c程序,如果是實 ...

謝謝,只需232,按鍵就行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表