📄 main.c
字号:
#include <pic.h>
#include <pic1687x.h>
#include <stdio.h>
#include <string.h>
#include "port_def.h"
#include "func_def.h"
void main()
{
unsigned long fre_int,temp;
float fre_flo;
double delta_f;
unsigned char i,j;
const char con_char[] = "Frequency:"; // 11 char
unsigned char num[13];
char string [13]; //浮点数的字符串型
INTCON = 0x00; //关闭所有中断
PORTC = 0x00; //
TRISC = 0xF8; //0,1,2输出;3,4,5,6,7输入
//使用串口功能RC6/7设置为输入
PSPMODE = 0; //D口工作于I/O方式
PORTD = 0x00;
TRISD = 0x00; //D口为输出端口
INTEDG = 1; //外部中断上升沿触发
T0IE = 1;
INTE = 1; //打开外部中断使能
RBIE = 0;
PIE1 = 0x01;
PIE2 = 0x00;
PEIE = 1; //外设中断使能
GIE = 1; //全局中断使能
usart_init(); //初始化串口
timer1_init(); //初始化Timer1
counter0_init(); //初始化计数器0
// SPI_init(); //初始化同步串口
SY = 1;
while(1)
{
if(cal_flag == 1)
{
cal_flag = 0;
frequency = 4.0*(65536.0*T1_counter + 256.0*T1_RH +1.0*T1_RL)/Fosc;
frequency = (65536.0)/frequency;
delta_f = 1.2758e-10*frequency*frequency + 2.8913e-4*frequency;
frequency = frequency + delta_f;
temp_f[count_f] = frequency;
count_f = count_f + 1;
if(count_f == 11)
{count_f = 1;}
for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++)
if(temp_f[i]>temp_f[i+1])
{mean_f = temp_f[i];temp_f[i] = temp_f[i+1]; temp_f[i+1] = mean_f;}
mean_f = 0;
for(i=3;i<=8;i++)
{
mean_f = mean_f + temp_f[i];
}
mean_f = mean_f/6.0;
frequency = mean_f;
fre_int = (unsigned long)frequency;
fre_flo = frequency - fre_int;
num[0]=(unsigned char)(fre_int/100000);
temp = (fre_int%100000);
num[1]=(unsigned char)(temp/10000);
temp = (fre_int%10000);
num[2]=(unsigned char)(temp/1000);
temp = (fre_int%1000);
num[3]=(unsigned char)(temp/100);
temp = (fre_int%100);
num[4]=(unsigned char)(temp/10);
num[5]=(unsigned char)(fre_int%10);
num[6]=202;
fre_int = (unsigned long)((frequency - (float)fre_int)*1000000.0);
num[7]=(unsigned char)(fre_int/100000);
temp = (fre_int%100000);
num[8]=(unsigned char)(temp/10000);
temp = (fre_int%10000);
num[9]=(unsigned char)(temp/1000);
temp = (fre_int%1000);
num[10]=(unsigned char)(temp/100);
temp = (fre_int%100);
num[11]=(unsigned char)(temp/10);
num[12]=(unsigned char)(fre_int%10);
for(i=0;i<14;i++)
{
string[i] = num[i] +48;
}
for(i=0;i<11;i++)
{
send_char((unsigned char)*(con_char + i));
}
string[6] = '.';
for(i=0;i<13;i++)
{
send_char((unsigned char)*(string + i));
}
send_char(10);
send_char(13);
T1_counter = 0;
T1_RH = 0;
T1_RL = 0;
TMR1ON = 0;
TMR1L = 0x00;
TMR1H = 0x00;
INTE = 1; //打开外部中断使能
}
/*
for(temp=0;temp<4096;temp++)
{
data_low = *((unsigned char *)(&temp));
data_high = *((unsigned char *)(&temp)+1);
data_high &= 0x0F;
SY = 0;
delay(10);
SPI_send(data_high);
SPI_send(data_low);
delay(10);
SY = 1;
delay(10);
}
*/
}
}
//延时函数
void delay(unsigned char ms)
{
unsigned char i;
for(i=0;i<ms;i++);
}
//中断处理函数
void interrupt ISR(void)
{
if(TMR1IE && TMR1IF) //Timer1
{
TMR1IF = 0;
T1_counter = T1_counter + 1;
}
if(T0IE && T0IF) //TMR0
{
TMR1ON = 0; //close TMR1
T0IF = 0; //clear bit
T1_RL = TMR1L;
T1_RH = TMR1H;
cal_flag = 1;
}
if(INTE && INTF) //INT
{
INTE = 0; //关自身中断使能
TMR0 = 0x00; //TMR0 开始计数
T0IE = 1; //TMR0 中断使能
TMR1ON = 1; //打开TMR1
}
//*****************************************************//
if(RCIE && RCIF) //USART 接收
{
if(rec_ins[0] != 0xEB)
{
rec_ins[0] = RCREG;
}
else if(rec_ins[0] == 0xEB && rec_done == 0)
{
rec_ins[rec_count] = RCREG;
rec_count = rec_count + 1;
if(rec_count == 6)
{
rec_done = 1;
rec_count = 1;
}
}
else
rec_temp = RCREG;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -