找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3533|回复: 7
打印 上一主题 下一主题
收起左侧

豆浆机Proteus单片机汇编源码转化成C代码 求翻译

[复制链接]
跳转到指定楼层
楼主
求大神帮我把这份汇编语言的代码转化成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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:209932 发表于 2017-6-10 20:50 | 只看该作者
有点复杂,有点困难
回复

使用道具 举报

板凳
ID:34643 发表于 2017-6-11 06:39 | 只看该作者
转换,不如重新写出个。
回复

使用道具 举报

地板
ID:208751 发表于 2017-6-11 14:16 | 只看该作者
51mcu 发表于 2017-6-11 06:39
转换,不如重新写出个。

我不会写,看电路图写代码不会呀,我是小白,什么都不懂得那种
回复

使用道具 举报

5#
ID:208751 发表于 2017-6-11 14:19 | 只看该作者
TopXia 发表于 2017-6-10 20:50
有点复杂,有点困难

那怎么办??我急需这个哎,找了半天豆浆机的源码只有这个汇编的没有找到C,都快哭了~~o(>_<)o ~~
回复

使用道具 举报

6#
ID:82765 发表于 2017-6-11 23:53 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

7#
ID:208751 发表于 2017-6-12 08:14 | 只看该作者
cjjcjj1 发表于 2017-6-11 23:53
你好!这个改写有点麻烦,而且你设计的功能要求也没提,c语言程序什么时间要

功能:
1.当接通电源且没有按键选择模式时,电源指示灯亮。显示器显示“0  0”,表示处于等待状态
2.在等待状态下按下键1、键2或键3时,就会选择工作模式1、模式2或模式3。后面的12表示加热时间,闪3次豆浆机开始工作
3.当显示器上模式“3”闪三次后,豆浆机开始第一次加热,加热指示灯(红灯)亮,计时显示器开始倒计数
4.当第一次加热计时到0时,加热结束,开始第一次粉碎。计时显示器重新开始倒计时,粉碎指示灯(黄灯)亮。之后又进行第二次加热,第二次粉碎。
5.当两次粉碎,三次加热结束后,豆浆机工作完毕。此时豆浆机主动关电源,同时报警灯亮,蜂鸣器响

注:当在工作中液位超过安全位置时,豆浆机暂停工作,报警灯亮。待液位回落后,继续接着执行之前的操作。
我急用,最迟明天就要用的。求大神帮个忙。
回复

使用道具 举报

8#
ID:781022 发表于 2020-6-17 13:20 | 只看该作者
你好,可以发一下电路图和代码的文件吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表