十年专注单片机方案开发的方案公司英锐恩,分享一个简单的利用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位.