下面是我用TLC2543写的一个应用程序,使用流水灯来显示DA输出的程序,但它不工作,DA输出总是0,麻烦各位高手帮忙看看呀,不胜感激!!!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//********************************************************************************************
// TLC2543控制位宏定义
//*********************************************************************************************
sbit AD_EOC=P1^0;
sbit AD_IO_CLOCK=P1^1;
sbit AD_DATA_IN=P1^2;
sbit AD_DATA_OUT=P1^3;
sbit AD_CS_2543=P1^4;
//************************************************************************************
//功能:延时函数
//************************************************************************************
delay(uchar t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<1000;j++);
}
void delay_us() // 固定延时6微秒
{
unsigned char n=0;
for(n=15;n>0;n--)
{
_nop_();
}
}
//********************************************************************************************
// AD转换程序
//********************************************************************************************
/*
TLC2543的DATAINPUT的高8位控制字格式如下(低8位无效):
D7 D6 D5 D4 D3 D2 D1 D0
通道选择
0000---AIN0 01---8BIT 0---MSB first 0---Unipolar
0001---AIN1 10---12BIT 1---LSB first 1---Bipolar
0010---AIN2 11---16BIT
0011---AIN3
0100---AIN4
0101---AIN5
0110---AIN6
0111---AIN7
1000---AIN8
1001---AIN9
1010---AIN10
*/
//chunnle 0-10 均为16 bits,MSB first, unipolar
static const uchar ad_chunnle_select[11]=
{
0x0c,//AD chunnle 00 select
0x1c,//AD chunnle 01 select
0x2c,//AD chunnle 02 select
0x3c,//AD chunnle 03 select
0x4c,//AD chunnle 04 select
0x5c,//AD chunnle 05 select
0x6c,//AD chunnle 06 select
0x7c,//AD chunnle 07 select
0x8c,//AD chunnle 08 select
0x9c,//AD chunnle 09 select
0xac//AD chunnle 10 select
};
//TLC2543读出上一次AD值(12位精度),并开始下一次转换
uint ad2543work(uchar chunnle_select)
{
uint din;
uchar dout,i;
din=0;
dout=ad_chunnle_select[chunnle_select]; //选择控制命令
while(AD_EOC==0);
AD_IO_CLOCK=0;
AD_CS_2543=0;
for(i=0;i<16;i++)
{
if(dout&0x80)
{AD_DATA_IN=1;} //控制命令从MSB-LSB,向AD发数
else
{AD_DATA_IN=0;}
AD_IO_CLOCK=1;
dout<<=1;
din<<=1;
delay_us;
if(AD_DATA_OUT==1)
{din|=0x0001;} // 接收AD数据,从MSB-LSB
AD_IO_CLOCK=0;
delay_us;
}
AD_CS_2543=1;
return(din>>4); //12位精度
}
//************************************************************************************
//功能:主程序
//************************************************************************************
main()
{
uint kk=0x0000; //存储A/D采集的数字量
while(1)
{
kk=ad2543work(0); //采一次数据
P0=~(kk>>4); //P0=~(kk/128); //取其高八位
delay(10); //延时一段时间
}
} |