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

📄 成功的ad采集.txt

📁 这是关于AD采样的源代码
💻 TXT
字号:
//李伟于9月1号修改成功
//11.1号修改,此程序非常成功,误差为0.01左右,PB接短选,PD高4位接位选
//使用INT0/INT1按键切换ADC通道
#include <iom16v.h>
#include <macros.h>
#define osccal 0x7d//内部RC校正常数
#define Vref   500//参考电压值
const unsigned char  seg_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char led_buff[4]={0,0,0,0};
unsigned int adc_rel;//AD转换结果
unsigned char adc_mux;//AD通道

void delay_nus(int time)
	 {     
  	   do
	  	 {
		 time--;
		  }	
  	  while (time>1);
	 }	  
/*	  		    毫秒级延时程序			*/	 
void delay_nms(unsigned int time)
	 {
	  while(time!=0)
	  	  {		
		   delay_nus(1000);
		   time--;
		  }
	 }					
void display(void)
	 {
	  unsigned char i;
	  DDRB=0xff;
	  PORTB=0xff;
	  DDRD|=0xf0;//PD2,PD3分别为外部中断0和1;
	  PORTD|=0xf0;
	  for(i=0;i<5;i++)
	  	 {		  
		  PORTB=led_buff[i];
		  PORTD&=~(1<<(i+4));//注意位运算符&,不是|
		  delay_nms(1);
		  PORTD|=0xf0;//每扫描一位,全部置高
		 
          
		 
		 }
	 }



//*********************************ADC初始化**********************//
void adc_init(void)
{
 ADCSRA = 0x00; 
 ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准,后面的部分是选折通道,经典!
 
 ACSR =(1<<ACD);//关闭模拟比较器,可以减少器件工作模式及空闲模式下的功耗
 //ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;
 ADCSRA=0XCE;//64分频,开AD使能,启动ADSC,表示开始转换,开中断使能
}
//*************************ADC完成中断***********************************//
#pragma interrupt_handler adc_isr:15   
void adc_isr(void)
{
 adc_rel=ADC&0x3ff;
ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准

   ADCSRA|=0X40;//启动AD转换
}
//ADC结果转换成电压值
void ADCtoBCD(unsigned int temp)
 {
  unsigned char i;
  temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
  for(i=0;i<4;i++)
  {
   led_buff[i]=seg_table[temp%10];
   temp=temp/10; 
   }
   led_buff[2]&=0x7F; 
 }
//MAIN程序
void main(void)
{
 unsigned char i;
 unsigned int adc_old;
 DDRD=0xf0;
 PORTD=0xff;
 OSCCAL=osccal;//校正振荡频率
 adc_mux=0;
 adc_init();
 SEI();
 //**************开机后4个数码管同时显示8,显示时间由以下的延时来定********//
for(i=0;i<4;i++)
  { 
   led_buff[i]=seg_table[8];
  }
for(i=0;i<200;i++)
 
  display();
  adc_old=0;
  adc_rel=0; 
  while(1)
  {   
   if(adc_old!=adc_rel)//刚开始都赋的值为0,当转换完时肯定不等.
     {adc_old=adc_rel;
	  ADCtoBCD(adc_old);
	 }
 
   display();
   i=PIND&0x0c;//判断按键
   if(i!=0x0c)
     {
	  display();//按键消抖
	  if(i==(PIND&0x0c))
	    {
		 CLI();//关闭全局,响应外部中断
		 adc_rel=0;
		 adc_old=0;
		 if (i==0x08)//INT0键按下
		    {
			 if(adc_mux<3)
			    adc_mux++;//递增
		     else
			    adc_mux=0;		
			}
		 if (i==0x04)//INT1键按下
		    {
			 if(adc_mux>0)
			    adc_mux--;//递减
			 else
			    adc_mux=3;	
			}
	    	
	     while((PIND&0x0c)==0x0c)//检查按键释放
		    display(); 		
	     SEI();		//开中断 
		}
	 }
  } 
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -