📄 cs5520.c
字号:
CL1=CL0;
}
/*************************************************************************************************************************
*子程序名 :SendData
*输入 :无
*输出 :无
*该子程序将发送缓冲区的数据按约定的通信协议发往上位机.
*************************************************************************************************************************/
void SendData()
{ sendic=0;
while(buffer1[sendic]!=0x0d)
{ SBUF=buffer1[sendic];
while(TI!=1);TI=0;
sendic=sendic+1;
}
SBUF=0x0d;
while(TI!=1);TI=0;
}
/*************************************************************************************************************************
*子程序名 :acquire_conversion
*输入 :无
*输出 :无
*该子程序命令CS5520进行单次或连续AD转换操作(只执行一次该子程序,且在DRDY引脚变低之前无新的命令给CS5520).
*************************************************************************************************************************/
void acquire_conversion()
{
CS=0x00;
SID=0x00;
SOD=0x01;
SCLK=0x00;
transfer_byte(0x88); /* 命令CS5520进行AD转换 */
SID=0x00;
SOD=0x01;
SCLK=0x00;
CS=0x01;
}
/*************************************************************************************************************************
*子程序名 :write_to_register
*输入 :command,low_byte,mid_byte,high_byte
*输出 :无
*该子程序命令CS5520对内部寄存器进行写操作.
*************************************************************************************************************************/
void write_to_register(char command,char low_byte,char mid_byte,char high_byte)
{
CS=0x00;
SID=0x00;
SOD=0x01;
SCLK=0x00;
transfer_byte(command);
transfer_byte(high_byte);
transfer_byte(mid_byte);
transfer_byte(low_byte);
SID=0x00;
SOD=0x01;
SCLK=0x00;
CS=0x01;
}
/*************************************************************************************************************************
*子程序名 :read_register
*输入 :command
*输出 :low_byte,mid_byte,high_byte
*该子程序读取CS5520内部寄存器的值.
*************************************************************************************************************************/
void read_register(char command)
{
CS=0x00;
SID=0x00;
SOD=0x01;
SCLK=0x00;
transfer_byte(command);
high_byte=receive_byte();
mid_byte=receive_byte();
low_byte=receive_byte();
SID=0x00;
SOD=0x01;
SCLK=0x00;
CS=0x01;
}
/*************************************************************************************************************************
*子程序名 :AD_get
*输入 :无
*输出 :high_byte,mid_byte,low_byte
*该中断服务子程序读取CS5520 AD转换的数据.
*************************************************************************************************************************/
void AD_get() interrupt 2 using 2
{ EA=0;
CS=0x00;
SID=0x00;
SCLK=0x00;
high_byte=receive_byte();
mid_byte=receive_byte();
low_byte=receive_byte();
verin=high_byte;
HtoASCII();
buffer1[4]=verout1;
buffer1[5]=verout2;
verin=mid_byte;
HtoASCII();
buffer1[6]=verout1;
buffer1[7]=verout2;
verin=low_byte;
HtoASCII();
buffer1[8]=verout1;
buffer1[9]=verout2;
SCLK=0x00;
CS=0x01;
EA=1;
}
/*************************************************************************************************************************
*子程序名 :Communication
*输入 :无
*输出 :无
*该中断服务子程序与上位计算机进行串行通信.
*************************************************************************************************************************/
void Communication() interrupt 4 using 1
{ RI=0;
EA=0;
Comin=SBUF;
switch(Comin)
{ case 0x40:
{ chct=0x01;
repm=0x01;
pointer=0;
buffer[pointer]=Comin;
}break;
case 0x0d:
{ if(repm)
{ buffer[++pointer]=Comin;
pointer=pointer-4;
verout1=buffer[pointer];
verout2=buffer[pointer+1];
ASCIItoH();
buffer[pointer]=verin;
verout1=buffer[pointer+2];
verout2=buffer[pointer+3];
ASCIItoH();
buffer[pointer+1]=verin;
buffer[pointer+2]=0x0d;
CRC(&buffer[1]);
if((CH1==0)&&(CL1==0))
{ buffer1[0]=0x40;
buffer1[1]=N;
buffer1[2]=0x52;
buffer1[3]=0x44;
buffer1[10]=0x0d;
CRC(&buffer1[1]);
verin=CH1;
HtoASCII();
buffer1[10]=verout1;
buffer1[11]=verout2;
verin=CL1;
HtoASCII();
buffer1[12]=verout1;
buffer1[13]=verout2;
buffer1[14]=0x0d;
SendData();
}
}
}break;
default:
{ if(repm)
{ if(chct)
{ if(Comin!=N) repm=0;
chct=0;
}
buffer[++pointer]=Comin;
}
}
}
EA=1;
}
/**************************************************************************************************************************
*子程序名 :receive_byte
*输入 :无
*输出 :rdata
*该子程序从CS5520读取一个字节的数据.
**************************************************************************************************************************/
uchar receive_byte(void)
{ uchar data i=8,rdata=0;
while(i--)
{ rdata=(rdata<<1)|SOD; //rdata<<=1;
//rdata|=SOD;
SCLK=0x01;
SCLK=0x00;
}
return rdata;
}
/**************************************************************************************************************************
*子程序名 :transfer_byte
*输入 :var
*输出 :无
*该子程序将一个字节的数据向CS5520传送.
**************************************************************************************************************************/
void transfer_byte(uchar var)
{ uchar data i=8;
SCLK=0x00;
while(i--)
{ var<<=1; //SID=(bit)(var&0x80);
SID=CY; //var<<=1;
SCLK=0x01;
SCLK=0x00;
}
SID=0x00;
}
/*************************************************************************************************************************
*子程序名 :chnl_change
*输入 :no
*输出 :无
*该子程序控制CD4052切换到所要求的模拟输入通道.
*************************************************************************************************************************/
void chnl_change(char no)
{ EA=0;
switch(no)
{ case 0x01:{ CS2=1;
CS1=0;
CA=0;
CB=0;}break;
case 0x02:{ CS2=1;
CS1=0;
CA=1;
CB=0;}break;
case 0x03:{ CS2=1;
CS1=0;
CA=0;
CB=1;}break;
case 0x04:{ CS2=1;
CS1=0;
CA=1;
CB=1;}break;
case 0x05:{ CS1=1;
CS2=0;
CA=0;
CB=0;}break;
case 0x06:{ CS1=1;
CS2=0;
CA=1;
CB=0;}break;
case 0x07:{ CS1=1;
CS2=0;
CA=0;
CB=1;}break;
case 0x08:{ CS1=1;
CS2=0;
CA=1;
CB=1;}break;
default: break;
}
delay();
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -