//實例91:將數(shù)據(jù)"0xaa"寫入X5045再讀出送P1口顯示
#include<reg51.h> //包含單片機寄存器的頭文件 #include<intrins.h> //包含_nop_()函數(shù)定義的頭文件 sbit SCK=P3^4; //將SCK位定義為P3.4引腳 sbit SI=P3^5; //將SI位定義為P3.5引腳 sbit SO=P3^6; //將SO位定義為P3.6引腳 sbit CS=P3^7; //將SCK位定義為P3.7引腳 #define WREN 0x06 //寫使能鎖存器允許 #define WRDI 0x04 //寫使能鎖存器禁止 #define WRSR 0x01 //寫狀態(tài)寄存器 #define READ 0x03 //讀出 #define WRITE 0x02 //寫入 /***************************************************** 函數(shù)功能:延時1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函數(shù)功能:延時若干毫秒 入口參數(shù):n ***************************************************/ void delaynms(unsigned char n) { unsigned char i; for(i=0;i<n;i++) delay1ms(); } /***************************************************** 函數(shù)功能:從X5045的當前地址讀出數(shù)據(jù) 出口參數(shù):x ***************************************************/ unsigned char ReadCurrent(void) { unsigned char i; unsigned char x=0x00; //儲存從X5045中讀出的數(shù)據(jù) SCK=1; //將SCK置于已知的高電平狀態(tài) for(i = 0; i < 8; i++) { SCK=1; //拉高SCK SCK=0; //在SCK的下降沿輸出數(shù)據(jù) x<<=1; //將x中的各二進位向左移一位,因為首先讀出的是字節(jié)的最高位數(shù)據(jù) x|=(unsigned char)SO; //將SO上的數(shù)據(jù)通過按位“或“運算存入 x } return(x); //將讀取的數(shù)據(jù)返回 } /***************************************************** 函數(shù)功能:寫數(shù)據(jù)到X5045的當前地址 入口參數(shù):dat ***************************************************/ void WriteCurrent(unsigned char dat) { unsigned char i; SCK=0; //將SCK置于已知的低電平狀態(tài) for(i = 0; i < 8; i++) // 循環(huán)移入8個位 { SI=(bit)(dat&0x80); //通過按位“與”運算將最高位數(shù)據(jù)送到S //因為傳送時高位在前,低位在后 SCK=0; SCK=1; //在SCK上升沿寫入數(shù)據(jù) dat<<=1; //將y中的各二進位向左移一位,因為首先寫入的是字節(jié)的最高位 } } /*****************************************************
函數(shù)功能:寫狀態(tài)寄存器 ,可以設置看門狗的溢出時間及數(shù)據(jù)保護 入口參數(shù):rs; //儲存寄存器狀態(tài)值 ***************************************************/ void WriteSR(unsigned char rs) { CS=0; //拉低CS,選中X5045 WriteCurrent(WREN); //寫使能鎖存器允許 CS=1; //拉高CS CS=0; //重新拉低CS,否則下面的寫寄存器狀態(tài)指令將被丟棄 WriteCurrent(WRSR); //寫狀態(tài)寄存器 WriteCurrent(rs); //寫入新設定的寄存器狀態(tài)值 CS=1; //拉高CS } /*****************************************************
函數(shù)功能:寫數(shù)據(jù)到X5045的指定地址 入口參數(shù):addr ***************************************************/ void WriteSet(unsigned char dat,unsigned char addr) { SCK=0; //將SCK置于已知狀態(tài) CS=0; //拉低CS,選中X5045 WriteCurrent(WREN); //寫使能鎖存器允許 CS=1; //拉高CS CS=0; //重新拉低CS,否則下面的寫入指令將被丟棄 WriteCurrent(WRITE); //寫入指令 WriteCurrent(addr); //寫入指定地址 WriteCurrent(dat); //寫入數(shù)據(jù) CS=1; //拉高CS SCK=0; //將SCK置于已知狀態(tài) } /*****************************************************
函數(shù)功能:從X5045的指定地址讀出數(shù)據(jù) 入口參數(shù):addr 出口參數(shù):dat ***************************************************/ unsigned char ReadSet(unsigned char addr) { unsigned char dat; SCK=0; //將SCK置于已知狀態(tài) CS=0; //拉低CS,選中X5045 WriteCurrent(READ); //開始讀 WriteCurrent(addr); //寫入指定地址 dat=ReadCurrent(); //讀出數(shù)據(jù) CS=1; //拉高CS SCK=0; //將SCK置于已知狀態(tài) return dat; //返回讀出的數(shù)據(jù) } /*****************************************************
函數(shù)功能:看門狗復位程序 ***************************************************/ void WatchDog(void) { CS=1; //拉高CS CS=0; //CS引腳的一個下降沿復位看門狗定時器 CS=1; //拉高CS } /***************************************************** 函數(shù)功能:主程序 ***************************************************/ void main(void) { WriteSR(0x12); //寫狀態(tài)寄存器(設定看門狗溢出時間為600ms,寫不保護) delaynms(10); //X5045的寫入周期約為10ms while(1) { WriteSet(0xaa,0x10); //將數(shù)據(jù)“0xaa”寫入指定地址“0x10” delaynms(10); //X5045的寫入周期約為10ms P1=ReadSet(0x10); //將數(shù)據(jù)讀出送P1口顯示 WatchDog(); //復位看門狗 } } |
|