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

📄 driverlib.c

📁 16位4通道A/D转换器CS5523驱动程序。 C51
💻 C
字号:
/*驱动外围器件的函数库*//////////////////////////////////

#include "iom128v.h"
#include "eeprom.h"
#include "bitdef.h"
#include "global.h"

extern BYTE ee_config[3];    //配置寄存器
extern BYTE ee_csr[2][3];     //通道设置寄存器
extern BYTE ee_ad_gain[3];    //AD增益
extern BYTE ee_ad_zero[4][3];  //通道零点

void dlay(void)
{
 	U8 k;
	SCLK=0;//sclk=0
	for(k=0;k<8;k++) 
		SCLK=1; //sclk=1
	SCLK=0;//sclk=0跳变
}

//写CS5523子程序,写入num+1个字节
void wrad(U8 num)
{
   U8 	i,j;
   BYTE k;
// PORTF&=0xf7;//sclk=0
// PORTF&=0xfe;//cs1=0
   	for(i=0;i<=num;i++)
    {
	   k=data[i];
	   for(j=0;j<8;j++)
	   {
		  if((k & 0x80)==0x80)
		     SDI=1;//sdi=1
		  else
		     SDI=0;//sdi=0
		  dlay();
		  k<<=1;
	   }
	}
// 	PORTF|=0x01;//cs1=1
}

//读CS5523子程序,读num+1个字节
void rdad(U8 num)
{
   U8   i,j;
   BYTE k;
// PORTF&=0xf7;//sclk=0
// PORTF&=0xfe;//cs1=0
   for(i=0;i<=num;i++)
   {
      k=0;
	  for(j=0;j<8;j++)
	  {
/*	  
		 if(SDO)//data=1
		    k|=bit_1[j];  //k|=(1<<j);
		 else
		    k&=bit_0[j];  //k&=(~(1<<j));
*/
  		 k<<=1;
		 k+=SDO;
		 			
		 dlay();
	   }
	   data[i]=k;
	}
// 	PORTF|=0x01;//cs1=1
}

//初始化CS5523
void initial_ad(void)
{
	U8 i;
//初始化串口,初始化序列后,串行口为命令模式
	SCLK=0;//sclk=0
	data[0]=0xff;
	for(i=0;i<15;i++) wrad(0);
	data[0]=0xfe;wrad(0);
/////////////////////

//写配置寄存器置RS位,使复位,复位后RV=1,直到配置寄存器被读取后,RV=0
	data[0]=0x03;// comm=03h* write config_reg
	data[1]=0x04;	// config=00h,35h,80h
	data[2]=0x35;
	data[3]=0x80;
	wrad(3);//cy_flag=0;
	
//读配置寄存器
loop:
	data[0]=0x0b;// comm=0bh* read config_reg
	wrad(0);
	rdad(2);
	if ((data[2]& 0x40)==0x00) goto loop;//测RV=1,如不为1,则要再读配置寄存器
	
//写配置寄存器清RS位,写RS=0以便退出复位模式
	data[0]=0x03;// comm=03h* write config_reg
	data[1]=0x00;	// config=00h,35h,00h
	data[2]=0x35;
	data[3]=0x00;
	wrad(3);
//////////////////////////
	
//写配置寄存器,必须重新写一次配置寄存器以便设置配置寄存器的其它位
	data[0]=0x03;// comm=03h* write config_reg
	data[1]=0x04;	// config=04h,35h,00h
	data[2]=0x35;
	data[3]=0x00;
	wrad(3); 
/*
	EEPROM_READ((int)&ee_config[0],data[1]);
	EEPROM_READ((int)&ee_config[1],data[2]);
	EEPROM_READ((int)&ee_config[2],data[3]);
	wrad(3);
*/
//写通道寄存器
	//comm=5,write csr1,csr2,csr3,csr4
	//csr1(0)=01h;csr1(1)=80h;csr1(2)=98h; 5V/30hz
	//csr1(0)=00h;csr1(1)=80h;csr1(2)=88h; 5V/15hz
	//csr1(0)=00h;csr1(1)=60h;csr1(2)=86h; 1V/15hz
	//csr1(0)=00h;csr1(1)=20h;csr1(2)=82h; 55mV/15hz
	//csr1(0)=00h;csr1(1)=40h;csr1(2)=84h; 25mV/15hz
	//csr1(0)=06h;csr1(1)=40h;csr1(2)=e4h; 25mV/3.76hz
	//csr1(0)=00h;csr1(1)=70h;csr1(2)=87h; 1V/15hz单记性
	
	data[6] =0x96;//85;
	data[5] =0x61;//51;
	data[4] =0x11;//10;
	data[3] =0x96;//85;
	data[2] =0x60;//50;
	data[1] =0x01;//00;
	data[0]=0x05;
	//csr1(0)=11h;csr1(1)=81h;csr1(2)=98h; 5V/30hz
	//csr1(0)=01h;csr1(1)=81h;csr1(2)=88h; 5V/15hz
	//csr2(0)=10h;csr2(1)=61h;csr2(2)=86h; //1V/15hz
	//csr1(0)=10h;csr1(1)=01h;csr1(2)=80h; 100mV/15hz
	//csr1(0)=10h;csr1(1)=41h;csr1(2)=84h; 25mV/15hz
	//csr1(0)=16h;csr1(1)=41h;csr1(2)=e4h; 25mV/3.76hz
	//csr1(0)=01h;csr1(1)=71h;csr1(2)=87h; 1V/15hz单记性
	wrad(6);
//写配置寄存器,必须重新写一次配置寄存器以便设置配置寄存器的其它位
	data[0]=0x03;// comm=03h* write config_reg
	data[1]=0x04;	// config=04h,25h,00h
	data[2]=0x35;
	data[3]=0x00;
	wrad(3); 
/*	
	EEPROM_READ((int)&ee_csr[0][0],data[1]);
	EEPROM_READ((int)&ee_csr[0][1],data[2]);
	EEPROM_READ((int)&ee_csr[0][2],data[3]);
	
	EEPROM_READ((int)&ee_csr[1][0],data[4]);
	EEPROM_READ((int)&ee_csr[1][1],data[5]);
	EEPROM_READ((int)&ee_csr[1][2],data[6]);

	data[0]=0x05;
	wrad(6);
*/	
/////////////////////////////////////////////////////**************************
	
	
/////////////////////////////////////////////////////**************************
//写零点	//load offset reg of channel 0~3
	for(i=0;i<4;i++)
	{
		 data[0]=z_add[i];
		 //td=i*3;//读出EEPROM通道零点
		 data[1]=0;//EEPROMread(td);
		 data[2]=0;//EEPROMread(td+1);
		 data[3]=0;//EEPROMread(td+2);
		 wrad(3);
/*		 
		 EEPROM_READ((int)&ee_ad_zero[i][0],data[1]);
		 EEPROM_READ((int)&ee_ad_zero[i][1],data[2]);
		 EEPROM_READ((int)&ee_ad_zero[i][2],data[3]);
		 wrad(3);
*/		 
	}
//写增益	//load offset reg of channel 0~3
	for(i=0;i<4;i++)
	{
		 data[0]=m_add[i];
		 data[1]=64;//EEPROMread(buf_num);
		 data[2]=0x00;
		 data[3]=0x00;
		 wrad(3);
/*		 
		 EEPROM_READ((int)&ee_ad_gain[0],data[1]);
		 EEPROM_READ((int)&ee_ad_gain[1],data[2]);
		 EEPROM_READ((int)&ee_ad_gain[2],data[3]);
		 wrad(3);
*/		 
	}
// 	PORTF|=0x01;//cs1=1
    data[0]=0;
	SCLK=0;wrad(0);
	data[0]=0x80;
	SCLK=0;wrad(0);
}

/*获取键值*///////////////////////////////////////////////////////
/*无按键或多键按下时返回值为0,否则KEY1~KEY4对应1~4*/
BYTE get_key()
{
 	 BYTE i,key_code;
	 
	 key_code=PINE;
	 key_code>>=4;
	 key_code &= 0x0F;
	 for(i=0;i<=4;i++)
	 {
	     if(key_code==key_map[i]) return i;
	 }
  	 
	 return 0;
}

/*点亮第i个LED*///////////////////////////////////////////////////
void light_led(BYTE i)
{
 	 switch(i)
	 {
	     case 0:
		 	  PF.B0=1;
			  break;
		 case 1:
		 	  PF.B0=1;
			  break;
		 case 2:
		 	  PF.B0=1;
			  break;
		 case 3:
		 	  PF.B0=1;
			  break;
		 case 4:
		 	  PF.B0=1;
			  break;
		 case 5:
		 	  PF.B0=1;
			  break;
		 case 6:
		 	  PF.B0=1;
			  break;
		 case 7:
		 	  
			  break;
	 }
}

⌨️ 快捷键说明

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