技术热线: 4007-888-234

一个简单的利用PC机的串口读取ICD1板上AD0电压的程序

更新时间: 2019-03-23
阅读量:2552

十年专注单片机方案开发的方案公司英锐恩,分享一个简单的利用PC机的串口读取ICD1板上AD0电压的程序。英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。

用的是PIC16F877A单片机来调试的,下面是PIC的ASM文件,由于是用于其它的目的,用在这里有些代码是多余的!
;
;用于串口实验的程序,主要的是10位
;
  INCLUDE
  LIST P=16F877

BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1                   ;体3
ENDM
BANK2 MACRO
BCF STATUS,RP0;
BSF STATUS,RP1                   ;
ENDM                             ;
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1                   ;
ENDM
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1                   ;体0

ENDM

READCUNT    EQU   70H             ;
COUNT1      EQU   72H             ;
TEMP        EQU   73H             ;
FEIFA       EQU   74H             ;
TEMP1       EQU   75H             ;
TEMP2       EQU   76H             ;
CNT         EQU   77H             ;
SOU         EQU   78H             ;
SOUH        EQU   79H             ;
RLT         EQU   7AH             ;
TEMP3       EQU   7BH;

   ORG   0000H                    ;
   NOP                            ;
   GOTO  STATUP                   ;主要程序的入口
   ORG   004H                     ;中断的入口

HIGHISR  
   BTFSS    PIR1,RCIF     ;判断是否为USART中断
   RETFIE                 ;不是中断返回
   MOVF     RCREG,0       ;取RCREG的数值到W中,同时RCIF变为零
   MOVWF    TEMP2         ;暂时保存W中的数值用于下个转换时用A
   SUBLW    41H           ;是否为回车,这个指令是取电压指令,对应键盘上的回车
   BTFSS    STATUS,Z      ;
   GOTO     FEEDBACK;NEXT1         ;不是;目前的处理是出错时返回原来的数值
   CALL     DYZH          ;是CALL 电压转换
   RETFIE
;   GOTO     FEEDBACK      ;
;   BTFSS    FEIFA,0       ;
;  GOTO     CALL1;
;   GOTO     CALL2;
NEXT1;
    MOVF    TEMP2,0         ;
    SUBLW   44H            ;温度1的判断,对应键盘上的D
    BTFSS   STATUS,Z       ;
    RETFIE                 ;也不是那就中断返回

  CALL    WDZH1          ;
    RETFIE                 ;转换完成就返回中断
CALL1  
   CLRF     COUNT1;
   CALL     TABLE
   GOTO     EXIT;
CALL2
   MOVLW    D'26';
   MOVWF    COUNT1;
   CALL     TABLE;
EXIT
   CLRF     READCUNT;
   CLRF     FEIFA;
   RETFIE;
FEEDBACK
   MOVF    RCREG,0;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   MOVWF   TXREG;
   RETFIE;;;
   MOVF    READCUNT,0;
   CALL    READ2;
   INCF    READCUNT,1;
   SUBWF   RCREG,0;
   BTFSC   STATUS,Z;

  RETFIE;
   BSF     FEIFA,0;
   RETFIE;

;
TABLE
LOOP
    MOVF   COUNT1,0
    CALL   READ1;
    MOVWF  TEMP;
GETDATA  
    BTFSS  PIR1,TXIF;
    GOTO   GETDATA;
    MOVWF  TXREG;
    INCF   COUNT1,1;
    MOVF   TEMP,0;
    BTFSS  STATUS,Z;
    GOTO   LOOP;
    RETURN;

READ1
   ADDWF   PCL,1;
   RETLW   A'\N';
   RETLW   A'\R';
   RETLW   A'M';

 RETLW   A'Y';
   RETLW   A' ';
   RETLW   A'N';
   RETLW   A'A';
   RETLW   A'M';
   RETLW   A'E';
   RETLW   A' ';
   RETLW   A'I';
   RETLW   A'S';
   RETLW   A' ';
   RETLW   A'P';
   RETLW   A'I';
   RETLW   A'C';
   RETLW   A'1';
   RETLW   A'6';
   RETLW   A'F';
   RETLW   A'8';
   RETLW   A'7';
   RETLW   A'7';

 RETLW   A'.';      
   RETLW   A'\N';
   RETLW   A'\R';
   RETLW   0
READ
   RETLW   A'N';
   RETLW   A'R';
   RETLW   A'E';
   RETLW   A'R';
   RETLW   A'R';
   RETLW   A'O';
   RETLW   A'R';
   RETLW   A'!';
   RETLW   A'\N';
   RETLW   A'\R';
   RETLW   0

READ2
   ADDWF   PCL,1;
   RETLW   A'W';
   RETLW   A'H';
   RETLW   A'A';
   RETLW   A'T';

RETLW   A' ';
   RETLW   A'I';
   RETLW   A'S';
   RETLW   A' ';
   RETLW   A'Y'
   RETLW   A'O';
   RETLW   A'U';
   RETLW   A'R';
   RETLW   A' ';
   RETLW   A'N';
   RETLW   A'A';
   RETLW   A'M';
   RETLW   A'E';
   RETLW   A'?';

STATUP                   ;这边是程序的初始化
   BANK1                 ;选体1
   BSF    TRISC,6        ;
   BSF    TRISC,7        ;
   BCF    TRISC,0        ;
   MOVLW  D'12'          ;

MOVWF  SPBRG          ;
   MOVLW  B'00100100'    ;24H
   MOVWF  TXSTA          ;
   BSF    PIE1,RCIE      ;
   MOVLW  0FFH           ;
   MOVWF  TRISA          ;设置RA口为输入
   MOVLW  B'10000010'    ;设置为AD0进入转换,基准电压为VDDANDVSS,右对齐方式,结果是ADRESH 高.ADRESL 低,
   MOVWF  ADCON1         ;RA0,1,2,3,4,是AD口,RE2,1,0是数字口
   BANK0                 ;恢复体0
   MOVLW   35H           ;
   MOVWF   T1CON         ;
   MOVLW   B'10010000'   ;
   MOVWF   RCSTA         ;
   BSF     INTCON,GIE    ;
   BSF     INTCON,PEIE   ;
   CLRF    READCUNT      ;
   CLRF    FEIFA         ;
MAIN
;
;   call    dyzh
;   goto    $
   CLRWDT                ;
   BTFSS   PIR1,TMR1IF   ;
   GOTO    MAIN          ;
   BCF     PIR1,TMR1IF   ;

MOVLW   B'00000001'   ;
   XORWF   PORTC,1       ;
   GOTO    MAIN          ;
;*******************************************************************
;这个是电压转换
DYZH;电压转换程序
   MOVLW  B'01000001'    ;SELECT AD0,OPEN AD;
   MOVWF  ADCON0         ;
   BSF    ADCON0,GO      ;GO Bit是自动清零
   BTFSS  PIR1,ADIF      ;
   GOTO   $-1            ;
   MOVF   ADRESH,0       ;
   MOVWF  SOUH           ;
   BANK1                 ;
   MOVF   ADRESL,0       ;
   MOVWF  SOU            ;
   BANK0                 ;
;   MOVLW  32H;

;   MOVWF  SOU;
;   MOVLW  48H;
;   MOVWF  SOUH;
   CALL   DBTBCD         ;已经是转换完成
   CALL   BCDTX          ;CALL BCD码发送
   RETURN                ;
  
      

WDZH1;温度1的转换
   MOVLW  B'01001001' ;
   MOVWF  ADCON0      ;
   BSF    ADCON0,GO   ;
   BTFSS  PIR1,ADIF   ;
   GOTO   $-1         ;
   CALL   DBTBCD      ;
   CALL   BCDTX       ;
   RETURN;
;


;********************DBTBCD********************
;本程序实现双字节二进制数转化为3字节压缩BCD码。
;入口参数:原二进制数在SOUH:SOU中。
;出口参数:结果在RLT:SOUH:SOU中。
;占用资源:W,STATUS,FSR,023H,024H,025H,026H,028H,029,02AH,两重堆栈。

DBTBCD      MOVF        SOU,W
            MOVWF       TEMP2
            MOVF        SOUH,W
            MOVWF       TEMP3
            CLRF        SOU
            CLRF        SOUH
            CLRF        RLT
            BCF         STATUS,C
            MOVLW       .16
            MOVWF       CNT
LOOPC1      RLF         TEMP2,F
            RLF         TEMP3,F
            RLF         SOU,F
            RLF         SOUH,F
            RLF         RLT,F
            DECFSZ      CNT,F
            GOTO        ADJDEC1        
            RETURN           ;整个子程序结束

ADJDEC1     MOVLW       SOU
            MOVWF       FSR
            CALL        ADJBCD1     ;调整RLT
            MOVLW       SOUH
            MOVWF       FSR
            CALL        ADJBCD1     ;调整RLTH
            MOVLW       RLT
            MOVWF       FSR
            CALL        ADJBCD1     ;调整TEMP1
            GOTO        LOOPC1
;********************调整BCD********************
ADJBCD1     MOVLW       03H
            ADDWF       INDF,W      ;低四位加3
            MOVWF       TEMP1       ;暂存
            BTFSC       TEMP1,3     ;结果大于7,
            MOVWF       INDF        ;则存起来
            MOVLW       30H
            ADDWF       INDF,W      ;高四位加3
            MOVWF       TEMP1              
            BTFSC       TEMP1,7     ;结果大于7,
            MOVWF       INDF        ;则存起来

    RETURN
;**********************************
;结果的顺序是RLT SOUH SOU
BCDTX;
   SWAPF   RLT,0;
   ANDLW   0FH;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   CALL    READASC;
   MOVWF   TXREG;
   MOVF    RLT,0;
   ANDLW   0FH;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   CALL    READASC;
   MOVWF   TXREG              ;这个是发送完RLT字节
   SWAPF   SOUH,0;
   ANDLW   0FH;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   CALL    READASC;
   MOVWF   TXREG;
   MOVF    SOUH,0;

ANDLW   0FH;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   CALL    READASC;
   MOVWF   TXREG              ;这个是发送完SOUH字节
   SWAPF   SOU,0;
   ANDLW   0FH;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   CALL    READASC;
   MOVWF   TXREG;
   MOVF    SOU,0;
   ANDLW   0FH;
   BTFSS   PIR1,TXIF;
   GOTO    $-1;
   CALL    READASC;
   MOVWF   TXREG                 ;这个是发送完SOU字节
   BTFSS   PIR1,TXIF             ;

GOTO    $-1                   ;
;   MOVLW   A'\N';
;   MOVWF   TXREG;
;   BTFSS   PIR1,TXIF;
;   GOTO    $-1;
;   MOVLW   A'\R';
;   MOVWF   TXREG;
;   MOVLW    00H                  ;这个是用来换行的00H
;  CALL     READ3                ;
;   MOVWF    TXREG                ;
;   BTFSS    PIR1,TXIF            ;
;   GOTO     $-1                  ;
;   MOVLW    01H                  ;01H
;   CALL     READ3                ;
;  MOVWF    TXREG                ;
   RETURN                        ;返回

READASC
    ADDWF   PCL,1;
    RETLW   A'0';
    RETLW   A'1';
    RETLW   A'2';
    RETLW   A'3';
    RETLW   A'4';

RETLW   A'5';
    RETLW   A'6';
    RETLW   A'7';
    RETLW   A'8';
    RETLW   A'9';
READ3                             ;
    ADDWF    PCL,1                ;
    RETLW    A'\n'                ;
    RETLW    A'\r'                ;

   END;

实验时,串口配置波特率要选择19200,数据位是8位,校验位是N,停止位是1.就可以,调节ICD1板上的电压就可以在程序中显示出来,分辨率是10位.