本例中T/C1与 OC1A引角连接,所生成的率频由该引角输出。
本例通过4个按键分别调节频率值的千位、百位、十位、个位,通过示波可观察不同的频率。
Proteus截图:
Studio6.2编译通过截图:
程序清单:
/*
* GccApplication9.c
*
* Created: 2014-11-4 20:37:39
* Author: Administrator
*/
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#define K1 (uint8_t)(~_BV(PC0))
#define K2 (uint8_t)(~_BV(PC2))
#define K3 (uint8_t)(~_BV(PC4))
#define K4 (uint8_t)(~_BV(PC6))
const uint8_t SEG_CODE[] = {0x3f,0x06,0x58,0x4f,0x66,0x6d,0x7d,0x7d,0x07,0x7f,0x6f};
uint8_t FRQ_DATA[] = {0,1,0,0};
uint8_t Key_State;
void Show_FRQ_ON_DSY()
{
uint8_t i = 0;
for(i=0;i<4;i++)
{
PORTB = ~_BV(i);
PORTA = SEG_CODE[FRQ_DATA[i]];
if(i==0) PORTA |= 0x80;
_delay_ms(2);
}
}
void Set_Frequency()
{
uint16_t f;
f=FRQ_DATA[0]*1000+FRQ_DATA[1]*100+FRQ_DATA[2]*10+FRQ_DATA[3];
OCR1A = F_CPU/2.0/f;
}
int main(void)
{
uint8_t i=0;Key_State = 0xFF;
DDRA = 0xFF; PORTA = 0xFF;
DDRB = 0xFF; PORTB = 0xFF;
DDRD = 0xFF; PORTD = 0xFF;
DDRC = 0x00; PORTC = 0xFF;
TCCR1A = 0x40;
TCCR1B = 0x09;
TCNT1 = 0;
Set_Frequency();
while(1)
{
if(PINC^Key_State)
{
Key_State = PINC;
if(Key_State != 0xFF)
{
switch(Key_State)
{
case K1:i=0;break;
case K2:i=1;break;
case K3:i=2;break;
case K4:i=3;break;
}
FRQ_DATA[i] = (FRQ_DATA[i]+1)%10;
Set_Frequency();
}
}
Show_FRQ_ON_DSY();
}
}
|