|
以下为AD转换程序,希望大家参考下,有更好的请加贴指点......
#include <iom16v.h>
#include <macros.h>
#include "delay.h"//延时程序记得自己加进去哦!!!
#define uchar unsigned char
#define uint unsigned int
#define uint32 unsigned long
uchar Table[10]={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[0]=Indata/1000; //在将最大值化为电压的最大值,不过要注意的是
Indata=Indata%1000; //转化过程会变成浮点型的,所以要强制把转化结果
Outdata[1]=Indata/100; //变为浮点型在转化字符型
Indata=Indata%100;
Outdata[2]=Indata/10;
Outdata[3]=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[Dispdata];
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);
}
}
贴出原理图
原理图 (原文件名:SCH.jpg) |
|
|
|
|