⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 PIC单片机程序
💻 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 + -