数码管显示ADC采样的数值

瘦欲@ 提交于 2019-11-27 05:03:49

 

芯片:atmega16

软件:Atmel studio 7

 

------------------------------------------------------------------------------------------------------------------

数码管显示相关函数

unsigned char const Number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,};//显示的数值

//延迟函数

void tim(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1141;j++);

}

}

//数码管显示函数   

// 硬件上用了2个573锁存,PA6控制573-1,PA7控制573-2

void Number_Show(unsigned int Num)

{

unsigned int Thousand,Hundred,Ten,One;

Thousand=Num/1000; //取千位

Hundred=Num00/100; //取百位

Ten=Num000/10; //取十位

One=Num; //取个位

//显示百位

PORTB=Number[Hundred]; //送模码

PORTA|=(1<<PA6); //高电平时,573-1打开并接收模码

PORTA&=~(1<<PA6); //低电平时,573-1锁存

PORTB=~(1<<PB0); //送位选,位选由573-2控制。例如PB0低电平,那就是数码管的第1个点亮

PORTA|=(1<<PA7); //高电平,573-2打开并接收位选

PORTA&=~(1<<PA7); //低电平,573-2锁存

tim(10); //稍微延迟

//以下原理一样

//显示十位

PORTB=Number[Ten]; //送模码

PORTA|=(1<<PA6); 

PORTA&=~(1<<PA6); 

PORTB=~(1<<PB1); //送位选 

PORTA|=(1<<PA7); 

PORTA&=~(1<<PA7); 

tim(10); //稍微延迟

//显示个位

PORTB=Number[One]; //送模码

PORTA|=(1<<PA6);

PORTA&=~(1<<PA6); 

PORTB=~(1<<PB2); //送位选

PORTA|=(1<<PA7); 

PORTA&=~(1<<PA7); 

tim(10); //稍微延迟

}

//IO 初始化函数

void LED7_Init()

{

DDRA|=(1<<PA6); //PA3 状态为输出

DDRA|=(1<<PA7); //PA4 状态为输出

DDRB|=0xff; //PB 状态为输出

}

-----------------------------------------------------------------------------------------------------------

//ADC相关函数

void ADCIO_init()//ADCIO初始化

{

DDRA &= ~(1<<0);//输入状态

PORTA &= ~(1<<0);//高阻态输入

}

void ADC_init()//ADC设置

{

ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADATE)|(1<<ADSC);

SFIOR |= 0xC0;//设为定时器1计数溢出触发        

ADMUX = 0x02;

}

 

ISR (ADC_vect)//ADC中断函数

{

         unsigned int Result;      

         Result = ADCL;

         Result = Result+(ADCH<<8);//取得ADC采样值

 //接下来可以把Result放入一个数组,比如放入一个adt[8],代表可以放8次取得的值,然后求平均

         //也可以把值直接赋值给一个变量,比如就是赋值给Result

}

------------------------------------------------------------------------------------------------------------

void main()

{

         //一些初始化程序

         //adc的初始化

         //定时器1的初始化

         SREG |=(1<<7);//开全局中断

         while(1)

         {

             ADC的值放到数码管显示;

          }

}

---------------------------------------------------------------------------------------------------------------

定时器1的中断

ISR (TIMER1_OVF_vect)

{

TCNT1H = (unsigned char)(tmp>>8);

TCNT1L = (unsigned char)tmp;

         ADC的值放到数码管显示;//这里不放,就不能正确显示

}

--------------------------------------------------------------------------------------------------------------

 

该芯片ADC的第一次采样转化,数值应当忽略,可以在程序中加入适当的延时;

 

注意定时器中断时间要配合ADC采样转化的时间(查手册);

 

比如ADC是10位,也就是1024了,基准5V,Vin是硬件上5V电压被电阻分配后的值

1024/5*Vin=ADC

有的时候还需要在软件中设置相关计算,保证显示数值的正确;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!