?? ad._c
字號:
// **************************************************************
// *** 廣 州 天 河 雙 龍 電 子 公 司 ***
// *** http://www.sl.com.cn ***
// *** 實驗:ADC轉換 ***
// *** 作者:zxy@sl.com.cn ***
// *** 2006年3月28日 ***
// *** 目標MCU:MEGA169 晶振:內部(INT)8MHZ ***
// **************************************************************
//用跳線短接J3的ADC2,調節可變電阻R7,LED顯示將發生變化
#include <iom169v.h>
#include <macros.h>
#define Vref 3212//參考電壓值,注意不同環境下的Vref不相同
extern const unsigned char seg_table[16];
extern unsigned char led_buff[4];
extern void delay_ms(unsigned int time);
extern void display(void);
unsigned int adc_rel;//AD轉換結果
//ADC初始化
void adc_init(void)
{
ADCSRA = 0x00; //設置前,先關閉ADC
ADMUX =(1<<REFS0)|(1<<MUX0);//選擇內部AVCC為基準,單端輸入口為ADC1
ACSR =(1<<ACD);//關閉模擬比較器,禁止位P148
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC時鐘64分頻
}
//ADC完成中斷
#pragma interrupt_handler adc_isr:20
//AD 中斷
void adc_isr(void)
{
adc_mul[count] = ADC&0x3ff;
//ADMUX =(1<<REFS0)|(1<<MUX0);
ADCSRA|=(1<<ADSC);//啟動AD轉換
}
//ADC結果轉換成電壓值
void ADCtoBCD(unsigned int temp)
{
unsigned char i;
temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/1024);//ADC結果轉換成電壓值
for(i=0;i<4;i++)
{
led_buff[i]=seg_table[temp%10];//結果存入顯示緩存
temp=temp/10;
}
led_buff[3]&=0x7f;
}
void main(void)
{
unsigned int adc_old;
adc_init();//AD初始化
DDRE=0xff;//E口初始化
PORTE=0xff;//E口初始化
DDRB|=0xf0;//B口初始化
PORTB|=0xf0;//B口初始化
SEI();//使能全局中斷
while(1)
{
if(adc_old!=adc_rel)
{
adc_old=adc_rel; //AD轉換結果
ADCtoBCD(adc_old);//進制轉換
}
display(); //顯示函數
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -