?? f449串口通信編程練習(xí)-06-11-12.s43
字號:
#include "msp430x44x.h"
;********** 2006/11/13
;異步串行通信編程練習(xí)舉例:編一個發(fā)送程序采用9600波特率將0--9數(shù)字發(fā)送出去,
;USART時鐘采用1.048576MHZ,8位字符,不校驗(yàn),串行異步方式通信,不檢錯,
;分別采用查詢方式和中斷方式進(jìn)行發(fā)送
;
;
ORG 0200H
TXD_BUF DS 10 ;定義10個發(fā)送緩存區(qū)單元
TXDP DW 0 ;定義發(fā)送數(shù)據(jù)指針
RXD_BUF DS 10 ;定義10個接收緩存區(qū)單元
RXDP DW 0 ;定義接收數(shù)據(jù)指針
TXD_ST = 0BEH ;定義發(fā)送數(shù)據(jù)起始符
TXD_END = 0EDH ;定義發(fā)送數(shù)據(jù)結(jié)束符
LED = 04H ;LED接P4.2
;------------------------------------------------------------------------------
ORG 01100h ;程序代碼起始地址 Program Start
;------------------------------------------------------------------------------
RESET mov.w #0A00h, SP ;建立堆棧指針 Initialize '449 stackpointer
mov.w #WDTPW+WDTHOLD, &WDTCTL ;關(guān)閉看門狗 Stop WDT
;波特率為9600時使用1.048576MHZ晶振時的串口控制寄存器設(shè)置
MOV.B #SHAR+SWRST, &UCTL0 ;字符長度8位,異步方式
mov.b #SSEL1, &UTCTL0 ; UCLK =SMCLK 使用子時鐘時的串口控制寄存器設(shè)置
mov.b #00h, &UBR10 ;1048576Hz/9600=109.226 高8位為0
mov.b #6Dh, &UBR00 ;1048576Hz/9600=109.226 (109=6DH)低字節(jié)為6DH
mov.b #22H, &UMCTL0 ;或采用教材P213表3.17中的03
MOV.B #0, R5 ;向發(fā)送數(shù)據(jù)區(qū)預(yù)置待發(fā)送的數(shù)據(jù)0--9
MOV.B #9, R4 ;建立計(jì)數(shù)器
MOV #TXD_BUF, R6 ;建立發(fā)送數(shù)據(jù)指針
SET_N MOV.B R5, 0(R6)
INC R6 ;調(diào)整發(fā)送數(shù)據(jù)緩沖區(qū)指針
INC.B R5 ;修改發(fā)送數(shù)據(jù)
DEC.B R4 ;計(jì)數(shù)器減1
JNZ SET_N
MOV.B #TXD_END, 0(R6) ;在發(fā)送數(shù)據(jù)區(qū)的最后一個單元中填如結(jié)束符TXD_END=EDH
;ttttttt發(fā)送、接收控制位和發(fā)送、接收中斷允許控制位見P401附錄2中的ME1和IE1中
bis.b #UTXE0+URXE0, &ME1 ;打開發(fā)送器和接收器
bis.b #UTXIE0, &IE1 ;允許發(fā)送器中斷
bis.b #URXIE0, &IE1 ;允許接收器中斷
bis.b #030h, &P2SEL ;將P2.4,P2.5設(shè)置為串口通信特殊功能
bis.b #010h, &P2DIR ;將P2.4設(shè)置為輸出
TTX BIT.B #UTXIFG0, &IFG1 ;測試發(fā)送器是否準(zhǔn)備好
JZ TTX ;若未準(zhǔn)備好則等待
MOV.B #UART_ST, &TXBUF0 ;在主程序中發(fā)送第1個數(shù)據(jù)(發(fā)起始代碼F0H)
EINT ;打開CPU中斷
Mainloop bis.b #LPM0,SR ; Enter LPM0 進(jìn)入低工耗狀態(tài)
jmp Mainloop ; Do nothing
;------------------------------------------------------------------------------
;可采用查詢方式發(fā)送也可采用中斷方式發(fā)送
;------------------------------------------------------------------------------
MOV #TXD_BUF, R6 ;建立發(fā)送數(shù)據(jù)指針
TX0 BIT.B #UTXIFG0, &IFG1 ;測試發(fā)送器是否準(zhǔn)備好,發(fā)送器準(zhǔn)備好標(biāo)志在P401附錄2中的IFG1中
JZ TX0 ;若未準(zhǔn)備好則等待
MOV.B @R6+, &TXBUF0 ;若已準(zhǔn)備好則將待發(fā)數(shù)據(jù)傳送到發(fā)送器緩沖器即可發(fā)送出去
CMP.B #TXD_END, &TXBUF0 ;采用查詢方式發(fā)送時在這里判斷是否為發(fā)送結(jié)束碼EDH
JNZ TX0 ;若采用中斷方式發(fā)送時應(yīng)在中斷服務(wù)程序中判斷是否為發(fā)送完
END
;******采用中斷方式進(jìn)行發(fā)送
;TXD_ST = 0BEH
;TXD_END = 0EDH
TXD_INT ;發(fā)送中斷服務(wù)子程序
MOV.B @R6+, &TXBUF0 ;發(fā)送1個數(shù)據(jù)數(shù)據(jù)
MOV R4, &TXDP
CMP.B #TXD_END, &TXBUF0 ;判斷是否為結(jié)束碼FFH
JNZ TX_END
MOV #TXD_BUF, R6 ;發(fā)送數(shù)據(jù)指針復(fù)位
BIC.B #UTXIE0, &IE1 ;關(guān)閉發(fā)送中斷
BIC.B #UTXE0, &ME1 ;關(guān)閉發(fā)送器
;BIS.B #URXE0, &ME1 ;打開接收器
;BIS.B #URXIE0, &IE1 ;允許接收中斷
;MOV #RXD_BUF, &RXDP ;建立接收數(shù)據(jù)指針
TX_END
RETI
;------------------------------------------------------------------------------
; Interrupt Vectors Used MSP430x44x
;------------------------------------------------------------------------------
ORG 0FFFEh ;復(fù)位中斷向量
DW RESET ;
ORG 0FFF0h ;發(fā)送中斷向量
DW TXD_INT ;
ORG 0FFF2h ;接收中斷向量
DW TXD_INT ;
ORG 0FFEEh ; ADC12 Interrupt Vector
DW AD12_INT ;
END
;SSSSSSSSSSSSSSSSS使用外接8MHZ晶振時的系統(tǒng)時鐘模塊初始化程序
SetupOSC bic.b #XT2OFF, &FLL_CTL1 ; Enable XT2 OSC
SetupOsc bic.b #XT2OF, &FLL_CTL0 ; Clear XT2 OSC fault flag
bit.b #XT2OF, &FLL_CTL0 ; XT2 OSC fault flag set?
jnz SetupOsc ; OSC Fault, clear flag again
bic.b #OFIFG, &IFG1 ; Safe, clear OSC fault flag
bis.b #SELM_XT2+SELS, &FLL_CTL1 ; MCLK = XT2 #SELM1
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
MOV.B #SHAR+SWRST, &UCTL0 ;字符長度8位,異步方式
MOV.B #SSEL1, &UTCTL0 ;選擇SMCLK作為時鐘源
MOV #833, &RAM1 ; 8MHZ/9600=833.333
MOV.B &RAM1, &UBR00 ;將833轉(zhuǎn)換成16進(jìn)制數(shù)送波特率分頻系數(shù)寄存器
MOV.B &RAM1+1, &UBR10
MOV.B #49H, &UMCTL0 ;01001001=49H波特率分頻微調(diào)系數(shù)(即0.333X8=2.664取近似值3)
;即每個字節(jié)(8位)的分頻系數(shù)中有3個分頻系數(shù)要加1,這里取49H即為
;在發(fā)送每個字節(jié)的D6、D3、D0位時(應(yīng)盡可能均勻分布)其波特率分
;頻系數(shù)為834而其余5個系數(shù)用833,這樣可減少波特率的累計(jì)誤差
;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEND
ADC_WD ;MOV &ADC10MEM, R12 ;讀出溫度值送R12
CALL #Trans2TempC ;調(diào)用將溫度轉(zhuǎn)換為攝氏溫度子程序
CALL #BIN2BCD5 ;調(diào)用將溫度轉(zhuǎn)換為BCD碼子程序
MOV R13, &TEMP ;轉(zhuǎn)存到溫度存放單元
MOV.B &TEMP, &TX_DAT+1 ; &VOLT
BIS.B #0B0h, &P3SEL ;設(shè)置P3.4,P3.5為TXD和RXD,P3.7為ADC通道7
BIC #ENC, &ADC10CTL0 ;A/D模塊設(shè)置前應(yīng)先將ADC10CTL0中的轉(zhuǎn)換使能位ENC置0!!
BIS.B #80H, &ADC10AE ;允許扭矩模擬信號從P3.7輸入(ADC10AE_7)
MOV #INCH_7+ADC10DIV_4+ADC10SSEL_2+CONSEQ_0, &ADC10CTL1 ;扭矩輸入為A7、ADC10CLK/8
MOV #SREF_5+ADC10SHT_3+ADC10SR+REFON+ADC10ON+ADC10IE, &ADC10CTL0 ;
;1.5V參考電壓(+REF2_5V),允許中斷,單通道單次轉(zhuǎn)換時ADC10CTL0中的MSC應(yīng)為0
ADC_END BIS #ENC+ADC10SC, &ADC10CTL0 ;重新啟動采樣與轉(zhuǎn)換
POP R14
POP R5
RETI
;TTTTTTTTTTT溫度變換子程序: Trans2TempC
;Subroutine coverts R12 = ADC10MEM/1024*423-274
;oC =((x/1024)*1500mV)-986mV)*1/3.55mV = x*423/1024 - 274 (應(yīng)為277.75)
; =(1500X-1009664)/3635.2=1500X/3635.2-277.75=0.4126X-277.75
;Input: ADC10MEM 0000 - 0FFFh, R11, R12, R14, R15 working register
;Output: R12 0000 - 091h, 1500mV為A/D的參考電壓
;-------------------------------------------------------------------
Trans2TempC mov.w &ADC10MEM, R12 ;
mov.w #423, R11 ; C
call #MPYU1 ;
bic.w #00FFh, R14 ; /1024
add.w R15, R14 ;
swpb R14 ;
rra.w R14 ;
rra.w R14 ;
;mov.w R14, R12 ;
sub.w #278, R14 ; #274, R12
ret ;
;--------------------------------------------------------------------
;++++++雙字節(jié)(16位)二進(jìn)制數(shù)轉(zhuǎn)換成5位BCD碼子程序(該算法使用十進(jìn)制運(yùn)算指令)
;入口參數(shù):R14,出口參數(shù):R14和R13,其中BCD碼的最高位在R14的低4位
BIN2BCD5 ;MOV #0FFFFH, R14 ;測試指令 R12
MOV #16, R15 ;建立計(jì)數(shù)器
CLR R13 ;BCD碼單元清0 R12
B1 RLA R14 ;二進(jìn)制數(shù)左移1位,將移出位通過進(jìn)位位
DADD R13, R13 ;加到十進(jìn)制單元并進(jìn)行十進(jìn)制乘2計(jì)算
JNC B2
INC R14 ;BCD碼高位(萬位)加1 R14
B2 DEC R15 ;計(jì)數(shù)器減1
JNZ B1 ;若不為0則繼續(xù)
RET ;
;-----部分積右移方式計(jì)算16位乘法,入口參數(shù):被乘數(shù)為R11,乘數(shù)為R12,積的高16位為R15,低16位為R14
MPYU1 ;MOV #1234, R11 ;這兩條指令調(diào)試時使用
;MOV R9, R12 ;
CLR R15 ;積清0
CLR R14
MOV.B #16, R10 ;建立計(jì)數(shù)器
CLRC
;MOV #05H, R12
M1 RRC R12 ;乘數(shù)右移1位
JNC RR1
ADD R11, R15
RR1 RRC R15
RRC R14
DEC.B R10
JNZ M1
RET
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -