📄 ad采样.c~
字号:
/*****************************************************
File name :
Chip type : ATmega16L
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
flash unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//段选码
flash unsigned char position[6]={0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //位选码
unsigned char dis_buff[4]={0,0,0,0},posit;
bit time_2ms_ok;
// ADC电压值送显示缓冲区函数
void adc_to_disbuffer(unsigned int adc)
{
unsigned char i;
for (i=0;i<=3;i++)
{
dis_buff[i]=adc%10; //将电压值分解成四位数码管显示
adc /= 10;
}
}
// Timer 0 比较匹配中断服务,2ms发生一次计时中断
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
time_2ms_ok = 1;
}
// ADC 转换完成中断服务
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data,adc_v;
adc_data=ADCW; //读取ADC置换结果
adc_v=((unsigned long)adc_data-13);//*5000/1024; //换算成电压值
adc_to_disbuffer(adc_v); //将电压值分解
}
void display(void) // 4位LED数码管动态扫描函数
{
PORTA |= 0xFF; //数码管位选信号无效
PORTC = led_7[dis_buff[posit]]; //数码管段选信号
if (posit==3) PORTC |= 0x80; //当PA5显示时,要显示小数点
PORTA &= position[posit]; //数码管位选信号有效
if (++posit >=4 ) posit = 0; //当PA5显示后,重新从PA2开始显示
}
void main(void)
{
DDRA=0x3C; //初始化PA2~PA5为输出口
PORTA=0x3C;
DDRC=0xFF; // LED显示控制I/O端口初始化
PORTC=0x00;
// T/C0 初始化
TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
TCNT0=0x00;
OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02; // 允许T/C0比较中断
// ADC 初始化
ADMUX=0x40; // 参考电源AVcc、ADC0单端输入
SFIOR&=0x1F;
SFIOR|=0x60; // 选择T/C0比较匹配中断为ADC触发源
ADCSRA=0xAD; // ADC允许、自动触发转换、ADC转换中断允许、ADCclk=125Kz
#asm("sei") // 开放全局中断
while (1)
{
if (time_2ms_ok) //每2ms成立一次,有T0控制
{
display(); // LED扫描显示
time_2ms_ok = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -