您的位置:首页 > 编程语言

基于ATmega16单片机 波形发生器 程序源代码

2016-01-05 22:47 441 查看
/*ATmega16波形发生器*/
//设计了三个按键用于设置输出方波的频率,在数码管显示,T/C1工作在输出比较模式
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include<util/delay.h>
#define uint unsigned int
#define uchar unsigned char
#define con 1000
#define flag=0;
uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar data[4]={0,0,0,1};//显示初值:0,0,0,0
uchar key1_flag,key2_flag,key3_flag;//定义键盘标志
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
PORTD=~PORTD;
}
void display(uchar *p)
{uchar i,sel=0x01;
for(i=0;i<4;i++)
{ PORTC=sel;
PORTA=table[p[i]];
_delay_ms(1);
sel=sel<<1;
}
}
void key_process(uchar *p)
{ uchar i,j,k;
while((PINB&0x01)==0)
{display(data);
key1_flag=1;}
while((PINB&0x02)==0)
{display(data);
key2_flag=1;}
while((PINB&0x04)==0)
{display(data);
key3_flag=1;}
if(key1_flag==1)//处理频率个位
{p[3]++;
if(p[3]==10)
p[3]=0;
key1_flag=0;}
if(key2_flag==1)//处理频率十位
{p[2]++;
if(p[2]==10)
p[2]=0;
key2_flag=0;}
if(key3_flag==1)//处理频率百位
{p[1]++;
if(p[1]==10)
p[1]=0;
key3_flag=0;}
}
void set_process(void)//设置输出比较寄存器值
{uint i,j;
i=data[0]*1000+data[1]*100+data[2]*10+data[3];
j=500/i;
OCR1AH=j>>8;
OCR1AL=j&0x00ff;
}
void init_io(void)
{DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
DDRB=0x00;
PORTB=0x00;
DDRD=0xff;
PORTD=0xff;
}
void init_timer1(void)//
{ TIMSK=TIMSK|0x10;//输出比较使能
TCCR1B=0x0a;
TCNT1H=0x00;
TCNT1L=0x00;
set_process();//OCR1A.OCR1B置初值
sei();
}
void main()
{ init_io();
PORTA=0xff;
PORTC=0x00;
init_timer1();
_delay_ms(300);
PORTC=0xff;
while(1)
{ key_process(data);
set_process();
display(data);//动态扫描显示
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: