📄 adc._c
字号:
//Project :ADC(10 bit) and LCD Display
//ICC-AVR application builder : 2007-5-10 21:20:44
// Target : M16
// Crystal : 8.0000Mhz
// Writer : you hu
#include <iom16v.h>
#include <macros.h>
#include "lcd.h"
#include "display.h"
typedef unsigned char uchar;
typedef unsigned int uint;
int value; //全局变量,存储10位的AD转换数据
//ADC initialize
// Conversion time: 52uS
void adc_init(void)
{
ADCSR = 0x00; //禁止AD启动
ADMUX = 0xC0; //选择通道0,默认的右对齐方式
ACSR = 0x80;
ADCSR = 0xED; //启动AD转换
}
#pragma interrupt_handler adc_isr:15 //中断方式读取AD转换值
void adc_isr(void)
{
value=ADCL; //读取低8位转换值
value|=(int)ADCH << 8; //读取高2位转换值
}
void Bit_display(unsigned char X,unsigned char Y) //位显示函数,将对转换结果的数字量进行“0”或“1”的显示
{
if(Y)
LCD_write_char(X,0,'1'); //如果转换结果变量的某一位为“1”,则显示,否则显示“0”
else
LCD_write_char(X,0,'0');
}
void Bit_transfor(void) //对12位数字量的量化和显示函数
{
unsigned int datas;
unsigned int bits=0x0001; //位屏蔽变量,通过移位处理,将得出数字量的每一位值(0或1)
unsigned char i,pos=10; //显示位置变量,通过循环处理将依次将数字量的每一位显示在LCD上
init_lcd();
datas =(value&bits); //最低位独立处理
Bit_display(11,datas);
bits = bits<<1;
for(i=0;i<=10;i++) //高11位在循环中处理
{
datas =(value&bits); //位屏蔽操作
datas = datas>>(i+1);
Bit_display(pos,datas); //位显示操作
bits = bits<<1;
pos--;
}
}
void Analog_display(unsigned char X,unsigned char data) //对输入模拟量的显示
{
switch(data)
{
case 0:LCD_write_char( X, 1, '0'); break;
case 1:LCD_write_char( X, 1, '1'); break;
case 2:LCD_write_char( X, 1, '2'); break;
case 3:LCD_write_char( X, 1, '3'); break;
case 4:LCD_write_char( X, 1, '4'); break;
case 5:LCD_write_char( X, 1, '5'); break;
case 6:LCD_write_char( X, 1, '6'); break;
case 7:LCD_write_char( X, 1, '7'); break;
case 8:LCD_write_char( X, 1, '8'); break;
case 9:LCD_write_char( X, 1, '9'); break;
}
}
void Analog_transfor(void) //在液晶的第二行显示对应的输入模拟电压值
{
uint value2;
uint result;
uint x1,x2,x3,x4,x5;
value2 = (value>>2); //由于选择的转化方式为右对齐,因此在此处
//需要右移2位以取得准确的数字量。
result=(value2*2.56/1024)*10000; //以下为数字处理部分,可作为AD转换的通用处理模块
x1=result/10000; Analog_display(0,x1);
LCD_write_char(1,1,'.');
x2=(result/1000)%10; Analog_display(2,x2);
x3=(result/100)%100%10; Analog_display(3,x3);
x4=(result/10)%1000%10; Analog_display(4,x4);
x5=(result%1000)%100%10; Analog_display(5,x5);
}
void init_devices(void)
{
CLI(); //禁止所有中断
adc_init();
Bit_transfor(); //数字量显示
Analog_transfor(); //模拟量显示
MCUCR = 0x00;
SREG = 0X80; //允许中断发生
GICR = 0x00;
TIMSK = 0x00;
SEI(); //重新开启所有中断
}
void main(void)
{
init_devices();
while(1); //循环等待转换开始
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -