📄 adc_m8.c
字号:
/***********************************************
**** 用ADC做电压表 ***
**** 目标MCU :Atmeag 8 ***
**** 作者: XueTwins ***
**** 时间 2006.11.2 ***
***********************************************/
#include <iom8v.h>
#include <macros.h>
#pragma data:code
const unsigned letter_u[]={0x3E};//显示字母U
const unsigned tabs[]=
{ //无小数点
0x3F,//0
0x06,//1
0x5B,//2
0x4F,//3
0x66,//4
0x6D,//5
0x7D,//6
0x07,//7
0x7F,//8
0x6F//9
};
const unsigned tabs_point[]=
{ //有小数点
0xBF,//0.
0x86,//1.
0xDB,//2.
0xCF,//3.
0xE6,//4.
0xED,//5.
0xFD,//6.
0x87,//7.
0xFF,//8.
0xEF//9.
};
#pragma data:data
static unsigned char ledbuf[4];
unsigned int adc_rel;//AD转换结果,注意是int型
unsigned char adc_mux;//通道号
/**************************************************
延时函数 1M系统时钟
*************************************************/
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<141;i++)
{}
}
void delay(unsigned int n) //延时n毫秒
{
unsigned int i;
for (i=0;i<n;i++) //执行n次1毫秒延时
delay_1ms();
}
/*------------------------------------------------------
LED动态扫描程序
------------------------------------------------------*/
void led_scan(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
PORTB=ledbuf[i];
PORTD=~(0x08>>i);
delay(2);
PORTD|=(0x08>>i);
}
}
/**************************************************
ADC初始化函数
*************************************************/
void adc_init(void)
{
DDRC=0x00;//C口设置为高阻输入
PORTC=0x00;
ADCSRA=0x00;
ADMUX=(1<<REFS0)|(adc_mux&0x3FF);//选择AVCC,AREF
ACSR=0x80;//关闭模拟比较器,上升,下降沿中断
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
//0b1100 1110ADC使能,ADC开始转换,中断允许, 64分频
}
/**************************************************
ADC完成中断服务程序
*************************************************/
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
adc_rel=ADC&0x3ff;
ADCSRA=0x00;
ADMUX=(1<<REFS0)|(adc_mux&0x3FF);//选择AVCC,AREF为基准
ADCSRA=0x40;//ADCSRA|=(1<<ADSC); 启动AD转换
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -