求大神帮我把这份汇编语言的代码转化成C语言的代码,可以在KEIL里面用的。
这代码是我找的豆浆机Proteus仿真源码,但是我汇编语言不会,求翻译。。。。。
豆浆机的仿真电路图
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0_RD ;INT0口中断(液位溢出和液位过低中断)入口
ORG 0013H
LJMP INT1_RD ;INT1口中断(超液位中断)
ORG 0030H ;置初始状态
MAIN: MOV SP,#70H
SETB IT0 ;INT0口中断触发方式为跳变触发`
SETB IT1 ;INT1口中断触发方式为跳变触发
SETB EA ;开放中断
MOV IE,#85H ;开中断
MOV IP,#01H ;INT0中断源为高优先级,INT1中断源为低优先级
CLR P3.0 ;设初值
CLR P3.1
MOV 30H,#00H ;设置时间单元清零
MOV 31H,#00H ;显示模式单元清零
MOV 34H,#00H ;显示定时时间单元清零
MOV 32H,#00H ;计时显示十位清零
MOV 33H,#00H ;计时显示个位清零
SCAN_RD:LCALL XS_RD ;开始无键按下,显示00
LCALL SCAN_KEYB ;模式选择
JZ SCAN_RD ;有键按下 向下
LCALL KEY_PRSD
MOV DPTR,#JMP_RD ;设置转移表首地址
MOV A,R5 ;取键值
RL A ;键值乘以2
INC R5
JMP @A+DPTR
JMP_RD:AJMP PRO_00 ;模式0
AJMP PRO_01 ;模式1
AJMP PRO_02 ;模式2
PRO_00:MOV 30H,#06 ;定时时间为6s
AJMP LOOP_W PRO_01:MOV 30H,#09 ;定时时间为9s
AJMP LOOP_W PRO_02:MOV 30H,#12 ;定时时间为12s
AJMP LOOP_W ;模式选择后闪烁3次
LOOP_W:MOV 34H,30H ;调入定时时间显示数据
MOV R7,#3 ;闪烁3次
LOOP_RD:MOV R6,#30 ;延时20MS的次数
LOOP0_RD:LCALL XS_RD ;调显示程序
LCALL DL20MS
DJNZ R6,LOOP0_RD ;1S
MOV R6,#25 ;延时20MS的次数
LOOP1_RD:LCALL XS0_RD
LCALL DL20MS
DJNZ R6, LOOP1_RD ;0.5S
DJNZ R7,LOOP_RD ;闪烁3次
;开始工作
MOV R6,#02 ;粉碎次数
LCALL JR_RD
G00N_GZ:LCALL
FS_RD
LCALL JR_RD
DJNZ R6, G00N_GZ
LCALL BAOJ_WRD ;加热子程序
JR_RD: MOV 34H,30H ;给显示单元置数
SETB P3.0 ;加热
MOV R4,#50 ;20MS程序循环50次
GOON_JR:LCALL TIME_19MS ;调用定时20MS子程序
LCALL XS_RD ;显示
DJNZ R4,GOON_JR ;到1S了
MOV R4,#50 ;20MS程序循环50次
DJNZ 34H,GOON_JR ;倒计时完成
CLR P3.0 ;停止加热
RET ;粉碎子程序
FS_RD: MOV 34H,30H ;重新给显示单元置数
SETB P3.1 ;粉碎
MOV R4,#50 ;20MS程序循环50次
GOON_FS:LCALL TIME_19MS ;调用定时20MS子程序
LCALL XS_RD ;显示
DJNZ R4,GOON_FS ;到1S
MOV R4,#50 ;20MS程序循环50次
DJNZ 34H,GOON_FS ;粉碎完毕
CLR P3.1 ;停止粉碎
RET ;键盘子程序
SCAN_KEYB:MOV P2,#0EFH ;扫描有无按键按下
MOV A, P2
ANL A, #0EFH
XRL A, #0EFH
JZ NO_KEY
ACALL DL20MS
ANL A, #0EFH
XRL A, #0EFH
JZ NO_KEY
NO_KEY:RET
KEY_PRSD: MOV R4, P2
MOV R5, #00H
MOV DPTR,#KEY_TAB
CAL_VAL: MOV A,R5
MOVC A,@A+DPTR ;查键值表
XRL A,R4
JZ FIXED
INC R5 ;键值加1
SJMP CAL_VAL
FIXED: MOV A,P2 ;判断按键是否释放
ANL A, #0EFH
XRL A, #0EFH
JNZ FIXED
ACALL DL20MS
MOV A, P2
ANL A, #0EFH
XRL A, #0EFH
JNZ FIXED
RET
KEY_TAB: DB 0EBH, 0EDH, 0EEH
DL20MS: MOV R3, #20
DD1: MOV R4, #200
DD2: NOP
NOP
NOP
DJNZ R4, DD2
DJNZ R3, DD1
RET ;显示子程序
XS_RD: MOV 31H,R5 ;调入模式显示数据
MOV R0,#31H ;显示缓存区数据
MOV P1,#00000010B ;第三个灯为显示位置
ACALL DISP_RD ;显示一位
XS0_RD: MOV A,34H ;将定时数据分为两位
MOV B, #10
DIV AB
MOV 32H,A ;十位
MOV 33H,B ;个位
CJNE A,#00H,XS1_RD0 ;十位是否为0
AJMP XS1_RD
XS1_RD0:MOV R0,#32H
MOV P1,#00000100B ;第五个为显示位置
ACALL DISP_RD ;显示一位
XS1_RD: MOV R0,#33H ;显示缓存区数据
MOV P1,#00000101B ;第六个灯为显示位置
ACALL DISP_RD ;显示一位
RET
DISP_RD:MOV DPTR,#LED_RD ;字型码表首地址
MOV A,@R0 ;取显示数据
MOVC A,@A+DPTR ;求显示数据的字型码
MOV P0,A ;输出字型码
ACALL DL1MS ;稳定显示1ms
RET ;返回
;延时小程序
DL1MS: MOV R3, #200
DDD1: NOP
NOP
NOP
DJNZ R3, DDD1
RET
;字型码表
LED_RD: DB 3FH, 06H, 5BH, 4FH, 66H; '0, 1,2, 3,4’
DB 6DH, 7DH, 07H, 7FH, 6FH; '5, 6, 7, 8,9’ ;定时19MS子程序
TIME_19MS:MOV TMOD,#01H ;设置工作方式1和定时模式
MOV TH0,#0B5H ;计数初值为46536(O)
MOV TL0, #0C8H
SETB TR0 ;启动定时器
CONT_RD: JBC TF0,OVER_RD ;是否溢出
SJMP CONT_RD OVER_RD: MOV TH0,#0B5H ;重新设计数初值为46536(O)
MOV TL0, #0C8H
RET ;溢出中断和液位过低中断
ORG 0200H
INT0_RD:LCALL BAOJ_WRD ;直接报警并关发热器和电动机电源
RETI ;超液位中断
ORG 0300H
INT1_RD:CLR EA ;关中断
PUSH ACC ;保护现场
PUSH PSW
SETB EA ;开中断
SETB RS0 ;把工作寄存器切换到1区
MOV P1,#00000111B ;报警灯亮
JNB P3.0,INT0_FS ;判断是否在加热
CLR P3.0 ;停止加热
WAIT_RD: JNB P3.3,WAIT_RD ;液位是否下降
SETB P3.0 ;继续极热
LJMP OK
INT0_FS:CLR P3.1 ;停止粉碎
WAIT0_RD:JNB P3.3,WAIT0_RD ;液位是否下降
SETB P3.1 ;继续粉碎
OK:CLR EA ;关中断
POP PSW ;恢复现场
POP ACC
SETB EA ;开中断
RETI ;报警子程序
BAOJ_WRD:CLR P3.0 ;关电源
CLR P3.1
MOV P1,#00000110B ;蜂鸣器响
LCALL DL1MS
MOV P1,#00000111B ;报警灯亮
LCALL DL1MS
AJMP BAOJ_WRD
|