AVR單片機入門系列(27)AVR AD轉(zhuǎn)換中斷
大部分AVR內(nèi)部帶有AD,本節(jié)以使用ATMEGA16的內(nèi)部AD為例,給出AD轉(zhuǎn)換中斷程序。
本文引用地址:http://butianyuan.cn/article/201612/325271.htm硬件設(shè)計
AVR主控電路原理圖
軟件設(shè)計
//目標(biāo)系統(tǒng):基于AVR單片機
//應(yīng)用軟件: ICC AVR
/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
實驗內(nèi)容:
使用中斷檢測AD0口,使用PB/PD口的LED指示AD讀到的數(shù)據(jù)。
----------------------------------------------------------------------
硬件連接:
將“ADJ0.AD0”引針與“MCU.AD0”引針使用短路帽短接。
將PB/PD口的LED指示燈使能開關(guān)切換到"ON"狀態(tài)。
----------------------------------------------------------------------
注意事項:
(1)若有加載庫程序,請將光盤根目錄下的“庫程序”下的“ICC_H”文件夾拷到D盤
(2)請詳細閱讀:光盤根目錄下的“產(chǎn)品資料開發(fā)板實驗板SMK系列SMK1632說明資料”
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/
#include
#include "D:ICC_HCmmICC.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轉(zhuǎn)換值
/*--------------------------------------------------------------------
程序名稱:AD轉(zhuǎn)換初始化程序
程序功能:
注意事項:
提示說明:
輸入:
返回:
--------------------------------------------------------------------*/
void adc_init()
{
/*設(shè)置對應(yīng)的IO口為輸入高阻態(tài)*/
DDRA &= ADEnStatus[AdcMux];
PORTA &= ADEnStatus[AdcMux];
ADCSRA = 0x00;//disable adc
ADMUX = (1< ACSR = (1< ADCSRA=(1< } /*-------------------------------------------------------------------- 程序名稱:AD轉(zhuǎn)換中斷服務(wù)程序 程序功能: 注意事項: 提示說明: 輸入: 返回: --------------------------------------------------------------------*/ #pragma interrupt_handler adc_isr:15 void adc_isr(void) { AdcVal = ADC&0x3FF; ADMUX = (1< ADCSRA |= (1< } /*-------------------------------------------------------------------- 程序名稱: 程序功能: 注意事項: 提示說明: 輸入: 返回: --------------------------------------------------------------------*/ 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 } } 系統(tǒng)調(diào)試 用LED顯示AD轉(zhuǎn)換值,調(diào)“ADJ0.AD0”的可調(diào)電阻可改變AD轉(zhuǎn)換值,觀察它的變化
評論