jundg1987 发表于 2010-4-9 00:49:11

发个以调试好的AVR16_AD程序.之前在网上找的都是有问题的.希望能够协助初学者.

以下为AD转换程序,希望大家参考下,有更好的请加贴指点......
#include <iom16v.h>
#include <macros.h>
#include "delay.h"//延时程序记得自己加进去哦!!!
#define uchar unsigned char
#define uintunsigned int
#define uint32 unsigned long
uchar Table={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[]={0,0,0,0};
void AdInit()
{
   DDRA=0X00;//ADC0为模拟输入
   ADMUX=0X40;//选择AVCC为电压参考源
   ADCSRA=((1<<ADEN)|(0<<ADSC)|(0<<ADIE));
   }

uint ReadData()
{   
uint temp;
ADCSRA|=(1<<ADSC);            //启动ADC开始转换
while ((ADCSRA&0x10)!=0x10);//等待ADC转换结束
ADCSRA|=(1<<ADIF);                        //写1清除标志位
ADCSRA&=~(1<<ADSC);            //启动ADC开始转换
   temp=(uint)ADCL;
       temp=(uint)(ADCH<<8)+temp;
return temp;
}
void Process(uint Indata,uchar *Outdata)
{ Indata=(uint)(((float)(Indata/20.40))*100);//要显示实际电压必须的先把16进制转10进制
Outdata=Indata/1000;            //在将最大值化为电压的最大值,不过要注意的是
Indata=Indata%1000;               //转化过程会变成浮点型的,所以要强制把转化结果
Outdata=Indata/100;            //变为浮点型在转化字符型
Indata=Indata%100;
Outdata=Indata/10;
Outdata=Indata%10;
}
void Display(uchar *Dispdata)
{
uchar move=0x01;
uchar i;
DDRB=0Xff;
DDRD=0Xff;
for(i=0;i<4;i++)
{
   PORTB=move;
   PORTD=0xff-Table];
if(i==0)
   PORTD&=0x7f;
else
PORTD|=0x80;
   delay_ms(5);
   move=(move<<1);
}
}

void main(void)
{
uint num;
AdInit();
while(1)
{
num=ReadData();
Process(num,Data);
Display(Data);
}
}
贴出原理图
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544700.jpg
原理图 (原文件名:SCH.jpg)

liliuqun 发表于 2010-4-9 06:11:00

可以贴出电路图不

zhc7302 发表于 2010-4-9 08:07:59

MARK

hjs666 发表于 2013-3-3 09:51:37

这用什么来做显示的?
页: [1]
查看完整版本: 发个以调试好的AVR16_AD程序.之前在网上找的都是有问题的.希望能够协助初学者.