📄 pic16f690.c
字号:
#include "pic.h"
__CONFIG(INTIO&MCLRDIS&BORDIS&UNPROTECT&BORDIS&PWRTEN&WDTDIS);
//代码保护关,WRT、BODEN、PWRTE关,看门狗关,MCLR在内部连接到VDD
#define TRISC2OUT TRISC4
#define C2OUT RC4
#define TRISC2IN TRISC0
#define TRISC12IN3 TRISC3
#define TRIST1CKI TRISA5
#define LED_OUT RC1
#define TRIST_LED TRISC1
#define TRIST_SDO TRISC7
#define SDO RC7
#define TRIST_SDI TRISB4
#define TRIST_SCK TRISB6
long present;
unsigned char i;
unsigned char first;
unsigned char avg_interval;
static char AVG_interval;
static int Frequency_Value;
static int average;
void Initial(void);
void Capinitial(void);
void CapISR(void);
void RestartTimer(void);
void interrupt isr(void);
void SPI_Initial(void);
void SPI_SendData(char data);
void Initial()
{
i = 0;
TRISC2OUT = 0; //数据输出
C2OUT = 0;
TRISC2IN = 1; //C2VIN+、C12IN3-为模拟口输入口
TRISC12IN3= 1;
TRIST1CKI = 1;
LED_OUT = 0;
TRIST_LED = 0;
Capinitial() ;
SPI_Initial();
GIE = 1; //全局中断开
}
void Capinitial()
{
first = 60; //上电延迟
avg_interval= 0;
AVG_interval= 32; //随环境改变参数
OSCCON = 0X6F; //内部时钟4M
CM1CON0 = 0X97; //C1比较器开,反相输出,C1OUT内部输出,C1VIN+连接到C1Vref
CM2CON0 = 0XA3; //C2比较器开,同相输出,C2OUT引脚输出,C2VIN+连接到C2IN+
CM2CON1 = 0X00;
SRCON = 0XF0; //SR锁存器开
VRCON = 0X8F; //C1Vref=2/3*VDD
ANSEL = 0X90; //C2VIN+、C12IN3-为模拟口
ANSELH = 0X00;
OPTION = 0X85; //TMR0预分频1:64
TMR0 = 0;
TMR1L = 0;
TMR1H = 0;
T1CON = 0X07; //TMR1预分频1:1 ,TMR1使能
INTCON = 0; //清中断寄存器
T0IE = 1; //TMR0中断使能
}
void CapISR()
{
Frequency_Value = TMR1L + (unsigned int)(TMR1H << 8);
if (first > 0)
{
first--;
average = Frequency_Value;
RestartTimer();
return;
}
present = (long)average - (long)Frequency_Value;
if (present < 0)
present = 0;
else
present = present*1000/average;
if (present > 10)
LED_OUT = 1;
if (present < 5)
LED_OUT = 0;
if (avg_interval < AVG_interval)
avg_interval++;
else
avg_interval = 0;
if (avg_interval == AVG_interval)
{
average = average + ((long)(Frequency_Value) - (long)(average))/16;
i++;
if (i == 2)
{
i = 0;
SPI_SendData(TMR1H);
SPI_SendData(TMR1L);
}
}
RestartTimer();
}
void RestartTimer()
{
T0IF = 0;
TMR0 = 0;
TMR1L = 0;
TMR1H = 0;
T1CON = 0X07; //TMR1预分频1:1 ,TMR1使能
T0IE = 1; //TMR0中断使能
}
void interrupt isr(void)
{
if (T0IF == 1 && T0IE == 1) //TMR0溢出中断
{
TMR1ON = 0; //TMR1中止
CapISR();
}
if ( T0IF == 1)
RestartTimer();
}
void SPI_Initial() //主模式,只发送数据
{
SSPIE = 0; //禁止SSP中断
SSPIF = 0; //清SSP中断标志位
TRIST_SDO = 0; //SDO为输出
SDO = 0;
TRIST_SDI = 0;
RB4 = 0;
TRIST_SCK = 0; //SCK为输出
SSPCON = 0X20; //SSPEN=1;CKP=0 , FOSC/4
SSPSTAT = 0X80;
}
void SPI_SendData(char data) //SPI发送数据
{
SSPBUF = data; //启动发送
do
{
NOP();
}while(SSPIF == 0); //等待发送完毕
SSPIF = 0; //清除SSPIF标志
}
void main()
{
Initial();
while(1)
{
NOP();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -