adc8080的ad转换单片机程序

adc8080的ad转换单片机程序,第1张

#include "reg51h"

#define data_point P0

sbit EOC=P2^0;

sbit ADDA=P2^1;

sbit ADDB=P2^2;

sbit ADDC=P2^3;

sbit OE=P2^5;

sbit START=P2^6;

sbit CLK=P2^7;

sbit ALE=P2^6;

unsigned char disp[3]={0,0,0};

char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned char t0count=0;

unsigned int temp;

double sum;

unsigned char val_Integer; //整数

unsigned int val_Decimal; //小数

sbit k1 = P1^0;

sbit k2 = P1^1;

sbit k3 = P1^2;

sbit k4 = P1^3;

void delay(unsigned char ms)

{

unsigned char i;

while(ms--)

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

}

void display()

{

disp[0]=disp[0]&0x7f;

P3= disp[0];

k1 = 1;

delay(2);

k1 = 0;

P3= disp[1];

k2 = 1;

delay(2);

k2 = 0;

P3= disp[2];

k3 = 1;

delay(2);

k3 = 0;

P3= disp[3];

k4 = 1;

delay(2);

k4 = 0;

}

unsigned char ADC0808()

{

unsigned char d;

ADDC=0;

ADDB=0;

ADDA=0;

TR1=1;

ALE=1;ALE=0;

START=1;START=0;

while(EOC==0);

OE=1;

d=data_point;

OE=0;

TR1=1;

return d;

}

void covert(unsigned char x)

{

sum=x00201378;

val_Integer=(unsigned char)sum;

val_Decimal=(unsigned int)((sum-val_Integer)1000);

disp[3]=dispcode[val_Decimal%10];

disp[2]=dispcode[val_Decimal/10%10];

disp[1]=dispcode[val_Decimal/100];

disp[0]=dispcode[val_Integer];

}

void main()

{

TMOD=0x21;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TH1=256-2;

ET0=1;

ET1=1;

EA=1;

TR0=1;

OE=0;

START=0;

EOC=1;

while(1)

{

display();

}

}

void time0() interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

t0count++;

if(t0count==100)

{

t0count=0;

covert(ADC0808());

}

}

void time1() interrupt 3

{

CLK=~CLK;

}

DDRC=0X00;

PORTC=0X00;

ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADATE)|(1<<ADSC); //ADC使能

ADMUX=0x43;

atmega88只有6路输入没有ADC6或者ADC7,只能用PC0~PC5

简单点,建立32位变量A,每采样一次就加到A,采样完8次再除以8就好了,

u16 ADC_ZKB(u8 Channel)

{

u32 value1=0;

u16 value;

u8 i;

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

{

ADC_CSR = Channel & 0x0F; // 选择AD转换通道

ADC_CR1 |= 0x01; // 启动AD转换

while(!(ADC_CSR & 0x80)); // 等待AD转换完成

value = ADC_DRL;

value |=((ADC_DRH<<8)&0X0300);

value1+=value;

ADC_CSR = 0x00;

}

return (value1/8);

}

大概这意思,怎么定义32位数,这个自己去查,因为AD采样时间比较久,估计这样FOR可能不合适,自己可以改改。

ad采样值只有上电瞬间值正常的原因有:AD采样电路存在问题、AD采样程序存在问题、环境干扰引起采样值不准确。

1、AD采样电路存在问题,例如电容充放电不充分、电阻失效等,导致采样值不准确。建议检查电路设计和元器件的选型是否合理,并使用示波器等工具对电路进行测试和调试。

2、AD采样程序存在问题,例如采样频率设置不正确、采样时间过短等,导致采样值只有上电瞬间值正常。建议检查程序设计是否正确,并对程序进行优化和调试。

3、环境干扰引起采样值不准确,例如电源干扰、电磁干扰等。建议在AD采样电路和处理器之间加入滤波电路,以减小环境干扰的影响。

PIC单片机在某一时间段内只能采集开启一个AD转换通道来进行采集,你可以通过模拟通道选择位来进行通道选择的先后顺序/

可以定义一个数组用来存放采集数据

先使能AD采样,进中断清标志位,配置通道(如AN0),把采样结果存入数组

轮流进行

采集时间一结束,即可启动 A/D 转

换。 可将采集时间编程设定在 GO/DONE位置1和实际

转换启动之间。

可参考pic的PDF资料

以上就是关于adc8080的ad转换单片机程序全部的内容,包括:adc8080的ad转换单片机程序、求atmega88单片机的AD采样程序,另外如果用ADC6或者ADC7作采样通道在程序上应该怎么写、求修改单片机AD口多次采样求平均值的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10144154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存