51单片机驱动12位AD转换TLC2543电路图+程序
时间:11-30
来源:互联网
点击:
下面是电路图和仿真图:
TI公司的12位AD转换TLC2543芯片比ADC0832的8位AD转换芯片,精度要高很多,ADC0832的精度是255分之1,而TLC2543 由于二进制数的位数是12bit,所以精度要高出很多,它的精度为4096分之一。以下为89C51单片机控制C语言程序和电路连接图。完整的工程文件及hex文件下载:http://www.51hei.com/f/tlccadc.rar是用stc89c51单片机制作的 成品正在使用中.
#include
#define uint unsigned int
#define uchar unsigned char
sbit cs=P1^0;
sbit clk=P1^3;
sbit sdi=P1^4;
sbit sdo=P1^5;
sbit bit7=B^7;
sbit freq_out=P3^7;
bit cy;
uint adval,volt,froq;
uchar temp;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delayms(uint ms)
{
uchar j;
while(ms--)
{
for(j=0;j<120;j++);
}
}
void delay()
{
uint i=5;
while(i--);
}
void readADC(int ch)
{
uchar i;
clk=0;
cs=1;
delay();
cs=0;//CS=0开始转换
B=ch;
for(i=8;i>0;i--)
{
cy=sdo;
sdi=bit7;
clk=1;
B=B<1;
clk=0;
temp=temp<1;
if(cy==1)
temp++;
}
adval=temp;
adval=adval<4;
for(i=4;i>0;i--)
{
cy=sdo;
temp=temp<1;
if(cy==1)
temp++;
clk=1;
clk=0;
}
cs=1;//十二位读数完毕,结束转换。
adval +=temp;
volt=adval;
froq=adval;
}
void resultvolt()
{
volt=volt*5000.0/4334;//转换成电压显示
}
void resultfroq()
{
froq=1000000.0/froq*2/2.0;//转换频率数值
}
void displayvolt(uint dat)
{
P2=0x10;
P0=tab[dat/1000]&0x7f;
delayms(1);
P0=0xff;
P2=0x20;
P0=tab[dat%1000/100];
delayms(1);
P0=0xff;
P2=0x40;
P0=tab[dat%100/10];
delayms(1);
P0=0xff;
P2=0x80;
P0=tab[dat%10];
delayms(1);
P0=0xff;
}
void displayfroq(uint dat)
{
P2=0x01;
P0=tab[dat/1000]&0x7f;
delayms(1);
P0=0xff;
P2=0x02;
P0=tab[dat%1000/100];
delayms(1);
P0=0xff;
P2=0x04;
P0=tab[dat%100/10];
delayms(1);
P0=0xff;
P2=0x08;
P0=tab[dat%10];
delayms(1);
P0=0xff;
}
void t0_int() interrupt 1
{
TH0=-froq/256;
TL0=-froq%256;
}
void t0_init(void)
{
TMOD=0x01;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
t0_init();
P2=0xff;
P0=0xff;
while(1)
{
readADC(0);
delayms(1);
resultvolt();
resultfroq();
displayfroq(froq);
displayvolt(volt);
}
}
TI公司的12位AD转换TLC2543芯片比ADC0832的8位AD转换芯片,精度要高很多,ADC0832的精度是255分之1,而TLC2543 由于二进制数的位数是12bit,所以精度要高出很多,它的精度为4096分之一。以下为89C51单片机控制C语言程序和电路连接图。完整的工程文件及hex文件下载:http://www.51hei.com/f/tlccadc.rar是用stc89c51单片机制作的 成品正在使用中.
#include
#define uint unsigned int
#define uchar unsigned char
sbit cs=P1^0;
sbit clk=P1^3;
sbit sdi=P1^4;
sbit sdo=P1^5;
sbit bit7=B^7;
sbit freq_out=P3^7;
bit cy;
uint adval,volt,froq;
uchar temp;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delayms(uint ms)
{
uchar j;
while(ms--)
{
for(j=0;j<120;j++);
}
}
void delay()
{
uint i=5;
while(i--);
}
void readADC(int ch)
{
uchar i;
clk=0;
cs=1;
delay();
cs=0;//CS=0开始转换
B=ch;
for(i=8;i>0;i--)
{
cy=sdo;
sdi=bit7;
clk=1;
B=B<1;
clk=0;
temp=temp<1;
if(cy==1)
temp++;
}
adval=temp;
adval=adval<4;
for(i=4;i>0;i--)
{
cy=sdo;
temp=temp<1;
if(cy==1)
temp++;
clk=1;
clk=0;
}
cs=1;//十二位读数完毕,结束转换。
adval +=temp;
volt=adval;
froq=adval;
}
void resultvolt()
{
volt=volt*5000.0/4334;//转换成电压显示
}
void resultfroq()
{
froq=1000000.0/froq*2/2.0;//转换频率数值
}
void displayvolt(uint dat)
{
P2=0x10;
P0=tab[dat/1000]&0x7f;
delayms(1);
P0=0xff;
P2=0x20;
P0=tab[dat%1000/100];
delayms(1);
P0=0xff;
P2=0x40;
P0=tab[dat%100/10];
delayms(1);
P0=0xff;
P2=0x80;
P0=tab[dat%10];
delayms(1);
P0=0xff;
}
void displayfroq(uint dat)
{
P2=0x01;
P0=tab[dat/1000]&0x7f;
delayms(1);
P0=0xff;
P2=0x02;
P0=tab[dat%1000/100];
delayms(1);
P0=0xff;
P2=0x04;
P0=tab[dat%100/10];
delayms(1);
P0=0xff;
P2=0x08;
P0=tab[dat%10];
delayms(1);
P0=0xff;
}
void t0_int() interrupt 1
{
TH0=-froq/256;
TL0=-froq%256;
}
void t0_init(void)
{
TMOD=0x01;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
t0_init();
P2=0xff;
P0=0xff;
while(1)
{
readADC(0);
delayms(1);
resultvolt();
resultfroq();
displayfroq(froq);
displayvolt(volt);
}
}
51单片机12位AD转换TLC254 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)