立即注册 找回密码

微雪课堂

搜索
微雪课堂 AVR AVR单片机笑傲江湖 查看内容

AVR AD转换 中断

2015-6-2 16:58| 发布者: waveshare-admin| 查看: 4274| 评论: 0

摘要: 系统功能  大部分AVR内部带有AD,本节以使用ATMEGA16的内部AD为例,给出AD转换中断程序。  硬件设计AVR主控电路原理图(点击图片放大,不需要放大镜!)AD转换值低位,LED控制电路原理图(点击图片放大,不需要 ...
系统功能

  大部分AVR内部带有AD,本节以使用ATMEGA16的内部AD为例,给出AD转换中断程序。
  
硬件设计


AVR主控电路原理图(点击图片放大,不需要放大镜!
 
AD转换值低位,LED控制电路原理图(点击图片放大,不需要放大镜!) 

AD转换值高位,LED控制电路原理图(点击图片放大,不需要放大镜!) 

软件设计

下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!

//目标系统: 基于AVR单片机
//应用软件: ICC AVR

/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
实验内容:
使用中断检测AD0口,使用PB/PD口的LED指示AD读到的数据。
----------------------------------------------------------------------
硬件连接:
将“ADJ0.AD0”引针与“MCU.AD0” 引针使用短路帽短接。
将PB/PD口的LED指示灯使能开关切换到"ON"状态。
----------------------------------------------------------------------
注意事项: 
(1)若有加载库程序,请将光盘根目录下的“库程序”下的“ICC_H”文件夹拷到D盘
(2)请详细阅读:光盘根目录下的“产品资料\开发板实验板\SMK系列\SMK1632\说明资料”
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/

#include <iom16v.h>
#include "D:\ICC_H\CmmICC.H"

#define H_VAL_DISP_DDR  DDRD
#define L_VAL_DISP_DDR  DDRB
#define H_VAL_DISP_PORT PORTD
#define L_VAL_DISP_PORT PORTB

const uint8 ADEnStatus[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

uint8 AdcMux;     //ADC通道
uint16 AdcVal;     //ADC转换值

/*--------------------------------------------------------------------
程序名称:AD转换初始化程序
程序功能:
注意事项:
提示说明:
输    入:
返    回:
--------------------------------------------------------------------*/
void adc_init()
{
/* 设置对应的IO口为输入高阻态 */
 DDRA &= ADEnStatus[AdcMux];    
 PORTA &= ADEnStatus[AdcMux];

 ADCSRA = 0x00;    //disable adc
 ADMUX = (1<<REFS1)|(1<<REFS0)|(AdcMux&0x0F); //select adc input channel
 ACSR = (1<<ACD);   //close analog comparator
 ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1); 
}
/*--------------------------------------------------------------------
程序名称:AD转换中断服务程序
程序功能:
注意事项:
提示说明:
输    入:
返    回:
--------------------------------------------------------------------*/
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
 AdcVal = ADC&0x3FF;
 ADMUX = (1<<REFS0)|(AdcMux&0x0F); //使用 AVcc 作为ADC参考电源
 ADCSRA |= (1<<ADSC);    //ADSC: AD start conversion
}
/*--------------------------------------------------------------------
程序名称:
程序功能:
注意事项:
提示说明:
输    入:
返    回:
--------------------------------------------------------------------*/
void main(void)
{
 H_VAL_DISP_DDR = 0xFF;
 L_VAL_DISP_DDR = 0xFF;
 AdcMux = 0;         //使用ADC通道0
 adc_init(); 
 SEI(); 
 while(1)
 {     
  H_VAL_DISP_PORT = (AdcVal&0x300)>>8; //ADC的高2位Val
  L_VAL_DISP_PORT = AdcVal&0xFF;   //ADC的低8位Val
 }
}


系统调试

用LED显示AD转换值,调“ADJ0.AD0”的可调电阻可改变AD转换值,观察它的变化。


以下资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!


325

顶一下

刚表态过的朋友 (325 人)

上一篇:AVR PWM OC2下一篇:AVR 硬件操作库函数

最新评论

所有教程
AVR

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-3-29 13:26 , Processed in 0.030721 second(s), 20 queries .

返回顶部