TI的12位多通道串行ADC,源码如下:
#include <mega16.h>
#include <delay.h>
#define EOC PINB.0 //转换结束标志位
#define CLK PORTB.1 //时钟位
#define D_OUT PORTB.2 //数据输出位
#define D_IN PINB.3//数据输入位
#define CS PORTB.4 //片选
#define KEY1 PINC.0
#define KEY2 PINC.1
#define KEY3 PINC.2
#define KEY4 PINC.3
bit juder=0;
/*----------------TLC2543驱动程序----------------
//input data bit:d7,d6,d5,d4通道选择
// d3,d2:00 12bit;01 8bit;
// d1 0 MSB first;1 LSB first;
// d0 0 BINARY
参数:address 地址0~10;
返回值:获得的前次选定通道的值
--------------------------------------------------*/
uint Get_TLC2543_Adc(uchar address)
{
uchar t;
uchar ADCH,ADCL;
address<<=4;
address&=0xf0;//是二位模式,高位在前
CLK=0;
CS=0;//必须延时1.5uS以上才能开始发送时钟脉冲
ADCH=0;
ADCL=0;
for(t=0;t<4;t++)//输入下一次地址,同时接收上次高四位
{
D_OUT=address&0x80;//上升沿移入数据
address<<=1;
CLK=1;
ADCH<<=1; //下降沿移出数据
ADCH+=D_IN;
CLK=0;
}
for(t=0;t<8;t++)//输入命令,同时接收上次低四位
{
D_OUT=address&0x80;
address<<=1;
CLK=1;
ADCL<<=1;
ADCL+=D_IN;
CLK=0;
}
return (uint)ADCH*256+ADCL;
}
void display(unsigned char number,unsigned char position)//digtial show function
{
DDRA=0Xff;//set PORTA output
  ORTA=0XFF;//set PORTA output in high level
switch(position)//choice the position
{
case 1:{PORTA&=0xf8;break;}
case 2:{PORTA&=0xf9;break;}
case 3:{PORTA&=0Xfa;break;}
case 4:{PORTA&=0Xfb;break;}
case 5:{PORTA&=0Xfc;break;}
case 6:{PORTA&=0Xfd;break;}
case 7:{PORTA&=0Xfe;break;}
case 8:{PORTA&=0Xff;break;}
}
switch(number)//show number
{
case 0:{PORTA&=0x87;break;} //0
case 1:{PORTA&=0x8f;break;} //1
case 2:{PORTA&=0x97;break;} //2
case 3:{PORTA&=0x9f;break;} //3
case 4:{PORTA&=0xa7;break;} //4
case 5:{PORTA&=0xaf;break;} //5
case 6:{PORTA&=0xb7;break;} //6
case 7:{PORTA&=0xbf;break;} //7
case 8:{PORTA&=0xc7;break;} //8
case 9:{PORTA&=0xcf;break;} //9
default:{PORTA=0xff;break;} //null
}
}
uchar Key_Scan(void)
{
uint t=0;
if(juder)
{
while(!KEY1){t++;if(t>1000){juder=0;return 1;}}
t=0;
while(!KEY2){t++;if(t>1000){juder=0;return 2;}}
t=0;
while(!KEY3){t++;if(t>1000){juder=0;return 3;}}
t=0;
while(!KEY4){t++;if(t>1000){juder=0;return 4;}}
}
else if(KEY1&&KEY2&&KEY3&&KEY4)juder=1;
return 0;
}
void main(void)
{
uchar t=0,time=0;
uchar key=0,port=0;
int res1=0;
PORTB=0XFF;
DDRB=0XF6;
PORTC=0XFF;
DDRC=0X00;
PORTB=0X00;
while(1)
{
if(time==10)
{
time=0;
res1=0;
if(port>10)port=0;
for(t=0;t<6;t++)
{
if(t)res1+=Get_TLC2543_Adc(port);
}
res1=res1/5;
}
key=Key_Scan();
if(key==1)port++;
if(key==2)port--;
display(port%10,2);delay_us(1000); //显示通道
display(port/10,1);delay_us(1000);
display(res1%10,8);delay_us(1000);//显示ad值
display((res1/10)%10,7);delay_us(1000);
display((res1/100)%10,6);delay_us(1000);
display((res1/1000)%10,5);delay_us(1000);
time++;
}
}
|