📄 adctest
字号:
//用mega16L测量电压值
//程序如下:
#include<io.h>
#include<mega16.h>
#include<delay.h>
#define ADC_VREF_TYPE 0x00
#define AD_SE_ADC0 0x00 //ADC0
unsigned char Table[10] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管字型0~9
unsigned char Data[4] = {0,0,0,0}; //存放A/D转换结果
void Display(unsigned char p[]) //动态显示,间隔5ms显示
{
unsigned char i,sel=0x01;
for(i=0;i<4;i++)
{
PORTD=~sel;
PORTB=Table[p[i]];
delay_ms(5);
sel=sel<<1;
}
}
unsigned int read_adc(unsigned char adc_input) //读取A/D转换结果
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40; //启动A/D转换
while ((ADCSRA & 0x10)==0); //等待A/D转换完成
ADCSRA|=0x10;
return ADCW;
}
void Process(unsigned int i,unsigned char *p) //数据处理函数
{
p[0]=i/1000;
i=i%1000;
p[1]=i/100;
i=i%100;
p[2]=i/10;
i=i%10;
p[3]=i;
}
void main(void)
{
unsigned long int i;
unsigned long int j=5000;
unsigned long int k=1024;
DDRA=0x00; //设置A口为不带上拉输入;
PORTA=0x00;
DDRB=0xff; //设置B口为输出口;
DDRD=0xff; //设置D口为输出口;
PORTB=0xff; //B口初始化输出0 ;D口初始化输出1;点亮全部数码管;
PORTD=0x00;
ADMUX=ADC_VREF_TYPE; //选择第一通道ADC0;
ADCSRA=0xA6; //125k转换速率,自由转换模式;启动A/D转换;
delay_ms(1000); //延时待系统稳定;
while(1)
{
i=read_adc(AD_SE_ADC0); //获取A/D转换数据
i=(i*j)/k;
Process(i,Data); //数据处理
Display(Data); //显示结果
delay_ms(5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -