维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

搜索附件  
维修网 附件中心 电子技术与产品开发 单片机开发与学习 [共享资料]看门狗X5045的中文资料及本人实用程序: 786fdaa1.rar

热门下载

附件中心&附件聚合2.0
For Discuz! X2.5 © hgcad.com

[共享资料]看门狗X5045的中文资料及本人实用程序: 786fdaa1.rar

 

[共享资料]看门狗X5045的中文资料及本人实用程序:
本人在最初运用X5045时不是WDT根本就没有启动、就是数据读不出、写不入,参考了很多资料
       
现在把本人的经验传给初学的同仁,希望能让你们少走弯路:
       
以下为力源公司整理的X5045的中文资料:
       
  




       
以下为本人成功使用的操作X5045的程序:
       
1.主程序中初始化看门狗只须调用外部程序 WrsrDog();//00h-->1.4S,20h-->200ms,10h-->600ms,30h-->看门狗禁能。其中入口参数为空,默认为1.4S,如果你觉得太长可以修改附带的C程序,再汇编一下就可以了2.在需要读写X5045的程序前加上以下两行
       
extern unsigned char ReadDogByte(unsigned char); //入口参数为读出地址extern void WriteDogByte(unsigned char,unsigned char); //入口参数1为写入地址,2为写入数据(8bits)3.在工程中创建文件名为WD5045.A51文件,拷入以下内容:
       
OBJECTEXTEND SRC(.\WD5045.SRC)
       
$NOMOD51
       
NAME WD5045ADIN BIT 0B0H.7SCL BIT 0B0H.5DOUT BIT 0B0H.4WDCS BIT 0B0H.3
       
?PR?Delay10ms?WD5045 SEGMENT CODE INBLOCK ?PR?_WriteSPI?WD5045 SEGMENT CODE INBLOCK ?PR?ReadSPI?WD5045 SEGMENT CODE INBLOCK ?PR?WrenDog?WD5045 SEGMENT CODE INBLOCK ?PR?WrsrDog?WD5045 SEGMENT CODE INBLOCK ?PR?_ReadDogByte?WD5045 SEGMENT CODE INBLOCK ?PR?_WriteDogByte?WD5045 SEGMENT CODE INBLOCK PUBLIC _WriteDogByte PUBLIC _ReadDogByte PUBLIC WrsrDog PUBLIC WrenDog PUBLIC ReadSPI PUBLIC _WriteSPI PUBLIC Delay10ms
       
RSEG ?PR?Delay10ms?WD5045Delay10ms:
       
; 延时约10ms,本人实际用11.0592MHz晶振 MOV R1,#23LOOP0: MOV R0,#198LOOP1: DJNZ R0,LOOP1 DJNZ R1,LOOP0
       
MOV R1,#1LOOP2: MOV R0,#17LOOP3: DJNZ R0,LOOP3 DJNZ R1,LOOP2
       
; ;1+(198*2+2+1)*23=9178; ;1+1+(17*2+2+1)*1=39 共9217*1.085=10ms
       
RET ; END OF Delay10ms
       
; //向SPI串口写入1字节数据; void WriteSPI(unsigned char da)
       
RSEG ?PR?_WriteSPI?WD5045_WriteSPI: USING 0 ; SOURCE LINE # 39;---- Variable 'da?140' assigned to Register 'R7' ----; { ; SOURCE LINE # 40; unsigned char data i;; for(i=0;i<8;i++) ; SOURCE LINE # 42;---- Variable 'i?141' assigned to Register 'R6' ---- MOV R6,#08H MOV A,R7?C0002: RLC A MOV ADIN,C
       
CLR SCL SETB SCL
       
DJNZ R6,?C0002?C0005: RET ; END OF _WriteSPI
       
; ; unsigned char ReadSPI(void)
       
RSEG ?PR?ReadSPI?WD5045ReadSPI: USING 0 ; SOURCE LINE # 51;---- Variable 'TempSPI?243' assigned to Register 'R7' ----; { ; SOURCE LINE # 52; unsigned char data i;; unsigned char data TempSPI;; bit j;; MOV R6,#08H?C0006: SETB SCL CLR SCL
       
MOV C,DOUT RLC A
       
DJNZ R6,?C0006 MOV R7,A
       
?C0010: RET ; END OF ReadSPI
       
; ; //看门狗写使能; void WrenDog(void)
       
RSEG ?PR?WrenDog?WD5045WrenDog: USING 0
       
CLR SCL CLR WDCS
       
MOV R7,#06H ACALL _WriteSPI
       
CLR SCL SETB WDCS
       
RET ; END OF WrenDog
       
; /*; //读看门狗状态; unsigned char RdsrDog(void) ; {; unsigned char TempReg;; SCL=0;; WDCS=0;; WriteSPI(0x05);; TempReg=ReadSPI();; SCL=0;; WDCS=1;; return(TempReg);; }; */; //写看门狗状态寄存器; void WrsrDog()
       
RSEG ?PR?WrsrDog?WD5045WrsrDog: USING 0
       
ACALL WrenDog
       
CLR WDCS
       
MOV R7,#01H ACALL _WriteSPI
       
MOV R7,#00H ACALL _WriteSPI
       
CLR SCL SETB WDCS
       
AJMP Delay10ms; END OF WrsrDog
       
; //看门狗存储器1字节读出; unsigned char ReadDogByte(unsigned char Add)
       
RSEG ?PR?_ReadDogByte?WD5045_ReadDogByte: USING 0 ; SOURCE LINE # 106;---- Variable 'Add?545' assigned to Register 'R5' ---- MOV R5,AR7
       
CLR SCL CLR WDCS
       
MOV R7,#03H ACALL _WriteSPI
       
MOV R7,AR5 ACALL _WriteSPI
       
ACALL ReadSPI;---- Variable 'Temp1?546' assigned to Register 'R7' ---- CLR SCL SETB WDCS?C0013: RET ; END OF _ReadDogByte
       
; ; ; void WriteDogByte(unsigned char Address,unsigned char WrData)
       
RSEG ?PR?_WriteDogByte?WD5045_WriteDogByte: USING 0 ; SOURCE LINE # 120;---- Variable 'WrData?648' assigned to Register 'R5' ----;---- Variable 'Address?647' assigned to Register 'R4' ---- MOV R4,AR7
       
ACALL WrenDog
       
CLR WDCS
       
MOV R7,#02H ACALL _WriteSPI
       
MOV R7,AR4 ACALL _WriteSPI
       
MOV R7,AR5 ACALL _WriteSPI
       
CLR SCL SETB WDCS
       
AJMP Delay10ms
       
; END OF _WriteDogByte
       
END
       
或者可加入本C程序,文件名为WD5045.C再通过本人整理的C51调用汇编的帖子指导生成以上WD5045.A51文件
       
//*******************************************#include <define.c>
       
void Delay10ms(void) { _nop_();
       
//写入汇编程序,此处没有写C程序只保留框架,等编译成.A51后可以取消注释字符即可
       
//另外需要说明的是X5045在写入数据后一般要有10ms的延时执行非忆失操作 /* ; 延时约10ms. MOV R1,#23 ?C0013: MOV R0,#198 ?C0014: DJNZ R0,?C0014 DJNZ R1,?C0013 MOV R1,#1 ?C0015: MOV R0,#17 ?C0016: DJNZ R0,?C0016 DJNZ R1,?C0015 RET ; END OF _WriteDogByte SETB WDCS END ;1+(198*2+2+1)*23=9178 ;1+1+(17*2+2+1)*1=39 共9217*1.085=10ms */
       
} //向SPI串口写入1字节数据void WriteSPI(unsigned char da) { unsigned char data i; for(i=0;i<8;i++) { SCL=0; da=da<<1; ADIN=(bit)(da & 0x80); SCL=1; } }
       
unsigned char ReadSPI(void) { unsigned char data i; unsigned char data TempSPI; bit j;
       
for(i=0;i<8;i++) { SCL=1; SCL=0; j=DOUT; TempSPI=TempSPI<<1; if(j) TempSPI|=0x01; } return (TempSPI); }
       
//看门狗写使能void WrenDog(void) { SCL=0; WDCS=0; WriteSPI(0x06); SCL=0; WDCS=1; }/*//读看门狗状态unsigned char RdsrDog(void) { unsigned char TempReg; SCL=0; WDCS=0; WriteSPI(0x05); TempReg=ReadSPI(); SCL=0; WDCS=1; return(TempReg); }*///写看门狗状态寄存器void WrsrDog() { WrenDog(); WDCS=0; WriteSPI(1); WriteSPI(0); SCL=0;
WDCS=1; Delay10ms(); }
       
//看门狗存储器1字节读出unsigned char ReadDogByte(unsigned char Add) { unsigned char data Temp1; SCL=0; WDCS=0; WriteSPI(3); //读指令,其中A8=0,表示为存储器的前一半 WriteSPI(Add); //地址 Temp1=ReadSPI(); //读看门狗存储器1字节到Temp1中 SCL=0; WDCS=1; return(Temp1); }
       
void WriteDogByte(unsigned char Address,unsigned char WrData) { WrenDog(); WDCS=0;
       
WriteSPI(0x02); //写指令,其中A8=0,表示为存储器的前一半 WriteSPI(Address); //地址 WriteSPI(WrData); //给看门狗存储器写1字节 SCL=0; WDCS=1;
       
Delay10ms();}
       
希望能对你有所帮助
读者可以根据自己实际电路修改

ADIN BIT 0B0H.7SCL BIT 0B0H.5DOUT BIT 0B0H.4WDCS BIT 0B0H.3

QQ|申请友链|手机版|小黑屋|最新贴|维修网 ( 粤ICP备09047344号

GMT+8, 2024-4-27 19:29 , Processed in 0.410924 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部