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

📄 sample.s43

📁 这是本人编的基于MSP430CPU的远程测量各种参数的程序
💻 S43
📖 第 1 页 / 共 2 页
字号:
;*********************************************
;遥控遥测程序VER.1
;*********************************************
#include "MSP430X14X.H"
#define     DI          BIT0
#define     RW          BIT1
#define     EN          BIT2
#define     CS1         BIT3
#define     CS2         BIT4
#define     ELD         BIT5
#define     RST         BIT6
#define     LED         BIT7
#define     URTS        BIT3
#define     ADCDATA     0X0200
#define     DATAPOINT   0X0210
#define     FLAG        0X0212
#define     TIMEDUE     BIT0
#define     TIMEDUE2    BIT1
#define     FIRSTDATA   BIT2
#define     URXOVERTIME BIT3
#define     TRANSFER    BIT4
#define     TIME0       0X0214
#define     TIME1       0X0216
#define     URXTIME     0X0218
#define     URXDATAPOINT  0X021A
#define     UARTTABLE   0X0300
#define     UARTSAVED   0X0400

        ORG 0FFFEH
        DW RESET
        ORG 0FFEEH
        DW RESET
	DW RESET
	ORG 0FFF2H
	DW UARTINT
	ORG 0FFF4H
	DW RESET
	DW RESET
	DW RESET
	DW RESET
	DW RESET
	ORG 0FFECH
        DW INTTA
        ORG 0FFE4H
	DW RESET
	DW RESET
	DW RESET
	DW RESET
        ORG 0FFE2H
        DW INTP2
        
        ORG 0E000H
RESET   MOV #0A00H,SP
        MOV.B #0E0H,&DCOCTL
        MOV.B #84H,&BCSCTL1
        MOV.B #00H,&BCSCTL2               ;设置主频1.124M
        CALL #INITIAL
	MOV #0100H,R7
	MOV @R7,R8			;将信息段中的指针读入R8
	XOR R8,#0FFFFH			;若R8=0FFFFH,说明第一次启动,不修改DATAPOINT
	JZ LOOP6
	MOV 0(R7),&DATAPOINT		;否则,恢复DATAPOINT
LOOP6
        BIC.B #URXIFG0,&IFG1
        BIS.B #URXIE0,&IE1                ;开接收中断
        BIS #MC0,&TACTL                   ;开定时器,四毫秒中断一次
;        CALL #ADCPRO
        CALL #LCDLPRO                     ;LCD左屏刷新
        BIS #FIRSTDATA,&FLAG
        EINT
LOOP1
        BIT #TIMEDUE,&FLAG                ;判断数据刷新时间到?
        JZ LOOP2
        BIC #TIMEDUE,&FLAG                ;清标志
        CALL #LCDRPRO   
LOOP2
        BIT #TIMEDUE2,&FLAG               ;判断两分钟时间到?
        JZ LOOP0
        BIC #TIMEDUE2,&FLAG
        MOV &DATAPOINT,R14
        AND #01FFH,R14
        JNZ LOOP4                         ;判断指针指向块首?
        MOV &DATAPOINT,R15
        CALL #ERASESEG                    ;是,擦除块          
LOOP4
        CALL #WRSEG                       ;将缓存数据放入FLASH
        MOV &DATAPOINT,R14
        XOR #0E000H,R14
        JNZ LOOP5
        MOV #2000H,&DATAPOINT
LOOP5
        CALL #LCDLPRO
LOOP0
        BIT #URXOVERTIME,&FLAG 
        JZ LOOP1
        CMP #0,&UARTSAVED
        JZ LOOP1
        CALL #UARTPRO
        CLR &UARTSAVED
        JMP LOOP1     
          

;----------------------------------------------------
;初始化子程序INITIAL
;----------------------------------------------------
INITIAL
        MOV #WDTPW+WDTHOLD,&WDTCTL        ;关WDT        
        CLR SR
        MOV.B #0E0H,&DCOCTL
        MOV.B #84H,&BCSCTL1
        MOV.B #00H,&BCSCTL2               ;设置主频1.124M
        CLR.B &P2DIR
        MOV.B #01H,&P2IE
        MOV.B #01H,&P2IES
        CLR.B &P2SEL                      ;P2.0,P2.1脚下降沿中断
        MOV.B #30H,&P3SEL                 ;P3.4,P3.5外围模块功能
        BIC.B #URTS,&P3OUT
        MOV.B #0DFH,&P3DIR
        CLR.B &P4DIR
        CLR.B &P4SEL                      ;P4输入
        MOV.B #10000000B,&P5OUT
        MOV.B #0FFH,&P5DIR
        CLR.B &P5SEL                      ;P5输出
        MOV.B #0,&P1OUT
        MOV.B #0FFH,&P1DIR
        CLR.B &P1SEL                      ;P1输出        
        CLR.B &P6DIR
        MOV.B #0FFH,&P6SEL                ;P6转换输入
        MOV #0100H,&TACTL                 ;选择ACLK,禁止TAIFG中断,定时器暂停
        CLR &TAR
        MOV #0010H,&CCTL0
        CLR &CCTL1
        CLR &CCTL2      
        MOV #128,&CCR0                    ;设置定时器A四毫秒中断一次
        CLR.B &CACTL1                     ;关比较器
;        MOV.B #PENA+PEV+CHAR+SWRST,&U0CTL ;偶校验\8位数据
        MOV.B #CHAR+SWRST,&U0CTL          ;无偶校验\8位数据        
        MOV.B #SSEL0,&U0TCTL              ;选择ACLK时钟
        BIS.B #URXEIE,&U0RCTL             ;所有字符使能标志位URXIFG
        CLR.B &U0BR1
        MOV.B #6,&U0BR0
        MOV.B #6FH,&U0MCTL
        BIC.B #SWRST,&U0CTL
        MOV.B #URXE0+UTXE0,&ME1           ;UART接收可中断
        BIC #ENC,&ADC12CTL0
        MOV #88F0H,&ADC12CTL0
        MOV #0202H,&ADC12CTL1
        MOV.B #10H,&ADC12MCTL0
        MOV.B #11H,&ADC12MCTL1
        MOV.B #12H,&ADC12MCTL2
        MOV.B #13H,&ADC12MCTL3
        MOV.B #14H,&ADC12MCTL4
        MOV.B #15H,&ADC12MCTL5
        MOV.B #16H,&ADC12MCTL6
        MOV.B #17H,&ADC12MCTL7
        MOV.B #9AH,&ADC12MCTL8
        CLR &ADC12IFG
        CLR &ADC12IE                      ;ADC设置
        MOV #2000H,&DATAPOINT             ;当前数据指针=2000H
        CLR &FLAG
        CLR &TIME0
        CLR &TIME1
        CLR &URXTIME
        CLR &UARTSAVED
        MOV #UARTSAVED,&URXDATAPOINT
        CLR.B &P2IFG        
        RET
        
;----------------------------------------------------
;串行通讯接收中断程序UARTINT
;----------------------------------------------------
UARTINT
        MOV #WDTPW+WDTHOLD,&WDTCTL        ;关WDT
        PUSH R15
        CMP #0,&UARTSAVED
        JNZ UARTINT0
        MOV #UARTSAVED,&URXDATAPOINT
UARTINT0        
        MOV &URXDATAPOINT,R15
        BIC.B #URXIFG0,&IFG1
        MOV.B &U0RXBUF,0(R15)
        INC &URXDATAPOINT
        CLR &URXTIME
        BIC #URXOVERTIME,&FLAG
        POP R15
        RETI        

        
;----------------------------------------------------
;四毫秒定时中断程序INTTA
;----------------------------------------------------
INTTA
        MOV #WDTPW+WDTHOLD,&WDTCTL        ;关WDT
        PUSH R5
        PUSH R6
        PUSH R7
        BIT #URXOVERTIME,&FLAG
        JNZ INTTA3
        INC &URXTIME
        CMP #125,&URXTIME
        JL INTTA3
        BIS #URXOVERTIME,&FLAG
INTTA3
        CALL #ADCPRO                      ;进行ADC采样
        MOV #8,R5
        MOV #ADC12MEM0,R6
        MOV #ADCDATA,R7
        BIT #FIRSTDATA,&FLAG
        JZ INTTA1
        BIC #FIRSTDATA,&FLAG
INTTA2
        MOV @R6+,0(R7)
        INCD R7
        DEC R5
        JNZ INTTA2                         ;是第一个数据,只保存
        JMP INTTA0
INTTA1
        ADD @R6+,0(R7)
        CLRC
        RRC 0(R7)
        INCD R7
        DEC R5
        JNZ INTTA1                        ;否则,进行平均处理
INTTA0        
        INC &TIME0
        CMP #128,&TIME0
        JL INTTAEND
        CLR &TIME0
        BIS #TIMEDUE,&FLAG                ;0.5s LCD刷新一次
        INC &TIME1
        CMP #20,&TIME1
        JL INTTAEND
        CLR &TIME1
        BIS #TIMEDUE2,&FLAG
INTTAEND
        POP R7
        POP R6
        POP R5
        RETI

;----------------------------------------------------
;键处理中断程序INTP2
;----------------------------------------------------
INTP2
        MOV #WDTPW+WDTHOLD,&WDTCTL        ;关WDT
        CALL #DELAY20MS
        BIT.B #BIT0,&P2IN
        JNZ INTP2LOOP
        XOR.B #ELD,&P5OUT
        JMP INTP2END
INTP2LOOP
        BIT.B #BIT1,&P2IN
        JNZ INTP2END
;        XOR #ADCOFF,&FLAG
;        BIT #ADCOFF,&FLAG
;        JZ INTP2LOOP1
;        BIS.B #LED,&P5OUT
;        JMP INTP2END
;INTP2LOOP1
;        BIC.B #LED,&P5OUT
INTP2END
        BIT.B #0FFH,&P2IN
        JZ INTP2END
        CALL #DELAY20MS
        CLR.B &P2IFG
        RETI                        

;----------------------------------------------------
;异步串行口处理子程序UARTPRO
;----------------------------------------------------
UARTPRO
        DINT
        MOV #UARTSAVED,R15
        CMP.B #0FEH,0(R15)
        JNZ UARTPROEND                ;前导出错退出
        MOV #5,R5
UARTPROLOOP
        CMP.B #68H,0(R15)
        JZ UARTPRO1
        INC R15
        DEC R5
        JNZ UARTPROLOOP
        JMP UARTPROEND                ;帧起始符错退出
UARTPRO1
        INC R15
        MOV.B @R15+,R5
        SWPB R5
        MOV.B @R15+,R12
        BIS R12,R5                   
        MOV.B @R15+,R6
        SWPB R6
        MOV.B @R15+,R12
        BIS R12,R6
        MOV.B @R15+,R7
        SWPB R7
        MOV.B @R15+,R12
        BIS R12,R7
        CALL #CORRECTION
        MOV R8,R13                    ;获得帧长,放于R13中
        MOV R15,R14                   ;获得循环起始地址,放于R14中
                        
        MOV R14,R12
        ADD R13,R12
        ADD R13,R12
        ADD R13,R12
        CMP.B #16H,0(R12)
        JNZ UARTPROEND                ;帧结束符错退出
        MOV R13,R12
        MOV R14,R15
UARTPROLOOP3
        MOV R15,R9
        MOV.B @R9,R5
        ADD R13,R9
        MOV.B @R9,R6
        ADD R13,R9
        MOV.B @R9,R7
        CALL #CORRECTION
        MOV.B R8,0(R15)
        INC R15
        DEC R12
        JNZ UARTPROLOOP3              ;纠错处理
        MOV R14,R12
        MOV R13,R5
        DEC R5
        CLR R6
UARTPROLOOP1
        XOR.B @R12+,R6 
        DEC R5
        JNZ UARTPROLOOP1
        CMP.B @R12,R6
        JNZ UARTPROEND                ;纵向校验出错退出
        CMP.B @R14,&P4IN              ;目标地址=本设备地址?
        JZ UARTPRO2
        CMP.B #0,2(R14)               ;判断需要中转?
        JZ UARTPROEND
        MOV.B 3(R14),R5
        MOV R14,R12
        ADD R5,R12
        CMP.B 4(R12),&P4IN
        JZ UARTPRO3                   ;需要中转   
UARTPROEND
        BIC #TRANSFER,&FLAG
        EINT
        RET
UARTPRO2
        MOV.B @R14,R7
        MOV.B 1(R14),0(R14)
        MOV.B R7,1(R14)                 ;DA,SA交换
        MOV R14,R15
        ADD R13,R15                     ;R15放指令地址
        DEC R15
        DEC R15
        CMP.B #02H,0(R15)
        JNZ UARTPRO4
        MOV.B #03H,0(R15)               ;实时数据回传
        MOV R13,R7 
        ADD #48,R7
UARTPRO20                       
        MOV R14,R12
        SUB #6,R12
        MOV.B R7,1(R12)
        SWPB R7
        MOV.B R7,0(R12)
        MOV.B R7,2(R12)
        SWPB R7
        MOV.B R7,3(R12)
        MOV.B R7,5(R12)
        SWPB R7
        MOV.B R7,4(R12)                 ;修改帧长        
        CMP.B #0,2(R14)
        JZ UARTNEXT1
        MOV.B 2(R14),R12
        CLR.B 3(R14)                    ;CC=0
        MOV R14,R11
        MOV #UARTTABLE,R10
UARTNEXT2
        MOV.B 4(R11),0(R10)
        INC R10
        INC R11
        DEC R12
        JNZ UARTNEXT2
        MOV.B 2(R14),R12
        DEC R10
        MOV R14,R11
UARTNEXT3
        MOV.B @R10,4(R11)
        DEC R10
        INC R11
        DEC R12
        JNZ UARTNEXT3                   ;TABLE反转
UARTNEXT1                
        MOV #UARTSAVED,R6
UARTPRO22
        CMP R6,R14
        JZ UARTPRO23
        BIT.B #TXEPT,&U0TCTL
        JZ $-4
        MOV.B @R6+,&U0TXBUF
        JMP UARTPRO22
UARTPRO23
        MOV #3,R6
        DEC R13        
UARTPRO25
        CLR R8
        PUSH R13
        PUSH R14
UARTPRO24
        BIT.B #TXEPT,&U0TCTL
        JZ UARTPRO24
        MOV.B @R14,&U0TXBUF
        XOR.B @R14,R8
        BIT.B #TXEPT,&U0TCTL
        JZ $-4        
        INC R14
        DEC R13
        JNZ UARTPRO24
        BIT #TRANSFER,&FLAG
        JNZ UARTPRO28
        CMP.B #3,0(R15)
        JNZ UARTPRO21
        MOV #32,R5        
UARTPRO26
        MOV.B #0,&U0TXBUF        
        BIT.B #TXEPT,&U0TCTL
        JZ $-4 
        DEC R5
        JNZ UARTPRO26
        MOV #16,R5
        MOV #ADCDATA,R7                
UARTPRO27
        MOV.B @R7,&U0TXBUF        
        BIT.B #TXEPT,&U0TCTL
        JZ $-4
        XOR.B @R7,R8
        INC R7         
        DEC R5
        JNZ UARTPRO27                       
UARTPRO28
        MOV.B R8,&U0TXBUF        
        POP R14
        POP R13
        DEC R6
        JNZ UARTPRO25     
        BIT.B #TXEPT,&U0TCTL
        JZ $-4
        MOV.B #16H,&U0TXBUF
        JMP UARTPROEND        
UARTPRO21
        CMP.B #9,0(R15)        
        JZ UARTPRO28
        CMP.B #5,0(R15)
        JNZ UARTPROEND
        MOV #0C000H,R7
        MOV &DATAPOINT,R5
UARTPRO55
        CMP #2000H,R5
        JNZ UARTPRO56
        MOV #0E000H,R5
UARTPRO56
        DEC R5
        MOV.B @R5,&U0TXBUF
        XOR.B @R5,R8
        BIT.B #TXEPT,&U0TCTL
        JZ $-4        
        DEC R7
        JNZ UARTPRO55                
        JMP UARTPRO28      
      
UARTPRO4
        CMP.B #08H,0(R15)
        JNZ UARTPRO5
        MOV.B #09H,0(R15)               ;通道链路测试
        JMP UARTNEXT1
UARTPRO5
        CMP.B #04H,0(R15)
        JNZ UARTPROEND
        MOV.B #05H,0(R15)               ;历史数据回传
        MOV R13,R7 
        ADD #0C000H,R7
        JMP UARTPRO20
UARTPRO3
        INC.B 3(R14)
        BIS #TRANSFER,&FLAG
        JMP UARTNEXT1                   ;中转处理
                                                        
                
;----------------------------------------------------
;纠错子程序CORRECTION,R5、R6、R7为被纠错字节,R8为正确字节
;----------------------------------------------------
CORRECTION
        MOV R6,R8
        BIS R5,R8           ;Y0=R8

⌨️ 快捷键说明

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