?? ds18b20.asm
字號:
.DEFINE P_IOA_Dir 0x7002
.DEFINE P_IOA_Attrib 0x7003
.DEFINE P_IOA_Latch 0x7004
.DEFINE P_IOB_Data 0x7005
.DEFINE P_IOB_Buffer 0x7006
.DEFINE P_IOB_Dir 0x7007
.DEFINE P_IOB_Attrib 0x7008
.DEFINE P_SystemClock 0x7013
.DEFINE P_TimerA_Data 0x700A
.DEFINE P_TimerA_Ctrl 0x700B
.DEFINE P_INT_Ctrl 0x7010
.DEFINE P_INT_Clear 0x7011
.DEFINE P_Watchdog_Clear 0x7012
//以下重復定義用于端口的定義,如用戶需要針對自用的設計選擇端口時,可以更改
//以下宏定義中的定義即可
//.DEFINE Port_Data P_IOB_Data
//.DEFINE Port_Buffer P_IOB_Buffer
//.DEFINE Port_Dir P_IOB_Dir
//.DEFINE Port_Attrib P_IOB_Attrib
.DEFINE DQ 0x8000
//由于DS18B20的驅動程序需要修改CPU主頻,為了讓用戶設用DS18B20 的API函數后,能
//恢復到原來的系統時鐘、CPU主頻設置,用戶可以在下面的常量R_SystemClock中定義
//用戶設計需要的值
.DATA
R_SystemClock:
.DW 0x0018 //buffer of save the system clock
//======================================================
// 匯編格式: _F_18B20_Delay
// C格式: void F_18B20_Delay(unsigned int Timers);
// 實現功能: 在49MHz的主頻下的uS延時程序
// 入口參數: 需要延時的時長(以uS為單位)
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_Delay
_F_18B20_Delay:
// cmp r1,1
// jna Delay_Exit
//Delay_Loop:
// nop
// nop
// nop
// nop
// nop
// nop
// nop
// nop
// nop
// nop
// r1-=1
// jnz Delay_Loop
//Delay_Exit:
// retf
r1=0xfc26;
[P_TimerA_Data]=r1;
r1=0x000c;
[P_TimerA_Ctrl]=r1;
r1=0x5400;
[P_INT_Ctrl]=r1;
int IRQ;
retf;
//======================================================
// 匯編格式: _F_18B20_Delay1
// C格式: void F_18B20_Delay1(unsigned int Timers);
// 實現功能: 在49MHz的主頻下的uS延時程序
// 入口參數: 需要延時的時長(以uS為單位)
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_Delay1
r1=DQ; //將端口b15設置成帶數據緩存器的高電平輸出
[P_IOB_Attrib]=r1;
[P_IOB_Dir]= r1 ;
[P_IOB_Data] = r1;
_F_18B20_Delay1: //延時750ms用來完成溫度轉換
r2=760
Delay:
r1=1000
Delay_Loop1:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
r1-=1
cmp r1,1
jnb Delay_Loop1
r2-=1
cmp r2,1
jnb Delay
retf
//======================================================
// 匯編格式: _F_18B20_SetSystemCLK
// C格式: void F_18B20_SetSystemCLK(void);
// 實現功能: 將CPU主頻設置為49MHz,為的是在時序控制時
// 可以獲取到較精確的延時
// 入口參數: 無
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_SetSystemCLK
_F_18B20_SetSystemCLK:
r1 = 0x88
[P_SystemClock] = r1 //set system clock upto 49MHz
retf
//======================================================
// 匯編格式: _F_18B20_RsuSystemCLK
// C格式: void F_18B20_RsuSystemCLK(void);
// 實現功能: 恢復系統及CPU主頻,而至于恢復為多少,則
// 由前面定義的變量R_SystemClock的值確定,用
// 戶可根據各自的程序設計需求進行改動
// 入口參數: 無
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_RsuSystemCLK
_F_18B20_RsuSystemCLK:
r1 = [R_SystemClock]
[P_SystemClock] = r1
retf
//======================================================
// 匯編格式: _F_18B20_Initial_IO
// C格式: void F_18B20_Initial_IO(void);
// 實現功能: 端口初始化子程序
// 入口參數: 無
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_Initial_IO
_F_18B20_Initial_IO: //端口初始化將b15口作為懸浮式輸入
r1=DQ;
[P_IOB_Attrib]=r1;
r1=0x0000;
[P_IOB_Data] = r1;
[P_IOB_Dir]= r1
retf
//======================================================
// 匯編格式: _F_18B20_Reset
// C格式: unsigned int F_18B20_Reset(void);
// 實現功能: 一線總線復位及從設備應答控制程序
// 入口參數: 無
// 出口參數: 0表示復位失敗 1表示復位成功
//======================================================
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
r1=DQ; //將端口b15設置成帶數據緩存器的低電平輸出
[P_IOB_Attrib]=r1;
[P_IOB_Dir]= r1 ;
r1=0x0000;
[P_IOB_Data] = r1;
r1 = 600
call _F_18B20_Delay //延時600us,發送復位脈沖(400us--960us)
r1=0x0000;
[P_IOB_Attrib]=r1; //將端口b15設置成帶上拉電阻的輸入端
[P_IOB_Dir]= r1 ;
r1=DQ;
[P_IOB_Data] = r1;
r1 = 30
call _F_18B20_Delay //Delay 30us
r2 = 1000
F_18B20_Reset_L:
r2 -=1
r1 = [P_IOB_Data]
r1 = r1&DQ; //====================================
cmp r1,0x0000
jne F_18B20_Reset_L //關鍵所在:先檢測DQ是否為低電平,檢測到低電平后
r2 =1000 //檢測高電平,這個時候表示DS18B20完全復位成功
F_18B20_Reset_L2:
r2-=1
r1 = [P_IOB_Data]
r1 = r1&DQ; //=================================
cmp r1,0x0000
je F_18B20_Reset_L2
r1 = 1
jmp F_18B20_Reset_Exit
F_18B20_Reset_Exit:
retf
//======================================================
// 匯編格式: _F_18B20_Write_1
// C格式: void F_18B20_Write_1(void);
// 實現功能: 向一線總線寫1
// 入口參數: 無
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
r1=DQ; //將端口b15設置成帶數據緩存器的低電平輸出
[P_IOB_Attrib]=r1;
[P_IOB_Dir]= r1 ;
r1=0x0000;
[P_IOB_Data] = r1;
r1 = 15
call _F_18B20_Delay
r2 = r2|DQ //將DQ線拉高進行寫1操作
[P_IOB_Data] = r2
r1 = 45
call _F_18B20_Delay
r1=0x0000;
[P_IOB_Attrib]=r1; //將端口b15設置成帶上拉電阻的輸入端
[P_IOB_Dir]= r1 ;
r1=DQ;
[P_IOB_Data] = r1;
retf
//======================================================
// 匯編格式: _F_18B20_Write_0
// C格式: void F_18B20_Write_0(void);
// 實現功能: 向一線總線寫0
// 入口參數: 無
// 出口參數: 無
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
r1=DQ; //將端口b15設置成帶數據緩存器的低電平輸出
[P_IOB_Attrib]=r1;
[P_IOB_Dir]= r1 ;
[P_IOB_Data] = r1;
r1=0x0000;
[P_IOB_Data] = r1;
r1 = 60 //Delay 60us,進行寫0操作
call _F_18B20_Delay
r1=0x0000;
[P_IOB_Attrib]=r1; //將端口b15設置成帶上拉電阻的輸入端
[P_IOB_Dir]= r1 ;
r1=DQ;
[P_IOB_Data] = r1;
retf
//======================================================
// 匯編格式: _F_18B20_Read_DQ
// C格式: unsigned int F_18B20_Read_DQ(void);
// 實現功能: 讀一位一線總線的數據
// 入口參數: 無
// 出口參數: 當前讀回的位的值0/1
//======================================================
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
r1=DQ; //將端口b15設置成帶數據緩存器的低電平輸出
[P_IOB_Attrib]=r1;
[P_IOB_Dir]= r1 ;
r1=0x0000;
[P_IOB_Data] = r1;
r1 = 2 //延時1us
call _F_18B20_Delay
r1=0x0000;
[P_IOB_Attrib]=r1; //將端口b15設置成帶上拉電阻的輸入端
[P_IOB_Dir]= r1 ;
r1=DQ;
[P_IOB_Data] = r1;
r1=15
call _F_18B20_Delay
r3 = [P_IOB_Data] //將端口b15設置成帶上拉電阻的輸入端
r3 = r3&DQ
jz L18B20_Read_0 //jz:運算結果為0,則z=1跳轉
r3 = 0x8000;
L18B20_Read_0:
r1 = 45
call _F_18B20_Delay
r2 = r2|DQ
[P_IOB_Data] = r2
r1 = 1
call _F_18B20_Delay //Delay 1us
r1 = r3
retf
//==============================================
// IRQ中斷
//==============================================
.text
.public _IRQ1;
_IRQ1:
push r1,r5 to[sp];
r1=0x0001;
[P_Watchdog_Clear]=r1;
r1=0x1000;
[P_INT_Clear]=r1;
pop r1,r5 from [sp];
reti;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -