⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模数转换(ad)程序.asm

📁 ADC0832汇编编程
💻 ASM
字号:
         ;;MCU:89S51    COLCK:11.0592MHZ

;;;;;读到AD,并通过RS232送入电脑显示数据,电脑中要打开串口调试软件,才能显示实验板送来的数据
;;;;;
               ;***********************************************************************
               ;;;接线说明:
               ;;; J13的3脚和J3的3脚连 ,J13的4和J3的4连,,J13的5和J3的4连,J3的6和J7的5连
               ;***********************************************************************         
         CS  EQU  P1.5
        CLK  EQU  P1.6
         DI  EQU  P1.4
         DO  EQU  P1.7
       ADOK  BIT  30H
     AD0832  EQU  70H
 AD0832DATA  EQU  60H
     ;;;样例:读到AD,并通过RS232送入电脑显示数据
             ORG    0000H
             AJMP  MAIN
             ORG  0080H
    MAIN:
   main1:        ACALL  A200MS
           ACALL  A200MS
           MOV  R0,#01h;02H            ;选通道1
           ACALL  AD
           MOV  A,AD0832
 ;;因为AD0832的VREF为5V,它的分辨率:5/255=0.0196
 ;;计算电压:AD0832*0.0196,为了计算方便先去掉0.0196的小数点,变成196,计算好了再把小数点补上
           MOV  B,#0C4H    ;196
           MUL  AB         ;AD转换的数值*分辨率就是测量到的电压
           MOV  R7,A
           MOV  R6,B
           ACALL  HB2     ;把2个双字节十六进制电压转换成双字节BCD码电压方便观察
;;;;把电压小数点补上,小数点后取2位,第三位用四舍五入,如电压是0.5096,那就是0.51
           MOV  A,R5        ; 数据四舍五入处理
           CLR  C
           ADD  A,#50H
           DA  A
           MOV  R5,A
           MOV  A,R4
           ADDC  A,#00
           DA  A
           MOV  R4,A
           MOV  A,R3
           ADDC  A,#00
           DA  A
           MOV  R3,A
     ;;  补小数点,小数点后取2位:*.**V
           MOV  R1,#30H
           MOV  A,R3
           ANL  A,#0FH     ;
           MOV  @R1,A      ;电压整数位
           INC  R1
           MOV  @R1,#0AH   ;"."小数点
           INC  R1
           MOV  A,R4
           ANL  A,#0F0H
           SWAP  A
           MOV  @R1,A      ;小数点后第一位
           INC  R1
           MOV  A,R4
           ANL  A,#0FH
           MOV  @R1,A     ;小数点后第2位
           INC  R1
           MOV  @R1,#0BH  ;"V"
           INC  R1
           MOV  @R1,#0CH
           INC  R1
           MOV  @R1,#0CH  ;空格,这是让数据显示时使数据之间有空格
           ACALL  RS232    ;
           ACALL  A200MS
           ACALL  A200MS
           AJMP  MAIN1
  A200MS:                         ;200MS延时
           MOV  R6,#00
  A200MS1: MOV  R7,#0EFH
  A200MS2: NOP
           DJNZ  R7,A200MS2
           DJNZ  R6,A200MS1
           RET
;;;;;;;把测量到的电压通过串行口发送到电脑显示*.**V,  "*"是显示的电压值,波特率为2400.
RS232:
           ;MOV  R6,#00H
           MOV TMOD,#20H;设定T1为定时方式2
           MOV TH1,#0F4H;定时初值
           MOV TL1,#0F4H;
           MOV  PCON,#00;波特率为2400
           SETB  TR1;;;;;启动定时器
           MOV SCON,#50H;串口方式1
           MOV R0,#30H;#BLK1;;数据地址指针
           MOV R7,#7;;;数据长度
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    AAA0:  MOV  A,@R0
           ;SWAP  A
           MOV  DPTR,#ADASCII
           MOVC  A,@A+DPTR    ;把数据转换成ASCII显示
           MOV  SBUF,A;@R0;发送一个数据
           ;MOV  A,R6
           ;ADD A,@R0   ;求校验和
           ;MOV  R6,A   ;保存校验和
           INC R0;;;;;;;;数据地址指针加1
    AAA1:  JBC TI,AAA2;;;
           SJMP  AAA1;;;;
    AAA2:  DJNZ R7,AAA0;;数据发送完了吗?
           RET
  ADASCII:  DB  "0","1","2","3","4","5","6","7","8","9",".","V"," "
 ;;HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;;;入口条件:待转换的双字节十六进制整数在R6、R7中。
;;;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;;;;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
    HB2:   CLR A ;BCD码初始化
           MOV R3,A
           MOV R4,A
           MOV R5,A
           MOV R2,#10H ;转换双字节十六进制整数
      HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
           RLC A
           MOV R7,A
           MOV A,R6
           RLC A
           MOV R6,A
           MOV A,R5 ;BCD码带进位自身相加,相当于乘2
           ADDC A,R5
           DA A ;十进制调整
           MOV R5,A
           MOV A,R4
           ADDC A,R4
           DA A
           MOV R4,A
           MOV A,R3
           ADDC A,R3
           MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
           DJNZ R2,HB3 ;处理完16bit
           RET

     ;;; 模数转换(AD)程序.ASM
          ;;;作者  :LYP103
          ;;;入口参数:R0:01H是选通道1,02H是选通道2
      ;;;;;;;返回值  :AD0832(AD的数据),ADOK为0表示AD转化成功,1表示AD转化没成功,通道选择有误
      ;;;;;;; 占用   :A,R7 ,R0 ,AD0832,ADOK
      ;;;;;;;程序要预先定义:AD0832,CLK,CS,DI,DO,ADOK
      AD: SETB  ADOK
          CLR  CLK
          NOP
          CLR  CS        ; 启动转换开始
          NOP
          NOP
          NOP
          NOP
          CJNE    R0,#01H,AD1 ;01
          SETB  DI
          SETB   CLK        ;1
          NOP
          NOP
          CLR    CLK
          NOP
          SETB   DI       ;选通道1(AD1)
          NOP
          SETB   CLK        ;2
          NOP
          NOP
          CLR    CLK
          NOP
          CLR    DI
          NOP
          SETB   CLK        ;3
          NOP
          NOP
          CLR    CLK
          AJMP   AD2
   AD1:   CJNE    R0,#02H,AD1;选通道2(AD2)
           SETB  DI
          SETB   CLK
          NOP
          NOP
          CLR    CLK
          NOP
          SETB   DI
          NOP
          SETB   CLK
          NOP
          NOP
          CLR    CLK
          NOP
          SETB    DI
          NOP
          SETB   CLK
          NOP
          NOP
          CLR    CLK
   AD2:   NOP
          NOP
          NOP
          NOP
          NOP
         ;首次读AD数据,MSB(高位)在前
          MOV  R7,#08H
          clr  a
   AD3:   SETB    CLK
          NOP
          NOP
          CLR     CLK
          NOP
          MOV  C,DO
          RLC  A
          DJNZ  R7,AD3
          MOV  AD0832,A    ;将AD的值保存到AD0832中
          ;;;再次读AD数据,LSB(低位)在前
          MOV  R7,#07H
          MOV  C,DO
          RRC  A
    AD4:  SETB  CLK
          NOP
          NOP
          CLR  CLK
          NOP
          MOV  C,DO
          RRC  A
          DJNZ  R7,AD4
          NOP
          NOP
          SETB  CS      ;结束AD
          mov  ad0832+1,a
          xrl  a,ad0832
          jnz  ad05    ;如2次数据是相等的AD转化成功
          CLR  ADOK
          RET
    AD05: SETB  ADOK
          SETB  CS      ;结束AD
          RET








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -