📄 adc.h
字号:
#ifndef __adc_h
#define __adc_h
#include <iom16v.h>
//#include <iom128v.h>
#include <macros.h>
#include <delay.h>
#include <lcd.h>
#include <parameter.h>
//--------------------------查询方式读取ADC 0~31通道--------------------------//
unsigned int ADC_convert(unsigned char ADC_channel)
{
ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(ADC_channel&0x1F); //ADLAR_bit5=0 右对齐
/*
ADMUX (ADC Multiplexer Select Register)
bit7 bit6
REFS1 REFS0 参考电压选择
0 0 AREF,内部Vref关闭
0 1 AVCC,AREF引脚外加滤波电容
1 0 保留
1 1 2.56V的片内基准电压源,AREF引脚外加滤波电容
bit5 ADC结果左对齐选择 1=左对齐 0=右对齐
bit4~0 选择32通道
*/
ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
/*
ADCSRA (ADC Control and Status Register A)
bit7 ADEN ADC使能=1
bit6 ADSC 启动ADC开始转换=1
bit5 ADATE 自己触发使能
bit4 ADIF ADC中断标志
bit3 ADIE ADC中断使能
bit2:0 ADC 预分频选择位 110=64时钟分频
*/
delay_nus(200);
ADCSRA|=(1<<ADSC); //启动ADC开始转换
while ((ADCSRA&0x10)!=0x10); //等待ADC转换结束
ADCSRA|=(1<<ADIF); //写1清除标志位
ADCSRA=0x00; //关闭ADC
return ((ADC&0x03FF)*25/10+1); //ADC=ADCH:ADCL 2.56V的片内基准电压源
}
//---------------------------16进制转换成ASCII码------------------------------//
void change(unsigned int i,unsigned char *p)
{
p[4]=i%10+48;//个
p[3]=i/10%10+48;//十
p[2]=i/100%10+48;//百
p[1]='.';//.
p[0]=i/1000%10+48;//千
}
//-----------------channel通道的电压值送lcd显示-------------------------------//
void adcdisplay(void)//
{
vol=ADC_convert(channel);//查询方式读取ADC channel通道
change(vol,Data);//16进制转换成ASCII码
LCD_write_string(2,0,"CHANNEL:");
LCD_write_string(1,1,"VOLTAGE:");
LCD_write_char(11,0,channel+48);//显示通道数
LCD_write_string(10,1,Data);//显示电压值
LCD_write_char(15,1,86);//显示'V'
}
//----------------------------ADC端口初始化-----------------------------------//
void ADC_int(void)
{
DDRA=0x00;
PORTA=0x01; //A口为不带上拉输入
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -