#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口多次采样求平均值的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)