找回密码
 注册
LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 907|回复: 0

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

[复制链接]
chuxuezhe22 该用户已被删除
发表于 2010-6-22 17:16:22 | 显示全部楼层 |阅读模式
LED_BIT_1  EQU              30H                          ; 存放8位数码管的段码
LED_BIT_2  EQU              31H
LED_BIT_3  EQU              32H
LED_BIT_4  EQU              33H
LED_BIT_5  EQU              34H
LED_BIT_6  EQU              35H
LED_BIT_7  EQU              36H
LED_BIT_8  EQU              37H                     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
AD_CS      EQU             P3.6                       ;;端口设置
AD_RD      EQU             P3.7
AD_INPUT_PORT EQU          P1
SDA      EQU              P2.6
SCL      EQU              P2.7                  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHEZHI  EQU         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          ;;调用设置显示子函数
      ;;LCALL  DLY_L          ;;长延时
       JNB    P2.3,A1          ;;判断返回
        JnB    P2.4,S10          ;;判断增加
        jnb    p3.0 , s11
            ljmp  s1
     s10:  INC    SHEZHI           ;; 加一
          ljmp   s1
       s11: dec   shezhi      
           ljmp  s1          ;;循环
         RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S2:   LCALL   DLY_S           ;;设置子程序
         LCALL   DS2          ;;调用设置显示子函数
      LCALL  DLY_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
          MOV  A,B
         SETB   p3.5
           SETB  p3.4
          SETB  p3.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
          CLR  p3.5
           SETB p3.4
           CLR  p3.3
           MOV      P0,#0c7H                                    ;显示字符L
           LCALL    DLY_S
         CLR   p3.5
         CLR    p3.4
           CLR   p3.3
           MOV      P0,#89H                  ;;显示字符H
           LCALL    DLY_S
          CLR  p3.5
         CLR   p3.4
          SETB  p3.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
LCALL  DISPLAY
lCAll   ADC_READ
LCALL  DISPLAY
LCALL  DISPLAY
lCAll   ADC_READ
LCALL  DISPLAY
LCALL  DISPLAY
lCAll   ADC_READ
LCALL  DISPLAY
LCALL  DISPLAY             ;;显示
;;LJMP A01                    ;;回主函数
   RET
;;;;;;;;;;;;;;;;;;;;;;;DAC转换子程序判断;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   DAC:
        MOV  A,SHEZHI
         clr  c                ;;计算设置值测量值的差
         SUBB A,CL
          MOV P3,A                     ;;将值送DA
          CLR P2.5
        jnc   dac0
       ;; CJNE  A,#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   1口显示
                   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;;;;;;;;;;;;;;;;;;;;;;;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2026-9-28 02:01 , Processed in 0.022401 second(s), 8 queries , Gzip On, File On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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