查看: 1018|回复: 0
打印 上一主题 下一主题

发个以调试好的AVR16_AD程序

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-17 14:44:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下为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)







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表