⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ads8505.c

📁 ADS850516位AD的驱动程序,采用8位单片机控制,C语言编写
💻 C
字号:
#include <c8051f020.h>
#include <absacc.h>
#include <intrins.h>
#include "Def.h"

#define Read_AD P3

#define Test_Cs
//#define Test_Count_8
//#define Test_Count_16
//#define Test_Count_32
//#define Test_Count_64



volatile U8 xdata AD8505_Data1[100];
volatile U8 xdata AD8505_Data[3200];
volatile U8 AD_High=0,AD_Low=0;
#define BAUDRATE     115200         
#define SYSCLK       22118400         
sbit BUSY_IO	= P2^1;  //忙状态判断端口,输入
sbit CS_IO		= P2^2;  //片选端口,输出
sbit Read_IO    = P2^3;  //数据读状态端口,输出
sbit BYTE_HL 	= P2^4;  //转换数据的高低输出端口选择,输出 


void SYSCLK_Init (void)
{
   U16 i;                  
   CKCON = 0x00;
   OSCXCN = 0x67;                                      
   for (i=0; i < 256; i++) ;          
   while (!(OSCXCN & 0x80));         
   OSCICN = 0x88;                    
   TCON |=0x01;					
}
void PORT_Init (void)
{
	XBR0    = 0x05;                     
    XBR1    = 0x24;	
    XBR2    = 0x40; 
	P0MDOUT = 0x1D;
	P1MDOUT = 0x0E;
	P1MDIN 	= 0xFF; 
	P2MDOUT = 0x1C;
	EMI0CF 	= 0x20;
}
void Delay(U8 Count)
{
	U8 i;
	for(i=Count;i>0;i--)
	{
		_nop_();
		_nop_();
	//	_nop_();
	//	_nop_();
	}
}
void Read_AD_Data(void)
{
		BYTE_HL = 0; /*准备读数据*/
		Read_AD = 0xFF;
		BUSY_IO = 1;

		CS_IO   = 1; /*R/C脚为底,CS为高*/
		Read_IO = 0;
		__nop_();
		__nop_();		
		__nop_();
		__nop_();
	//	Read_IO = 1;//		__nop_();	
		CS_IO   = 0; /*R/C脚为底,CS出现负跳沿,AD开始转换*/
		__nop_();
		Read_IO = 1;
		while(BUSY_IO==0);  /*等待AD转化出结果*/		
		CS_IO   = 1; /*R/C脚为高,CS为高*/	
		__nop_();
		__nop_();	
		CS_IO   = 0;
		__nop_();
		__nop_();
		//Read_IO = 1;
		//BYTE_HL = 0; /*准备读数据*/
		AD_Low = Read_AD; /*读低八为数*/

		BYTE_HL = 1;
		Read_AD = 0xFF;
//		Delay(20);
		AD_High = Read_AD; /*读高八为数*/
		CS_IO   = 1;
//		Read_IO = 0;
//		Delay(40);
}

void Read_AD_Data1(void)
{
		BYTE_HL = 0;    /*准备读数据*/
		Read_AD = 0xFF;	/*读数据前先输出1*/
//		Read_IO = 1;
		BUSY_IO = 1;   /*读数据前先输出1*/
		Read_IO = 0;   /*下降沿触发AD转换*/
		__nop_();	   /*1/22.1184M=45.2ns*/
		__nop_();
		Read_IO = 1;   /*下降沿中部至上升沿中部所需时间至少40ns,最大1750ns*/
		while(BUSY_IO==0);  /*等待AD转化出结果*/
		AD_Low = Read_AD; /*读低八为数*/
		BYTE_HL = 1;      /*准备读数据*/
		Read_AD = 0xFF;
		AD_High = Read_AD; /*读高八为数*/
		//Read_IO = 0;
		Delay(5);		   /*保证转换之间间隔4us*/
}

void Init_Data(void)
{
	U16 i=0;
	for(i=3200;i>0;i--)
	{
		AD8505_Data[i]=0;	
	}
}
void UART0_Init (void)
{
   SCON0   = 0x50;                    
                                      
   TMOD    = 0x21;                    
                                      
   T2CON &= 0x0cf;                    
   TH1    = -(SYSCLK/BAUDRATE/16);    
   TR1    = 1;                        
   CKCON |= 0x10;                     
   PCON  |= 0x80;                     
}
void main(void)
{
	U16 i=0;
	U32     Temp=0; 
	WDTCN = 0xde;
	WDTCN = 0xad;   //关看门狗
	SYSCLK_Init();
	PORT_Init();
	Init_Data();
	UART0_Init();
	Delay(100);

#ifdef Test_Cs
	Read_IO = 1;
	CS_IO   = 0;
#else
	CS_IO   = 1;
	Read_IO = 1;
#endif

	while(1)
	{
		if(i<3200)
		{
			#ifdef Test_Cs 
				Read_AD_Data1();
			#else
				Read_AD_Data();
			#endif
			AD8505_Data[i]	=AD_Low;
			AD8505_Data[i+1]=AD_High;
			i+=2;
		}
		else
		{
			#ifdef Test_Count_64
			for(i=0;i<3200;i=i+64)
			{
				Temp = AD8505_Data[i]+	AD8505_Data[i+2]+AD8505_Data[i+4]+
					   AD8505_Data[i+6]+AD8505_Data[i+8]+AD8505_Data[i+10]+
					   AD8505_Data[i+12]+AD8505_Data[i+14]+AD8505_Data[i+16]+
					   AD8505_Data[i+18]+AD8505_Data[i+20]+AD8505_Data[i+22]+
					   AD8505_Data[i+24]+AD8505_Data[i+26]+AD8505_Data[i+28]+
					   AD8505_Data[i+30]+AD8505_Data[i+32]+AD8505_Data[i+34]+
					   AD8505_Data[i+36]+AD8505_Data[i+38]+AD8505_Data[i+40]+
					   AD8505_Data[i+42]+AD8505_Data[i+44]+AD8505_Data[i+46]+
					   AD8505_Data[i+48]+AD8505_Data[i+50]+AD8505_Data[i+52]+
					   AD8505_Data[i+54]+AD8505_Data[i+56]+AD8505_Data[i+58]+
					   AD8505_Data[i+60]+AD8505_Data[i+62]+AD8505_Data[i+64];
				Temp+= AD8505_Data[i+66]+AD8505_Data[i+68]+AD8505_Data[i+70]+
					   AD8505_Data[i+72]+AD8505_Data[i+74]+AD8505_Data[i+76]+
					   AD8505_Data[i+78]+AD8505_Data[i+80]+AD8505_Data[i+82]+
					   AD8505_Data[i+82]+AD8505_Data[i+84]+AD8505_Data[i+86]+
					   AD8505_Data[i+88]+AD8505_Data[i+90]+AD8505_Data[i+92]+
					   AD8505_Data[i+94]+AD8505_Data[i+96]+AD8505_Data[i+98]+
					   AD8505_Data[i+100]+AD8505_Data[i+102]+AD8505_Data[i+104]+
					   AD8505_Data[i+106]+AD8505_Data[i+108]+AD8505_Data[i+110]+
					   AD8505_Data[i+112]+AD8505_Data[i+114]+AD8505_Data[i+116]+
					   AD8505_Data[i+118]+AD8505_Data[i+120]+AD8505_Data[i+122]+
					   AD8505_Data[i+124]+AD8505_Data[i+126];
				AD8505_Data1[i>>6] = (U8)(Temp>>6);
			}	 
			#elif defined(Test_Count_32)
			for(i=0;i<3200;i=i+32)
			{
				Temp = AD8505_Data[i]+	AD8505_Data[i+2]+AD8505_Data[i+4]+
					   AD8505_Data[i+6]+AD8505_Data[i+8]+AD8505_Data[i+10]+
					   AD8505_Data[i+12]+AD8505_Data[i+14]+AD8505_Data[i+16]+
					   AD8505_Data[i+18]+AD8505_Data[i+20]+AD8505_Data[i+22]+
					   AD8505_Data[i+24]+AD8505_Data[i+26]+AD8505_Data[i+28]+
					   AD8505_Data[i+30]+AD8505_Data[i+32]+AD8505_Data[i+34]+
					   AD8505_Data[i+36]+AD8505_Data[i+38]+AD8505_Data[i+40]+
					   AD8505_Data[i+42]+AD8505_Data[i+44]+AD8505_Data[i+46]+
					   AD8505_Data[i+48]+AD8505_Data[i+50]+AD8505_Data[i+52]+
					   AD8505_Data[i+54]+AD8505_Data[i+56]+AD8505_Data[i+58]+
					   AD8505_Data[i+60]+AD8505_Data[i+62];
				AD8505_Data1[i>>5] = (U8)(Temp>>5);
			}
			#elif defined(Test_Count_16)
			for(i=0;i<3200;i=i+16)
			{
				Temp = AD8505_Data[i]+	AD8505_Data[i+2]+AD8505_Data[i+4]+
					   AD8505_Data[i+6]+AD8505_Data[i+8]+AD8505_Data[i+10]+
					   AD8505_Data[i+12]+AD8505_Data[i+14]+AD8505_Data[i+16]+
					   AD8505_Data[i+18]+AD8505_Data[i+20]+AD8505_Data[i+22]+
					   AD8505_Data[i+24]+AD8505_Data[i+26]+AD8505_Data[i+28]+
					   AD8505_Data[i+30];
				AD8505_Data1[i>>4] = (U8)(Temp>>4);
			}
			#elif defined(Test_Count_8)
			for(i=0;i<3200;i=i+8)
			{
				Temp = AD8505_Data[i]+	AD8505_Data[i+2]+AD8505_Data[i+4]+
					   AD8505_Data[i+6]+AD8505_Data[i+8]+AD8505_Data[i+10]+
					   AD8505_Data[i+12]+AD8505_Data[i+14];
				AD8505_Data1[i>>3] = (U8)(Temp>>3);
			}	 	 
			#endif
			#ifdef Test_Count_32
			for(i=0;i<100;i++)
			{
				SBUF0=AD8505_Data1[i];
   				while(TI0==0);
   				TI0=0;	
			} 
			#elif defined(Test_Count_64)
			for(i=0;i<49;i++)
			{
				SBUF0=AD8505_Data1[i];
   				while(TI0==0);
   				TI0=0;	
			}
			#elif defined(Test_Count_16)
			for(i=0;i<200;i++)
			{
				SBUF0=AD8505_Data1[i];
   				while(TI0==0);
   				TI0=0;	
			} 
			#elif defined(Test_Count_8)
			for(i=0;i<400;i++)
			{
				SBUF0=AD8505_Data1[i];
   				while(TI0==0);
   				TI0=0;	
			}   
			#else 
			for(i=0;i<3200;i++)
			{
				SBUF0=AD8505_Data[i];
   				while(TI0==0);
   				TI0=0;	
			} 
			#endif 	 
			Init_Data();
			while(RI0==0);
			RI0=0;
			i=0;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -