AVR我從一無(wú)所知學(xué)到現(xiàn)在也懂了些皮毛 我想用M16制作一個(gè)頻率計(jì),我的設(shè)計(jì)思路是這樣的:在精確定時(shí)的一秒中內(nèi)對(duì)輸入的脈沖方波進(jìn)行計(jì)數(shù);在這一秒鐘內(nèi)對(duì)計(jì)數(shù)器的溢出次數(shù)進(jìn)行累計(jì),那么,輸入脈沖的頻率=溢出次數(shù)X計(jì)數(shù)器最高計(jì)數(shù)+最后一次計(jì)數(shù)器內(nèi)的計(jì)數(shù)值!------------可是怎樣才能制作一個(gè)能同時(shí)開(kāi)啟計(jì)數(shù)器ATTR0和定時(shí)器ATTRB的閘門(mén),閘門(mén)的觸發(fā)由輸入方波的某一上升沿觸發(fā)???
我編了一個(gè)簡(jiǎn)單的程序 可是可是經(jīng)Proteus仿真總是相差幾微妙不能同步開(kāi)啟 還有 沒(méi)有能用輸入上升沿觸發(fā)定時(shí)和計(jì)數(shù)。

//ICC-AVR application builder : 2011-6-4 22:14:10
源代碼如下:
// Target : M16 // Crystal: 8.0000Mhz
#include <iom16v.h> #include <macros.h>
#define uchar unsigned char #define uint unsigned int uint num=0,n=0; #pragma interrupt_handler miao:9 mm:10; //#pragma interrupt_handler miao:9 //中斷向量10為T(mén)CCR0的,中斷向量9為T(mén)CCR1的 #pragma data:code ///-----------------------延時(shí)函數(shù)--------------------------------------- void delay(uint ms) { uint i; for(i=0;i<ms;i++); } //------------------------------計(jì)數(shù)函數(shù)---------------------------------------*/ void mm() { TCNT0=0X9C; PORTD|=BIT(0); PORTD&=~BIT(0); }
//-----------------------------定時(shí)函數(shù)----------------------------------- void miao() { TIMSK|=BIT(0); if (n==1) { TIMSK=0X00; num=TCNT0; } else TCNT1H=0X85; TCNT1L=0XEF; PORTA|=BIT(3); PORTA&=~BIT(3); n++; //TIMSK&=~BIT(2); } //---------------------------------初始化函數(shù)--------------------------------------- void csh() { TCNT0=0X9C; TCNT1H=0X85; TCNT1L=0XEF; delay(20); //改變延時(shí)湊足總中斷為一秒 TCCR0=0X07; //T/C0 為輸入上升沿驅(qū)動(dòng) TCCR1B=0X04; //T/C1B為256分頻 TIMSK|=BIT(2); //T/C1溢出中斷使能 SREG|=BIT(7); //總中斷使能 } //-----------------------主函數(shù)------------------------------------- void main() {
DDRA|=0XFF; DDRD=0XFF; DDRC=0XFF; csh(); //此句占用1個(gè)周期
}
|