注:頻率為488HZ 既 64分頻 8us計(jì)數(shù)一次 256次即2048ns ==2.048ms 所以頻率488HZ
CTC模式 比較匹配我設(shè)置為置位 當(dāng)定時(shí)器值==OCR0 輸出口為高電平,然后定時(shí)器自動(dòng)清零重新計(jì)數(shù)開(kāi)始如此反復(fù)。
輸出電壓為占空比值。一下是源碼:
#include <iom16.h>
#include <intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
__flash uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //段碼
0x7f,0x6f};
__flash uchar tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位選碼
int wide=0; //比較匹配設(shè)置變量
void delay(uint k) //延時(shí)k ms子程序
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<1140;j++);
}
void show_dat(uint dat)
{
uchar i=0;
do
{
PORTA=seg[dat%10];
PORTC=tab[i];
delay(1);
PORTA=0xff;
PORTC=0xff;
dat=dat/10;
i++;
}
while(dat);
}
void port_init()
{
PORTA=0xff;
DDRA=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x00;
PORTB=0xff;
DDRB=0xff;
}
void time_init()
{
TCCR0=0x7b; //CTC模式設(shè)置 比較匹配置位
TCNT0=0x00; //定時(shí)器初值
OCR0=0x00; //比較匹配初值
}
void init()
{
MCUCR=0x0a;
GICR=0xc0;
SREG=0x80;
}
void main()
{
port_init();
init();
time_init();
while(1)
{
OCR0=wide;
show_dat(wide);
}
}
#pragma vector = 0x04
__interrupt void int0()
{
delay(100);
wide=wide+10;
if(wide>255)wide=0;
}
#pragma vector = 0x08
__interrupt void int1()
{
delay(100);
wide=wide-10;
if(wide<0) wide=0;
}