1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > adc0808模数转换实验报告_模数转换ADC0832 ADC0808和ADC0809的利用

adc0808模数转换实验报告_模数转换ADC0832 ADC0808和ADC0809的利用

时间:2022-04-21 07:41:53

相关推荐

adc0808模数转换实验报告_模数转换ADC0832 ADC0808和ADC0809的利用

/***************************************************************

利用AT89c51单片机和ADC0808(ADC0809)ADC0832进行模数转换,进行电压测试

数码管采用共阳极,要显示小数点,则小数点位二进制数最高为应为0,在0-9的8421BCD

码中,最高位都为1,所以把输出数据的BCD码与0x7F“相与”才能实现带小数点的显示。

****************************************************************/

#include#include#define uint unsigned int

#define uchar unsigned char

//******************adc0832****************************//

sbit CS=P2^3; //使能。

sbit CLK=P2^2;//时钟

sbit DO=P2^1; // 数据输出

sbit DI=P2^0;//数据输入

char CC[]="11001001";

uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

uchar temp;

uint vvv,i;

//通道的选择:0x02就是单通道0;0x03就是单通道1;

//0x00就是双通道ch0="+"; ch0="-"

//0x01就是双通道ch0="-"; ch0="+"

//*****************************************************//

void delay(int tt)

{

while(tt--)

{for(i=0;i<120;i++);}

}

void startADC()

{

CS=1;

_nop_();

_nop_();

CLK=0;

_nop_();

_nop_();

CS=0;

_nop_();

_nop_();

DI=1;

_nop_();

_nop_();

CLK=1;

_nop_();

_nop_();

DI=0;

_nop_();

_nop_();

CLK=0;

_nop_();

_nop_();

}

void choiceADC(uint CH)//CH为0选择通道ch0,为1,选择ch1进行AD转换

{

startADC();

if(CH==0)

{

DI=1;

_nop_();

CLK=1;//上升沿DI=1

_nop_();

CLK=0;//1个下降沿DI=1

_nop_();

DI=0;

_nop_();

CLK=1;

_nop_();

CLK=0;//第3个上升沿DI=0

_nop_();

}

else

{

DI=1;

_nop_();

CLK=1;//上升沿DI=1

_nop_();

CLK=0;//1个下降沿DI=1

_nop_();

DI=1;

_nop_();

CLK=1;

_nop_();

CLK=0;//第3个上升沿DI=1

_nop_();

}

/********通道选择结束开始读取转换后的二进制数****/

CLK=1;

_nop_();

CLK=0;//下降沿读数,一下进行判断和处理,共8次

for(i=0;i<8;i++)

{

DI=1;

if(DO)

{

temp |=0x01;

}

else

{

temp &=0xfe;

}

CLK=0;

_nop_();

CLK=1;

temp=temp<<1;

}

vvv=temp*500.0/255;

}

void display(uint dat)

{

P3=0x04;

P0=tab[dat/100];

P0 &=0x7f;//实现带小数点位显示小数点。

delay(1);

P0=0xff;

P3=0x02;

P0=tab[dat%100/10];

delay(1);

P0=0xff;

P3=0x01;

P0=tab[dat%10];

delay(1);

P0=0xff;

}

void main()

{

P3=0xFF;

P0=0xff;

while(1)

{

choiceADC(0);

delay(1);

display(vvv);

}

#include#include#define uchar unsigned char

#define uint unsigned int

sbit OE =P2^7;

sbit EOC =P2^6;

sbit start=P2^5;

sbit CLOCK=P2^4;

sbit CS4 =P2^3;

sbit CS3 =P2^2;

sbit CS2 =P2^1;

sbit CS1 =P2^0;

uint vvv,vot;

uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay(uint ms)

{

uchar j;

while(ms--)

for(j=0;j<120;j++);

}

void ADCread()

{

start=0;

start=1;

start=0;//开始转换

while(EOC==0);//等待转换结束

OE=1;

vvv=P1;//向单片机发出转换结果存VVV中

OE=0;

}

void votexcheng()//根据显示要求换算成显示电压值

{

/**单片机8为对应最大数255,对应最大电压V(此处为5V)换算如下**/

vot=vvv*5/255;//如最大量程8V,则乘800,依次类推

}

void display(uint dat)

{

CS1=1;CS1=0;CS3=0;CS4=0;

P0=~tab[dat/100|0x80];

delay(1);

P0=0xff;

CS1=0;CS1=0;CS3=1;CS4=0;

P0=tab[dat%100/10];

delay(1);

P0=0xff;

CS1=0;CS1=0;CS3=0;CS4=1;

P0=tab[dat%10];

delay(1);

P0=0xff;

}

void t0() interrupt 1

{

CLOCK=~CLOCK;

}

void t0_init()//开启定时器定时,计时满后产生中断以便产生CLK时钟

{

TMOD=0x02;

TH0=0x14;

TL0=0x00;

TR0=1;

ET0=1;

EA=1;

}

void main()

{

t0_init();

while(1)

{

ADCread();

votexcheng();

display(vot);

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。