/*
* ADconvert.c
*
* Created: 2018-09-11 14:21:14
* Author: Administrator
AD转换电压值可以进行数码管显示
*/
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
//数码管的段码
const uchar seg_code[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
//4位8位不显示
volatile uchar disp_buf[]={0,0,0,10,0,0,0,10};
//数模转换
void AD_convert0()
{
volatile uint result0;
ADMUX=0b00000000;//AD通道选择PA0
_delay_ms(5);
result0=(uint)(ADC*5.0/1023.0);//读取ADC结果
disp_buf[0]=result0/100;
disp_buf[1]=result0/100%10;
disp_buf[2]=result0%10;//分解出三位数分别存放至显示缓存
}
void AD_convert1()
{
volatile uint result1;
ADMUX=0b00000001;//AD通道PA1
_delay_ms(5);
result1=(uint)(ADC*500.0/1023.0);
disp_buf[4]=result1/100;
disp_buf[5]=result1/100%10;
disp_buf[6]=result1%10;
}
int main(void)
{
DDRA=0xFC;//PA0 PA1 设置成输入
DDRC=0xFF;PORTC=0xFF;
DDRD=0xFF;PORTD=0xFF;//C D 端口初始化
uint i;
ADCSRA=0xE0;//AD控制寄存器,11100000,自由转换模式,2分频
_delay_ms(2000);//等待系统稳定
while(1)
{
AD_convert0();
for(i=0;i<4;i++)
{
PORTC=0xFF;
PORTD=_BV(i);
PORTC=seg_code[disp_buf[i]];//显示对应的数值
if (i==0||i==4)
{
PORTC&=0x7F;//小数点
}
_delay_ms(1);
}
AD_convert1();
for (i=4;i<8;i++)
{
PORTC=0xFF;
PORTD=_BV(i);
PORTC=seg_code[disp_buf[i]];
if (i==0||i==4)
{
PORTC&=0x7F;
}
_delay_ms(1);
}
}
}
以上是代码部分,电路图也上传了。想问一下各位,为什么我用Prteus仿真的时候,数码管只能显示一路的转换值,而且还不准确也不能实时刷新AD结果。另一路AD结果完全就不能显示。
|