基于PIC16F877A的簡易數(shù)字頻率計
//本程序利用CCP1模塊實現(xiàn)一個“簡易數(shù)字頻率計”的功能
#include pic.h>
#include stdio.h>
#include math.h>
const char table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0xFF};
//不帶小數(shù)點的顯示段碼表
const char table0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xFF};
//帶小數(shù)點的顯示段碼表
bank3 int cp1z[11]; //定義一個數(shù)組,用于存放各次的捕捉值
union cp1
{int y1;
unsigned char cp1e[2];
}cp1u; //定義一個共用體
unsigned char COUNTW,COUNT; //測量脈沖個數(shù)寄存器
unsigned char COUNTER,data,k;
unsigned char FLAG @ 0XEF;
#define FLAGIT(adr,bit) ((unsigned)(adr)*8+(bit)) //絕對尋址位操作指令
static bit FLAG1 @ FLAGIT(FLAG,0);
static bit FLAG2 @ FLAGIT(FLAG,1);
static bit FLAG3 @ FLAGIT(FLAG,2);
unsigned char s[4]; //定義一個顯示緩沖數(shù)組
int T5 ,uo;
double RE5;
double puad5;
//spi方式顯示初始化子程序
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
//設(shè)置SPI的控制方式,允許SSP方式,并且時鐘下降沿發(fā)送,與74HC595,當其
//SCLk從低到高跳變時,串行輸入寄存器的特點相對應(yīng)
TRISC=0xD7; //SDO引腳為輸出,SCK引腳為輸出
TRISA5=0; //RA5引腳設(shè)置為輸出,以輸出顯示鎖存信號
FLAG1=0 ;
FLAG2=0 ;
FLAG3=0 ;
COUNTER=0X01;
}
//CCP模塊工作于捕捉方式初始化子程序
void ccpint( )
{
CCP1CON=0X05; //首先設(shè)置CCP1捕捉每個脈沖的上升沿
T1CON=0X00; //關(guān)閉TMR1震蕩器
PEIE=1; //外圍中斷允許(此時總中斷關(guān)閉)
CCP1IE=1; //允許CCP1中斷
TRISC2=1; //設(shè)置RC2為輸入
}
//系統(tǒng)其它部分初始化子程序
void initial( )
{
COUNT=0X0B; //為保證測試精度,測試5個脈沖的參數(shù)后
//求平均值,每個脈沖都要捕捉其上升、下降沿,
//故需要有11次中斷
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1; //設(shè)置與鍵盤有關(guān)的各口的輸入、輸出方式
RB1=0;
RB2=0; //建立鍵盤掃描的初始條件
}
//SPI傳送數(shù)據(jù)子程序
void SPILED(data)
{
SSPBUF=data; //啟動發(fā)送
do {
?。?br /> }while(SSPIF==0);
SSPIF=0;
}
//顯示子程序,顯示4位數(shù)
評論