|
/*
* ADconvert.c
*
* Created: 2018-09-11 14:21:14
* Author: Administrator
AD轉(zhuǎn)換電壓值可以進(jìn)行數(shù)碼管顯示
*/
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
//數(shù)碼管的段碼
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};
//數(shù)模轉(zhuǎn)換
void AD_convert0()
{
volatile uint result0;
ADMUX=0b00000000;//AD通道選擇PA0
_delay_ms(5);
result0=(uint)(ADC*5.0/1023.0);//讀取ADC結(jié)果
disp_buf[0]=result0/100;
disp_buf[1]=result0/100%10;
disp_buf[2]=result0%10;//分解出三位數(shù)分別存放至顯示緩存
}
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 設(shè)置成輸入
DDRC=0xFF;PORTC=0xFF;
DDRD=0xFF;PORTD=0xFF;//C D 端口初始化
uint i;
ADCSRA=0xE0;//AD控制寄存器,11100000,自由轉(zhuǎn)換模式,2分頻
_delay_ms(2000);//等待系統(tǒng)穩(wěn)定
while(1)
{
AD_convert0();
for(i=0;i<4;i++)
{
PORTC=0xFF;
PORTD=_BV(i);
PORTC=seg_code[disp_buf[i]];//顯示對(duì)應(yīng)的數(shù)值
if (i==0||i==4)
{
PORTC&=0x7F;//小數(shù)點(diǎn)
}
_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);
}
}
}
以上是代碼部分,電路圖也上傳了。想問(wèn)一下各位,為什么我用Prteus仿真的時(shí)候,數(shù)碼管只能顯示一路的轉(zhuǎn)換值,而且還不準(zhǔn)確也不能實(shí)時(shí)刷新AD結(jié)果。另一路AD結(jié)果完全就不能顯示。
|
-
電路圖.jpg
(151.37 KB, 下載次數(shù): 34)
下載附件
2018-9-13 09:08 上傳
|