📄 main.c
字号:
/***********************************************
**** AVR ADC使用范例 ***
**** ***
**** 策划、整理与测试: 阿莫(armok) ***
**** 代码编写: HJJourAVR ***
**** 编译器:WINAVR20050214 ***
**** ***
**** www.OurAVR.com 2005.8.30 ***
***********************************************/
/*
本程序简单的示范了如何使用ATMEGA16的ADC模数转换器
普通的单端输入
差分输入及校准
基准电压的校准
查询方式
中断方式
数据格式的变换
出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <uart.c>
#include <stdio.h>
/*宏INTERRUPT 的用法与SIGNAL 类似,区别在于
SIGNAL 执行时全局中断触发位被清除、其他中断被禁止
INTERRUPT 执行时全局中断触发位被置位、其他中断可嵌套执
另外avr-libc 提供两个API 函数用于置位和清零全局中断触发位,它们是经常用到的。
分别是:void sei(void) 和void cli(void) 由interrupt.h定义 */
//管脚定义
#define in_Single 0 //PF0(ADC0)
//常量定义
//单端通道,不放大
#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 AD_SE_ADC7 0x07 //ADC7
//单端通道,不放大
#define AD_SE_VBG 0x1E //VBG 内部能隙1.22V电压基准,校准用
#define AD_SE_GND 0x1F //接地 校准用
#define Vref 3300 //mV 实测的Vref引脚电压@5.0V供电
//#define Vref 2550 //mV 实测的Vref引脚电压@3.3V供电
//全局变量
volatile unsigned int ADC_INT_SE; //中断模式用的单端输入ADC值,会在中断服务程序中被修改,须加volatile限定
unsigned int LED_Volt; //变换后的电压mV
//仿真时在watch窗口,监控这些全局变量。
void delay100ms(void)
{
int i,j;
for(j = 0;j<31;j++)
for(i = 0;i<2330;i++);//7.3728MHz的晶振
}
SIGNAL(SIG_ADC) //ADC中断服务程序
{
//硬件自动清除ADIF标志位
ADC_INT_SE=ADC; //读取结果
//实测的Vref引脚电压 =2556mV
long temp32;
temp32=(long) ADC_INT_SE*Vref;
LED_Volt=(unsigned int)(temp32/1024);
uchar str[20];
delay100ms() ;
sprintf(str, "%4d mV ",LED_Volt);
USART_Transmit_str("Hello! 这是ADC转换测试:\n");
USART_Transmit_str(str);
//delay100ms() ;
ADCSRA |= _BV(ADSC);
}
int main(void)
{
ADC_INT_SE=0;
USART_Init();
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTB=0xFF; //不用的管脚使能内部上拉电阻。
PORTC=0xFF;
PORTD=0xFF;
PORTF=~(1<<in_Single); //作ADC输入时,不可使能内部上拉电阻。
ADMUX=0;
ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1); //使能ADC,时钟64分频 125KHz@8MHz system clock
sei(); //使能全局中断
ADCSRA|=_BV(ADSC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -