?? ex93.c
字號:
//實例92:對SPI總線上掛接多個X5045的讀寫操作
#include<reg51.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
sbit SCK=P3^4; //將SCK位定義為P3.4引腳
sbit SI=P3^5; //將SI位定義為P3.5引腳
sbit SO=P3^6; //將SO位定義為P3.6引腳
sbit CS1=P3^7; //將CS定義為P3.7引腳
sbit CS2=P3^3; //將CS1位定義為P3.7引腳
#define WREN 0x06 //寫使能鎖存器允許
#define WRDI 0x04 //寫使能鎖存器禁止
#define READ 0x03 //讀出
#define WRITE 0x02 //寫入
/*****************************************************
函數功能:延時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++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:從X5045的當前地址讀出數據
出口參數:x
***************************************************/
unsigned char ReadCurrent(void)
{
unsigned char i;
unsigned char x=0x00; //儲存從X5045中讀出的數據
SCK=1; //將SCK置于已知的高電平狀態
for(i = 0; i < 8; i++)
{
SCK=1; //拉高SCK
SCK=0; //在SCK的下降沿輸出數據
x<<=1; //將x中的各二進位向左移一位,因為首先讀出的是字節的最高位數據
x|=(unsigned char)SO; //將SO上的數據通過按位“或“運算存入 x
}
return(x); //將讀取的數據返回
}
/*****************************************************
函數功能:寫數據到X5045的當前地址
入口參數:dat
***************************************************/
void WriteCurrent(unsigned char dat)
{
unsigned char i;
SCK=0; //將SCK置于已知的低電平狀態
for(i = 0; i < 8; i++) // 循環移入8個位
{
SI=(bit)(dat&0x80); //通過按位“與”運算將最高位數據送到S
//因為傳送時高位在前,低位在后
SCK=0;
SCK=1; //在SCK上升沿寫入數據
dat<<=1; //將y中的各二進位向左移一位,因為首先寫入的是字節的最高位
}
}
/*****************************************************
函數功能:寫數據到第一個X5045的指定地址
入口參數:addr
***************************************************/
void WriteSet1(unsigned char dat,unsigned char addr)
{
CS2=1; //使第二個X5045的片選無效
SCK=0; //將SCK置于已知狀態
CS1=0; //拉低CS,選中X5045
WriteCurrent(WREN); //寫使能鎖存器允許
CS1=1; //拉高CS
CS1=0; //重新拉低CS,否則下面的寫入指令將被丟棄
WriteCurrent(WRITE); //寫入指令
WriteCurrent(addr); //寫入指定地址
WriteCurrent(dat); //寫入數據
CS1=1; //拉高CS
SCK=0; //將SCK置于已知狀態
}
/*****************************************************
函數功能:寫數據到第二個X5045的指定地址
入口參數:addr
***************************************************/
void WriteSet2(unsigned char dat,unsigned char addr)
{
CS1=1; //使第一個X5045的片選無效
SCK=0; //將SCK置于已知狀態
CS2=0; //拉低CS,選中X5045
WriteCurrent(WREN); //寫使能鎖存器允許
CS2=1; //拉高CS
CS2=0; //重新拉低CS,否則下面的寫入指令將被丟棄
WriteCurrent(WRITE); //寫入指令
WriteCurrent(addr); //寫入指定地址
WriteCurrent(dat); //寫入數據
CS2=1; //拉高CS
SCK=0; //將SCK置于已知狀態
}
/*****************************************************
函數功能:從第一個X5045的指定地址讀出數據
入口參數:addr
出口參數:dat
***************************************************/
unsigned char ReadSet1(unsigned char addr)
{
unsigned char dat;
CS2=1; //使第二個X5045的片選無效
SCK=0; //將SCK置于已知狀態
CS1=0; //拉低CS,選中X5045
WriteCurrent(READ); //開始讀
WriteCurrent(addr); //寫入指定地址
dat=ReadCurrent(); //讀出數據
CS1=1; //拉高CS
SCK=0; //將SCK置于已知狀態
return dat; //返回讀出的數據
}
/*****************************************************
函數功能:從第二個X5045的指定地址讀出數據
入口參數:addr
出口參數:dat
***************************************************/
unsigned char ReadSet2(unsigned char addr)
{
unsigned char dat;
CS1=1; //使第一個X5045的片選無效
SCK=0; //將SCK置于已知狀態
CS2=0; //拉低CS,選中X5045
WriteCurrent(READ); //開始讀
WriteCurrent(addr); //寫入指定地址
dat=ReadCurrent(); //讀出數據
CS2=1; //拉高CS
SCK=0; //將SCK置于已知狀態
return dat; //返回讀出的數據
}
/*****************************************************
函數功能:看門狗復位程序
***************************************************/
void WatchDog1(void)
{
CS1=1; //拉高CS
CS1=0; //CS引腳的一個下降沿復位看門狗定時器
CS1=1; //拉高CS
}
/*****************************************************
函數功能:看門狗復位程序
***************************************************/
void WatchDog2(void)
{
CS2=1; //拉高CS
CS2=0; //CS引腳的一個下降沿復位看門狗定時器
CS2=1; //拉高CS
}
/*****************************************************
函數功能:主程序
***************************************************/
void main(void)
{
unsigned char x;
while(1)
{
WriteSet1(0xf0,0x10); //將數據“0xaa”寫入第一個X5045的指定地址“0x10”
delaynms(10); //X5045的寫入周期為約10ms
x=ReadSet1(0x10); //將數據從第一個X5045中的指定地址讀出來
WriteSet2(x,0x20); //將數據x寫入第二個X5045的指定地址“0x20
delaynms(10); //X5045的寫入周期為約10ms
P1=ReadSet2(0x20); //將數據從第二個X5045中的指定地址讀出來,送P1口顯示
delaynms(100); //延時100ms
WatchDog1(); //復位第一個X5045的看門狗
WatchDog2(); //復位第二個X5045的看門狗
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -