⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc._c

📁 AVR mega16系列单片机开发程序
💻 _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 + -