原创 AVR中AD转换程序(转贴别人的算一个记号)

2007-10-6 14:30 6289 9 10 分类: MCU/ 嵌入式
嘿嘿,这两天在看别人写的AVR中AD转换程序,自已拼凑起一个能用的,觉得蛮好玩。贴出来共享
下面这个程序在ATMEGA16L上通过,直接在LCM上显示PA0口的电压。单位是0.1mV
本程序只是偶试验AVR的AD转换功能而写,也并非我原创,只是消化了别人的程序凑起来的。但绝对能用。
同时也望大虾们指点一二。
//单端通道,不放大
#define AD_SE_ADC0 0x00 //ADC0
#define AD_SE_ADC1 0x01 //ADC1
#define AD_SE_ADC2 0x02 //ADC2
#define AD_SE_ADC3 0x03 //ADC3
#define AD_SE_ADC4 0x04 //ADC4
#define AD_SE_ADC5 0x05 //ADC5
#define AD_SE_ADC6 0x06 //ADC6

//常量定义
#define Vref 2650 //mV
/*********AD转换函数******************/
//AD转换函数
//ADC_PORT为输入的端口
/**************************************/
uint16_t Measured_Vol_INT(unsigned char ADC_PORT)
{
  uint16_t M_Volt=0;         //变换后的电压mV
  uint32_t temp32;
  uint8_t i;
     ADMUX=0xC0|ADC_PORT;                        //片内基准电压,单端输入.
/*
  ADMUX (ADC Multiplexer Select Register)
             bit7  bit6  
             REFS1 REFS0  参考电压选择  
              0     0     AREF,内部Vref关闭  
              0     1     AVCC,AREF引脚外加滤波电容  
              1     0     保留  
              1     1     2.56V的片内基准电压源,AREF引脚外加滤波电容  
             bit5         ADC结果左对齐选择 1=左对齐  0=右对齐
             bit4~0       选择32通道   
*/
  ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
/*   
               ADCSRA (ADC Control and Status Register A)
                bit7   ADEN ADC使能=1
                bit6   ADSC 启动ADC开始转换=1
                bit5   ADATE 自己触发使能
                bit4   ADIF ADC中断标志
                bit3   ADIE ADC中断使能
                bit2:0 ADC 预分频选择位 111=128时钟分频
*/  
  asm ("sleep");   
  for(i=0;i<24;i++)
    {
  ADCSRA|=(1<<ADSC);            //启动ADC开始转换
  while ((ADCSRA&0x10)!=0x10);  //等待ADC转换结束  
  ADCSRA|=(1<<ADIF);                        //写1清除标志位
  ADCSRA|=~(1<<ADSC);            //启动ADC开始转换
     temp32=(uint32_t)ADC*Vref;
     M_Volt+=(uint16_t)(temp32/1023);
    }   
  ADCSRA&=~(1<<ADIE);                         //禁止ADC中断   
  return(M_Volt/24);    
}
/****************************************/
/*主函数*/
/****************************************/
int main(void)
{
   DelayMs(100);  /*延时100ms*/
   Lcminit(); /*液晶模块初始化 */
   myprintf("mV%");
   while(1)
    {
 DelayMs(500);  /*延时500ms*/
 col=0;row=2;
 myprintf("          %");
 col=60;row=2;
     show_long((unsigned long)Measured_Vol_INT(AD_SE_ADC0));//获取端口PA0的转换数据
}
}

文章评论1条评论)

登录后参与讨论

用户34281 2008-8-1 16:01

WW
相关推荐阅读
用户472938 2011-09-02 11:31
edn啊,太慢了。决定搬家了
这里继续保留,而且同步更新...
用户472938 2011-02-25 09:54
一年多了,冒个泡
更新一下...
用户472938 2010-09-18 19:39
总要找一些事情做一做
总要找一些事情做一做。转移一下注意力继续收拾家,逐渐的处理闲置的电子产品。东西挺多的,时间会很久。以前一直没时间走走,打算从事户外运动了,一是锻炼身体,而是放松心情。。。 ...
用户472938 2010-02-07 15:23
二手ks0108驱动19264液晶资料
型号:LG192642资料下载地址http://www.ganasys.co.kr/kor/support_board/pds_file/LG192642.pdf...
用户472938 2010-02-07 15:22
12232液晶资料
 edm1836液晶edm1837液晶原理图 ...
用户472938 2010-02-07 15:21
fm收音机模块(tea5767模块)资料。
...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条