八月的最后一天 待到现在才开始写总结 显得有点慢了 嘿 这完全是因为早上上了两节课后 便去图书管找几本书 又待到了吃午饭时间 然后一直拖到现在 汗 可真多理由呢 找打
    汗 还是说多废话了 就整理一下关于AVR的ADC转换功能吧 AVR中的数模转换器是一个10位的逐次逼近型ADC 提供8路单端输入通道 单端电压以0V为基准 同时具有7路差分输入通道 这七路差分通道共享一个通用负端(ADC) 输入电压范围为0~VCC  它的转化时间为65~260uS   下面程序的现象为 串口发送命令启动ADC  并将结果通过串口发送到PC 任意字符开启
#include <iom16v.h >
#include  < macros.h >
#define uchar unsigned char
 
uchar UcAdcData  ;         //ADC转换的结果  
uchar AdcConCom = 0 ;  //ADC 转换完成标志  
uchar admuxx = 0x67 ;      //外部参考源 数据存储左对齐方式
 
//AD转换初始化
void AdcInit(void)
{
     ADCSR     = 0x00;                          //ADC无效
     ADMUX     = admuxx;                        //选择ADC通道7
     /*--REFS1---REFS0---ADLAR---0--------------参考电源选择------对齐方式--------*/
     /*--0000-- 0001-- 0010-- 0011-- 0100-- 0101-- 0110-- 0111-- 1110--- --1111---*/
     /*--通道0--通道1--通道2--通道3--通道4--通道5--通道6-通道7--1.23V(VBG)-0V(GND)*/
     ACSR      = 0x80;                           //模拟比较器控制和状态寄存器 ACSR
                                                             //ACD置1,使模拟比较器禁用
    /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
   /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
   /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------   */
    ADCSR     = 0x8B;//模拟比较起控制和状态寄存器
    /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
    //使能模数转换 ADC开始转换 ADC连续转换  ADC中断使能  128分频
}
 
//AD转换中断处理函数
#pragma interrupt_handler adc_isr : 15
void adc_isr ( void )                 
{
     UcAdcData = ADCH;          //读ADC转换结果
     AdcConCom = 1;                  //置ADC转换完成标志
}
 
//串口初始化
void Uart0Init(void)
{
     UCSRB = 0x00;      //关串口
     UCSRA = 0x02;     //倍速模式   M16中文P151
     UCSRC = BIT(URSEL) | 0x06;  //写UCSRC寄存器,设定8个bit
     UBRR  = 0x000c;           //设定串口波特率为9600
     UCSRB = 0x98;     //开串口
}
 
//串口中断处理函数
#pragma interrupt_handler UartRecvData:12
void UartRecvData(void)             //串口中断处理函数  即是PC向AVR发送启动信号
{
      uchar temp;
      temp = UDR;
      ADMUX |= 0x07;
      ADCSR |= 0x40;          //开启一次ADC转换
}
 
//串口发送数据
void UartTransmitData(void)
{
    while(!(UCSRA&0x20));      //判断数据寄存器是否为空
    UDR = UcAdcData;
}
 
//初始化各种信息
void InitDevices(void)
{
    CLI ( );                                 //关全部中断
    Uart0Init ( ) ;
    AdcInit ( ) ;
    MCUCR = 0x00;
    SEI ( ) ;                                 //开全中断
}
//主函数
void main ( void )
{
       InitDevices ( ) ;                        //串口初始化
       while ( 1 )
      {
           if ( AdcConCom )                  //AD完成标志 便开始处理数据
           {
               AdcConCom = 0;               //清ADC转换完成标志
               UartTransmitData ( ) ;         //发送转换结果
           }
      }
}