芯片: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
有的时候还需要在软件中设置相关计算,保证显示数值的正确;