chuxuezhe22 发表于 2010-6-22 17:16:22

请求单片机编程:把汇编语言改成C语言。万分感谢! 很着急用

LED_BIT_1EQU            30H                        ; 存放8位数码管的段码
LED_BIT_2EQU            31H
LED_BIT_3EQU            32H
LED_BIT_4EQU            33H
LED_BIT_5EQU            34H
LED_BIT_6EQU            35H
LED_BIT_7EQU            36H
LED_BIT_8EQU            37H                     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AD_CS      EQU             P3.6                     ;;端口设置
AD_RD      EQU             P3.7
AD_INPUT_PORT EQU          P1
SDA      EQU            P2.6
SCL      EQU            P2.7                  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHEZHIEQU         61H                ;;存储区设置
CL   EQU          62H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       ORG       00H                                       ;初始化程序 ,
      SJMP      START
START:MOV   P3,00h
      MOV      DPTR,#TABLE
      MOV      P3,#0FFH
   
MOV      P1,#0FFH
      MOV      LED_BIT_1,#00H                         ;段码存储区清0
      MOV      LED_BIT_2,#00H
      MOV      LED_BIT_3,#00H
      MOV      LED_BIT_4,#00H
      MOV      LED_BIT_5,#00H
      MOV      LED_BIT_6,#00H
      MOV      LED_BIT_7,#00H
      MOV      LED_BIT_8,#00H
      MOV      P1,#00H                              ;;端口赋值
      
   A1:                           ;;主程序
   A01:   LCALL   DISPLAY      ;;调用显示   
            JNB   P2.3,S1         ;;判断是否按键按下,调用设置增加
            ;; jnb    p3.0 , s2
            mov   p3,#00h
            CALL    ADC_DEmO      ;;调用ADC子函数
            LCALL   DISPLAY
         CALL   DAC             ;;调用数模转换子函数
            LJMP      A01         ;;循环
             RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置设定温度;;;;;;;;;;;
S1:   LCALL   DLY_S         ;;设置子程序
         LCALL   DS2          ;;调用设置显示子函数
      ;;LCALLDLY_L          ;;长延时
       JNB    P2.3,A1          ;;判断返回
      JnB    P2.4,S10          ;;判断增加
      jnb    p3.0 , s11
            ljmps1
   s10:INC    SHEZHI         ;; 加一
          ljmp   s1
       s11: dec   shezhi      
         ljmps1          ;;循环
         RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S2:   LCALL   DLY_S         ;;设置子程序
         LCALL   DS2          ;;调用设置显示子函数
      LCALLDLY_L          ;;长延时
       JNB    P2.3,A1          ;;判断返回
      JB    P2.4,S1      
      jb    p3.0 , s2
       dec   SHEZHI         ;; 加一
      LCALL   DLY_L             ;;长延时
               ;;循环
         RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试温度显示
DISPLAY :                                                               ;
      MOV      A,CL                        ;;送测量值                     
         MOV      B,#100         
         DIV       AB                        ;;取百位
SETB   p3.5                           ;;送显示地址
         CLR      p3.4
         SETB      p3.3
         MOVC    A,@A+DPTR      ;;查表
         MOV      P0,A             ;;送显示数据
         LCALL    DLY_S
         MOV      A,B            ;;取十位
         MOV    B,#10
         DIV       AB
SETB   p3.5                ;;送显示地址
         SETB   p3.4
         CLR      p3.3
          MOVC    A,@A+DPTR       ;;显示十位
          MOV      P0,A
          LCALL    DLY_S
         MOV   A,B
         SETB    p3.5
         SETB    p3.4
         SETB    p3.3
         MOVC    A,@A+DPTR
          MOV      P0,A               ;;显示个位                  
         LCALL    DLY_S
         CLR      p3.5
         SETB   p3.4
          SETB   p3.3
          MOV      P0,#0bfH         ;;显示间隔符号
         LCALL    DLY_S
         SETB   p3.5
         CLR      p3.4
         CLR      p3.3
          MOV      P0,#0bfH       ;;显示间隔符号
         LCALL    DLY_S
         CLR      p3.5
         SETB   p3.4
         CLR      p3.3
         MOV      P0,#0c6H                                    ;;显示字符C
         LCALL    DLY_S
         CLR   p3.5
          CLR       p3.4
         CLR   p3.3
         MOV      P0,#0ceH                                       ;;显示字符I
         LCALL    DLY_S
         CLR      p3.5
          CLR       p3.4
          SETB   p3.3
          MOV      P0,#0f9H                                    ;;显示字符F
         LCALL    DLY_S
         RET
TABLE:          DB 0C0H, 0F9H, 0A4H ,0B0H ,99H, 92H ,82H, 0F8H, 80H, 90H                     ;;表格
            
;;;;************************************** HELP设置显示**********
DS2:                                                                  
         MOV      A,SHEZHI                        ;;送设置值      
         MOV      B,#100                           ;;取百位
          DIV       AB
         SETB    p3.5
         CLR    p3.4
         SETB   p3.3
         MOVC    A,@A+DPTR
         MOV      P0,A
         LCALL    DLY_S
         MOV      A,B
          MOV    B,#10
          DIV       AB
SETB      p3.5
         SETB   p3.4
         CLR   p3.3
          MOVC    A,@A+DPTR                ;;显示十位
          MOV      P0,A
          LCALL    DLY_S
          MOVA,B
         SETB   p3.5
         SETBp3.4
          SETBp3.3
          MOVC    A,@A+DPTR            ;;显示个位
          MOV      P0,A                              
         LCALL    DLY_S
      ;SETB       p3.5
      ;   CLR      p3.4
          ; SETB      p3.3
          ; MOV      P0,#00H                                    
         ;LCALL    DLY_S
         SETB         p3.5
         CLR             p3.4
         CLR             p3.3
          MOV      P0,#0bfH                  ;;显示间隔符
         LCALL    DLY_S
CLR      p3.5
         SETB    p3.4
          SETB   p3.3
          MOV      P0,#08cH                  ;;显示字符P
         LCALL    DLY_S
          CLRp3.5
         SETB p3.4
         CLRp3.3
         MOV      P0,#0c7H                                    ;显示字符L
         LCALL    DLY_S
         CLR   p3.5
         CLR    p3.4
         CLR   p3.3
         MOV      P0,#89H                  ;;显示字符H
         LCALL    DLY_S
          CLRp3.5
         CLR   p3.4
          SETBp3.3
          MOV      P0,#86H                ;; 显示字符   E            
         LCALL    DLY_S
         RET
;;;;;;;;;;;;;;;;;;;;;;;;AD转换;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADC_START:   ClR   AD_CS      ;;AD开始
            NOP
             nop               ;;延时一个机器周期
             SETB   AD_CS       ;;片选
             NOP
             nop
             RET
ADC_READ:                     ;;读AD 转换
MOV      AD_INPUT_PORT,#0ffh   ;;端口地址
ClR      AD_CS
NOP
nop
ClR   AD_RD
NOP
NOP
MOV    A,p1   ;;AD_INPUT_PORT
MOV    CL,A         ;;把读到的值送CL
NOP
SETB AD_RD
NOP
SETB AD_CS
RET
ADC_DEmO:                  ;;AD 转换主程序
lCAll   ADC_START         ;;AD 转换开始
;; LCALL   DLY_L            ;;延时等待转换
lCAll   ADC_READ
LCALLDISPLAY
lCAll   ADC_READ
LCALLDISPLAY
LCALLDISPLAY
lCAll   ADC_READ
LCALLDISPLAY
LCALLDISPLAY
lCAll   ADC_READ
LCALLDISPLAY
LCALLDISPLAY             ;;显示
;;LJMP A01                  ;;回主函数
   RET
;;;;;;;;;;;;;;;;;;;;;;;DAC转换子程序判断;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   DAC:
      MOVA,SHEZHI
         clrc                ;;计算设置值测量值的差
         SUBB A,CL
          MOV P3,A                     ;;将值送DA
          CLR P2.5
      jnc   dac0
       ;; CJNEA,#00H,DAC0               ;;相等送报警信号
      SETB P2.5
      DAC0:ret
      

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时

DLY_S:   MOV      R6,#5                                           ;短延时程序
D1:         MOV      R7,#100
            DJNZ      R7,$
            DJNZ      R6,D1
            RET
DLY_L:   MOV      R5,#25                                    ;长延时程序   
D2:         MOV      R6,#25
D3:         MOV      R7,#50
            DJNZ      R7,$
            DJNZ      R6,D3                              
            DJNZ      R5,D2
            RET
               
;;;;;;;;;;;;;;;;;;;;;24064;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
YA24C:          MOV   A,#0A0H               ;写操作命令
                LCALL   START_SIGNAL
                LCALL   I2C_WRITE
                JB      F0,YA24C            ;F0中存为应答位状态
               ; MOV   A,C24ADDR             ;24C的地址
               ;; LCALL   I2C_WRITE
                JB      F0,YA24C
                MOV   A,22h             ;24C的值
                ;;LCALL   I2C_WRITE
                JB      F0,YA24C
                LCALL   STOP_SIGNAL
                   DU24C:         MOV   A,#0A0H
                LCALL   START_SIGNAL
                LCALL   I2C_WRITE
                JB      F0,DU24C            ;写操作指令,
                ;MOV   A,C24ADDR            ;欲读取地址42h(读之前必须先写,给予其指令及地址)
                LCALL   I2C_WRITE
                JB      F0,DU24C
                LCALL   START_SIGNAL         ;重新调用开始
                MOV   A,#0A1H               ;写入读操作命令
                LCALL   I2C_WRITE
                JB      F0,DU24C
                LCALL    I2C_RECEIVE
                LCALL   STOP_SIGNAL
                  ;;MOV   P1,I2C_R_VALE   ;P1口显示
                   START_SIGNAL:   SETB    SDA
                  SETB    SDA
                  SETB    SDA
                  SETB    SCL
                  SETB    SCL
                  SETB    SCL
                  CLR   SDA
                  CLR   SDA
                  CLR   SDA
                  CLR   SCL
                  CLR   SCL
                  CLR   SCL
                  RET
      STOP_SIGNAL:      CLR   SCL
                  CLR   SCL
                  CLR   SCL
                  CLR   SDA
                  CLR   SDA
                  CLR   SDA
                  SETB    SCL
                  SETB    SCL
                  SETB    SCL
                  SETB    SDA
                  SETB    SDA
                  SETB    SDA
                  RET
      I2C_WRITE:      CLR   C
                  MOV   R6,#08H
I2C_RWRITE:       RLC   A          ;时钟高电平大于4.0US期间
                  MOV   SDA,C      ;SDA保持为高电平则表示发
                  SETB    SCL      ;0,SDA保持低电平则表示发
                  NOP                ;1
                  NOP
                  NOP                ;
                  CLR   SCL      ;
                  NOP                ;
                  NOP
                  DJNZ    R6,I2C_RWRITE
                  SETB    SDA      ;只要满足在时钟高电平大于
                  NOP                ;4US期间,SDA线上有确定的
                  NOP                ;电平状态即可
                  ;NOP                ;
                  SETB    SCL      ;
                  ;NOP                ;
                  NOP                ;
                  NOP                ;
                  MOV   C,SDA      ;
                  MOV   F0,C
                  CLR   SCL      ;
                  NOP                ;
                  NOP
                  JNC   I2C_RET
                  NOP
                  NOP
I2C_RET:          RET
I2C_RECEIVE:      CLR   C
                  MOV   R6,#08H
                  MOV   A,#00H
I2C_RRECEIVE:   SETB    SCL
                  MOV   C,SDA      ;
                  RLC   A      ;
                  NOP                ;
                  NOP                ;
                  NOP                ;
                  NOP
                  CLR   SCL      ;
                  NOP                ;
                  NOP
                  DJNZ    R6,I2C_RRECEIVE
                  ;MOV   I2C_R_VALE,A
                  NOP
                  NOP
                  NOP
                  NOP
I2C_RRET:         RET
END
;;;;;;;;;;;;;24064;;;;;;;;;;;;;;;;;;;;;;;
页: [1]
查看完整版本: 请求单片机编程:把汇编语言改成C语言。万分感谢! 很着急用