📄 asm.s43
字号:
//基于MSP430 DEMO板的测温程序,使用DS18B20温度传感器,平台是IAR Embedded Workbench IDE
#include "msp430x22x4.h"
NAME main
PUBLIC main
ORG 0FFFEh
DC16 main
RSEG CODE
main MOV.W #0600H,SP ;设置堆栈指针
stopWDT MOV.W #WDTPW+WDTHOLD,&WDTCTL ;关看门狗
MOV.B &CALBC1_1MHZ,&BCSCTL1 ;设定DCO为1MHZ
MOV.B &CALDCO_1MHZ,&DCOCTL ;
call #get_temp
mainloop
nop
jmp mainloop
;----------------------------------------------------------
get_temp
dint ;禁止一切中断
call #int
mov.b #0cch,r15 ;跳过ROM
call #write_byte
mov.b #044h,r15
call #write_byte
call #int ;温度转换完全,再次初始化
mov.b #0cch,r15 ;跳过ROM
call #write_byte
mov.b #0beh,r15 ;送入温度暂存器
call #write_byte
call #read_word ;读字,数据存于r12
eint
ret
;-----------------------------------------------------------------
int mov.b #01h,&P2DIR ;通信数据线设为P2.0
bic.b #01h,&P2OUT
mov #150,r4
delay dec r4 ;>480us, t=600us
nop
jnz delay
bis.b #01h,&P2OUT
nop
mov #15,r4
delay1 dec r4 ;上升沿后15~60us DS18B20响应,等待60us
nop
jnz delay1
bic.b #01h,&P2DIR ;释放总线并进入接收状态
bit.b #01h,&P2IN ;ds18b20回复存在脉冲60~240us
jnz delay
mov #48,r4 ;480us
delay2 bit.b #01h,&P2IN
jz int_end
dec r4
nop
jnz delay2
jmp delay
int_end mov #120,r4 ;480us
delay3 dec r4
nop
jnz delay3
ret
;--------------------------------------------
write_byte mov #8,r5 ;循环计数
wr bis.b #01h,&P2DIR
bis.b #01h,&P2OUT
mov #2,r4
bic.b #01h,&P2OUT
delay4 dec r4
nop
jnz delay4 ;复位保持8us<15us
mov.b r15,&P2OUT
rrc r15
mov #10,r4
delay5 dec r4
nop ;40us
jnz delay5
dec r5
jnz wr
bis.b #01h,&P2DIR
bis.b #01h,&P2OUT
ret
;-------------------------------------------------
read_word mov #16,r5 ;16bit
rd bis.b #01h,&P2DIR
bic.b #01h,&P2OUT
mov #2,r4
delay6 dec r4
nop
jnz delay6 ;>1us, t=8us
bis.b #01h,&P2OUT
nop
bic.b #01h,&P2DIR ;输入
nop
mov.b &P2IN,r14
rra r14
rrc r12
mov #15,r4
delay7 dec r4
nop
jnz delay7 ;60us
dec r5
jnz rd
bis.b #01h,&P2DIR
bis.b #01h,&P2OUT ;释放总线
ret
END main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -