我昨天刚编的程序,没有仿真过,请参考,并指正
/*************************************************************
文件名称:tlc0834.c
适用范围:模拟量信号的采集
*************************************************************/
#include <reg52.h>
#include <intrins.h>
#define unsigned char uchar
#define unsigned int uint
/* 常量定义,此部分以后要归到总头文件 */
/* AD转换的入口参数,仅低4位有意义,高4位恒0,低4位意义依次为:StartBit|SGL|ODD|SelectBit
其中起始位恒为1,这里不归入此字节 */
#define DIFFERENTIAL_0_1 0x08 //差分输入,CH0 + ,CH1 -,下三类似
#define DIFFERENTIAL_1_0 0x0a
#define DIFFERENTIAL_2_3 0x09
#define DIFFERENTIAL_3_2 0x0b
#define COMMEN_CHANNEL_0 0x0c //单一通道采集,通道0相对于GND
#define COMMEN_CHANNEL_1 0x0e
#define COMMEN_CHANNEL_2 0x0d
#define COMMEN_CHANNEL_3 0x0f
/* 定义tlc0834的控制线 */
sbit AD_CLK =
sbit AD_DI =
//sbit AD_SARS = //此管脚自动变高变低,不占用I/O口
sbit AD_DO =
sbit AD_CS =
/* 函数声明部分 */
uchar Gather(uchar ucDt);
uchar AD0834(void);
/*************************************************************
函数功能:该函数用来从tlc0834采集数据
应用范围:外部调用
入口参数:AD转换的入口参数,确定采集的通道和方式
出口参数:采集的数据
*************************************************************/
uchar Gather(uchar ucChnl)
{
unsigned char ucDt = 0;
unsigned char ucDt1 = 0;
ucDt = AD0834(ucChnl); //采集一次
if (ucDt)
ucDt1 = ucDt; //返回值不为0,有效
delay(50);
ucDt = AD0834(ucChnl);
while(ucDt1 != ucDt)
{
if(ucDt)
ucDt1 = ucDt;
delay(50);
ucDt = AD0834(ucChnl);
}
return(ucDt1);
}
/*************************************************************
函数功能:该函数用来从tlc0834中得到一次采集的数据
应用范围:内部使用
入口参数:所要采集的通道和方式
出口参数:一次采集后的数据
*************************************************************/
uchar AD0834(uchar ucDt)
{
unsigned char i,ucMask = 0x80;
unsigned char ucMask1 = 0x08;
unsigned char ucDt1 = 0;
unsigned char ucDt2 = 0;
AD_CS = 0;
AD_CLK = 1;
_nop_();_nop_();
for(i = 0;i < 4;i++) //先输入采样的通道和方式
{
AD_CLK = 0;
_nop_();_nop_();
if(ucDt & ucMask1)
DI = 1;
else
DI = 0;
AD_CLK = 1;
ucMask > > = 1;
}
AD_CLK = 0; //空一个CLOCK,再去读数据
_nop_();_nop_();
AD_CLK = 1;
for(i = 0;i < 7; i++) //先读高7位到ucDt1
{
AD_CLK = 0;
if(AD_DO)
ucDt1 |= ucMask;
ucMask > > = 1;
AD_CLK = 1;
}
AD_CLK = 0;
if(AD_DO)
{
ucDt1 |= ucMask; //再读bit0到ucDt1
ucDt2 |= ucMask; //读bit0到ucDt2
}
// AD_SARS = 0;
AD_CLK = 1;
for(i = 0;i < 7; i++)
{
ucMask < <= 1;
AD_CLK = 0;
if(AD_DO)
ucDt1 |= ucMask;
AD_CLK = 1;
}
AD_CS = 1;
if(ucDt1 == ucDt2)
return(ucDt1);
else
return(0);
}
发表时间:2003年6月24日13:49:13