📄 ad5513.c
字号:
#include "includes.h"
INT32S idata AD_Data0[8];
INT32S idata AD_Data1[8];
INT8U AD0,AD1;
extern bit SendFlag0;
extern bit SendFlag1;
extern bit ErrFlag;
/*============================================================
*
* 函 数 名:Ad_Init
*
* 参 数:
*
* 功能描述:AD程序初始化
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
void Ad_Init(void)
{
LED0 = 0;
LED1 = 0;
ADCS0 =1;
ADCS1 =1;
ADSCLK0=0;
ADSCLK1=0;
ADSDO0 = 1;
ADSDO1 = 1;
}
/*============================================================
*
* 函 数 名:ADRcvData0
*
* 参 数:
*
* 功能描述:通道0采样
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
INT32U ADRcvData0 (void)
{
INT8U i,j;
INT8U err;
INT32U rcvdata; /* save AD conversion 20bit */
INT32U rcv_temp;
rcvdata = 0; /* initialization RcvData 0 */
ADCS0 = 0; /* select AD*/
err = 0;
while(ADSDO0)
{
if(ErrFlag){
ErrFlag = 0;
err++;
if(err>40){
LED0 = 1; //Led灯灭,说明第一通道坏死
break;
}
}
}
if(!LED0)
{
if(!ADSDO0)
{
for(i=0;i<24;i++) /*要传送的数据长度为20位 */
{
for(j=0;j<10;j++);
ADSCLK0 = 1;
rcvdata <<=1;
if(ADSDO0) /*判断发送位 */
rcvdata+=1;
ADSCLK0 = 0; /*置时钟线为高,通知被控器开始接收数据位 */
}
ADCS0 = 1;
rcv_temp = rcvdata&0xF00000;
if(rcv_temp==0)
return (rcvdata&0xFFFFF);
else if(rcv_temp==0x400000)
return (0x7FFFF);
else
return (0x100000);
}
else
{
return (0x100000);
}
}
}
/*============================================================
*
* 函 数 名:ADFilter0
*
* 参 数:
*
* 功能描述:通道0数据处理
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
void ADFilter0(void)
{
INT8S i;
INT32U ad_temp;
INT32S tmp;
INT32S sum;
if(!LED0){
ad_temp = ADRcvData0(); //第一通道第一次转化
if(ad_temp<0x100000){
if(ad_temp>0x7FFFF)
tmp = 0xFFF00000|ad_temp;
else
tmp = ad_temp;
AD_Data0[AD0++] = tmp;
if ( AD0 > 7)
AD0 = 0;
sum=0;
for(i=0; i<8; i++)
sum += AD_Data0[i];
sum >>= 3;
if(sum<0)
sum &= 0x000FFFFF;
if(SendFlag0){
SendFlag0 = 0;
send0(sum);
}
}
}
}
/*============================================================
*
* 函 数 名:ADRcvData1
*
* 参 数:
*
* 功能描述:通道1采样
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
INT32U ADRcvData1 (void)
{
INT8U i,j;
INT8U err;
INT32U rcvdata; /* save AD conversion 20bit */
INT32U rcv_temp;
rcvdata = 0; /* initialization RcvData 0 */
ADCS1 = 0; /* select AD*/
err = 0;
while(ADSDO1)
{
if(ErrFlag){
ErrFlag = 0;
err++;
if(err>40){
LED1 = 1; //Led灯灭,说明第二通道坏死
break;
}
}
}
if(!LED1)
{
if(!ADSDO1)
{
for(i=0;i<24;i++) /*要传送的数据长度为20位 */
{
for(j=0;j<10;j++);
ADSCLK1 = 1;
rcvdata <<=1;
if(ADSDO1) /*判断发送位 */
rcvdata+=1;
ADSCLK1 = 0; /*置时钟线为高,通知被控器开始接收数据位 */
}
ADCS1 = 1;
rcv_temp = rcvdata&0xF00000;
if(rcv_temp==0)
return (rcvdata&0xFFFFF);
else if(rcv_temp==0x400000)
return (0x7FFFF);
else
return (0x100000);
}
else
{
return(0x100000);
}
}
}
/*============================================================
*
* 函 数 名:ADFilter1
*
* 参 数:
*
* 功能描述:通道1数据处理
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
void ADFilter1(void)
{
INT8S i;
INT32U ad_temp;
INT32S tmp;
INT32S sum;
if(!LED1){
ad_temp = ADRcvData1(); //第一通道第一次转化
if(ad_temp<0x100000){
if(ad_temp>0x7FFFF)
tmp = 0xFFF00000|ad_temp;
else
tmp = ad_temp;
AD_Data1[AD1++] = tmp;
if ( AD1 > 7)
AD1 = 0;
sum=0;
for(i=0; i<8; i++)
sum += AD_Data1[i];
sum >>= 3;
if(sum<0)
sum &= 0x000FFFFF;
if(SendFlag1){
SendFlag1 = 0;
send1(sum);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -