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