📄 adc1.c
字号:
/*****************************************************
Project : ADC_01
Date : 2005-11-9
Author : Linbrid
Company : TianJin University
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 char led7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义段选码
flash char position[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //定义位选码
char dis_buff[8]; //显示缓冲区,存放要显示的8个字符的段码值
char posit;
int adc_data_temp; //全局变量,存放ADC转换结果,送显示缓冲区
void display(void) //LED动态扫描函数
{
PORTC=0xff;
PORTB=led7[dis_buff[posit]];
if(posit==5) PORTB|=0x80;
PORTC=position[posit];
if(++posit>=8) posit=0;
}
void adc_to_disbuffer(void) //ADC结果送显示缓冲区函数
{
char i,j=7;
int adc_dis;
adc_dis=adc_data_temp/2;
for(i=0;i<=4;i++)
{
dis_buff[j-i]=adc_dis%10;
adc_dis=adc_dis/10;
}
dis_buff[2]=adc_dis;
}
#define ADC_VREF_TYPE 0x40
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void) //ADC转换完成中断函数
{
int adc_templ,adc_temph; //ADC结果临时缓冲器
adc_templ=ADCL;
adc_temph=ADCH;
adc_data_temp=(adc_temph<<8)+adc_templ;
adc_to_disbuffer(); //转换结果送显示缓冲区
display();
ADCSRA|=0x40; //启动下一次AD转换
}
void main(void)
{
char i;
//IO端口初始化
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0xFF;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
//ADC模块初始化
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xCD;
for(i=0;i<8;i++) dis_buff[i]=0; //LED显示清零
display();
//开全局中断
#asm("sei")
while (1) //等待ADC转换完成中断
{
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -