資源簡介
自己寫的51單片機AD7705程序。板子上驗證通過,需要的拿去修改移植。歡迎批評指正。

代碼片段和文件信息
#include
#include
#include
/*---?延時程序,大約微秒級別??---*/
void?Delay_Us(unsigned?int?us)
{
for(;us>0;us--);
}
/*---?延時程序,大約毫秒級別??---*/
void?Delay_Ms(unsigned?int?ms)
{
for(;ms>0;ms--)
Delay_Us(300);
}
/*---?軟件模擬SPI的時序,單片機寫數據函數?---*/
//dat-->要發送的數據
//void?SPISendByte(unsigned?char?dat) ??//SPI發送
//{
// unsigned?char?i;
//// CS?=?0; ?CS接地了,一直是低
// SCLK=1;
// SCLK=1;
//
// for(i=0;i<8;i++)??//8位數據
// {
// DIN?=?dat&0x80;
// SCLK?=?0;//時鐘,低電平時給數據
// SCLK?=?0;
// SCLK?=?1;
// dat?=?dat<<1;?//移位,下一位移到最高位做準備
// SCLK=1;
// }
//}
void?SPISendByte(unsigned?char?dat)
{
?unsigned?char?a;
?SCLK?=?1;
?for?(a=0;?a<8;?a++)
?{
??SCLK=0;
??if(dat?&?0x80)
??DIN=1;
??else
??DIN=0;
??_nop_();
??_nop_();
??SCLK=1;????
??_nop_();
??_nop_();
??dat<<=1;
?}
?DIN=1;
}
/*---?軟件模擬SPI,讀數據的程序??---*/
/*---?入口參數:無
??????返回參數:接收的數據,一個字節8位??---*/
//unsigned?char?SPIRecvByte(void) ?//SPI接收
//{
// unsigned?char?dat?=?0;
// unsigned?char?i;
//// CS?=?0;
//
// for(i=0;i<8;i++)??//8位滿了就跳出
// {
// dat?=?dat<<1;//接收到的放在最低位,再移到高位,空出第一位
//
// SCLK?=?1;
// SCLK?=?1;
// SCLK?=?0; //低電平的時候讀取數據
// SCLK?=?0;
//?
// if(DOUT)
// dat?=?dat?|?0x01;//SO給的1就寫1到dat最低位
// else
// dat?=?dat?&?0xFE;//SO給的0就寫0到dat最低位,其他位要移出的不管?
// }
//
// SCLK?=?1;?
// return?dat;
//}
/*---?軟件模擬SPI,讀數據的程序??---*/
/*---?入口參數:無
??????返回參數:接收的數據,16位??---*/
unsigned?int?SPIRecv16bit(void) ?//SPI接收
{
unsigned?int?dat?=?0;
unsigned?char?i;
// CS?=?0;
for(i=0;i<16;i++)??//8位滿了就跳出
{
dat?=?dat<<1;//接收到的放在最低位,再移到高位,空出第一位
SCLK?=?1;
SCLK?=?1;
SCLK?=?0; //低電平的時候讀取數據
SCLK?=?0;
?
if(DOUT)
dat?=?dat?|?0x0001;//SO給的1就寫1到dat最低位
else
dat?=?dat?&?0xFFFE;//SO給的0就寫0到dat最低位,其他位要移出的不管?
}
SCLK?=?1;?
return?dat;
}
/*----------------------------------------------------------------------------?*/
//函數:reset_AD7705
//功能:AD7705串行接口失步后將其復位。復位后要延時500us再訪問
//參數:無
//返回:無
//變量:無
//備注:?DIN高電平的寫操作持續足夠長的時間,至少32個串行時鐘周期AD7705將會回到默認狀態
//----------------------------------------------------------------------------
void?reset_AD7705(void)
{
??????unsigned?char?i;
??????SPISendByte(0x01);//下一步寫操作
??????DIN=1;
??????for(i=0;?i<36;?i++)
??????{
??????????SCLK=0;
??SCLK=0;
??????????SCLK=1;
??????}?????
??????Delay_Us(160);//500US
}
//配置芯片通道1,并開始校準
void?AD7705_init1(void)
{
?reset_AD7705();
//?Delay_Ms(1);
?SPISendByte(0x20);//0X21擇通道2,0x20通道1,下一步寫時鐘寄存器
?SPISendByte(0x04);?//主時鐘使能,更新率25HZ
?SPISendByte(0x10);//0X11選擇通道2,0x10選擇通道1.下一步寫設置寄存器
?SPISendByte(0x44); //自校準模式,單極性,不使用緩沖器。開始轉換
?while(DRDY);
}
//配置芯片通道2,并開始校準
void?AD7705_init2(void)
{
?reset_AD7705();
// ?Delay_Ms(1);
?SPISendByte(0x21);//0X21擇通道2,0x20通道1,下一步寫時鐘寄存器
?SPISendByte(0x06);?//主時鐘使能,更新率250HZ
?SPISendByte(0x11);//0X11選擇通道2,0x10選擇通道1.下一步寫設置寄存器
?SPISendByte(0x44); //自校準模式,單極性,不使用緩沖器。開始轉換
?while(DRDY);
}
//讀取一次16位data
unsigned?int?Read_datareg1(vo
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????4073??2013-12-13?09:14??ad7705.c
?????文件????????1228??2013-12-12?10:21??ad7705.h
- 上一篇:語音控制小車
- 下一篇:基于Fourier神經網絡的圖像復原算法
評論
共有 條評論