PIC16F1824做的频率计。输入端为T1CKI引脚,然后串口显示。
#include<pic.h>
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & BOREN_OFF & CLKOUTEN_OFF);
__CONFIG(WRT_OFF & STVREN_OFF & BORV_LO & BOREN_OFF & LVP_OFF);
__IDLOC7(0x20,0x12,0x06,0x01);
#define uchar unsigned char
#define uint unsigned int
uint count,buf,fre;
//**********************************************
// 非精确延时函数
//**********************************************
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++)
{
asm("CLRWDT"); //喂狗
}
}
}
//*****************************************
// 初始化函数
//*****************************************
void init()
{
OSCCON = 0b01101000; //4MHZ
ANSELA = 0x00;
ANSELC = 0x00;
LATA=0x00;
LATC=0x00;
TRISA5=1;
TRISC5 = 1;
TRISC4 = 0;
PEIE=1;
GIE=1;
RCIE = 1;
RCIF = 0;
TXEN = 1;
CREN = 1;
SYNC = 0;
SPEN = 1;
SPBRG = 25; //9600bps
BRGH = 1;
BRG16 = 0;
}
void initTMR0()
{
TMR0IF=0; //清除TMR0中断标志
TMR0IE=1; //TMR0中断允许
OPTION_REG =0x05;//未分配分频器
// TMR0=61;
}
void initTMR1()
{
TMR1ON=1;
TMR1GE=0;//计数使能
TMR1CS1=1;
TMR1CS0=0;
T1OSCEN=0; //将TMR1设置为计数方式
T1CON=0x85;
TMR1H=0;
TMR1L=0;
}
void main()
{
init();
initTMR0();
initTMR1();
while(1)
{
TXREG=(buf/10000)+0x30;while(!TRMT);
TXREG=(buf%10000/1000)+0x30;while(!TRMT);
TXREG=(buf%1000/100)+0x30;while(!TRMT);
TXREG=(buf%100/10)+0x30;while(!TRMT);
TXREG=(buf%10)+0x30;while(!TRMT);
TXREG=0x20;while(!TRMT);
TXREG=0x20;while(!TRMT);
TXREG=0x20;while(!TRMT);
delay(10000);
}
}
void interrupt time0()
{
TMR0IF=0;
// TMR0=61;
count++;
if(count==61)
{
count=0;
TMR1ON=0; //TMR1停止计数
buf=((TMR1H<<8)+TMR1L);
TMR1H=0;
TMR1L=0;
TMR1ON=1;
}
}
|