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

📄 main.c.bak

📁 PIC18F4580计算频率的程序
💻 BAK
字号:
#include<PIC18.h>

#include "def.h"
#include"lib.h"

#define uint unsigned int
#define uchar unsigned char

/**********************************/
/*函数定义*/
/**********************************/
void device_init(void);
void port_init(void);

bit ledflag;

void interrupt highints(void)
{
 uchar c;
 high_int=1;

 if(RCIF)
{
   c=RCREG;//由于接收是双缓冲结构,所以读的时候读两次,第二次才是需要的值
   if(c=='0')
     ledflag=0;
   else 
     ledflag=1;
     RCIF=0;
 }
}
void interrupt low_priority lowints(void)
{
	if(TMR3IF)
		{
			 TMR3ON=0;//暂停T3
       TMR3IF=0;//清T3中断标志
       channel_int_num=channel_error|=((1<<now_channel));//置通道错误标志,且认为该通道已经完成检测
       ccp_over=1;
			}
	if(CCP1IF)
	 	 {
			
       CCP1IF=0;//清零CCP1中断标志
       CCP1IE=0;
/*************************************************************
本段程序可能出现的问题,原因是频率可能过快,首先排除CCP1中断的可能

在第2句存储前更新,则第2句存储了新的值,漏了一次中断
第2句存储后CCP1IE使能前更新,存储旧的值,漏了一次中断
中断使能后更新,发生中断,没有问题,

当漏掉更新后,下次更新的值就是采集了两个周期了,计算出来的频率会是实际的1/2,
不过根据处理器的速度,两次采集的时间肯定在0.5ms以内,
在这种情况下,频率应该>2KHZ,即使漏掉了一次也不要紧
*************************************************************/

        if(channel_int_num&(1<<now_channel))//(1)//是第一次捕获中断
        {
          channel_period[now_channel][0]=CCPR1L;//记录首次中断数值(2)
          channel_period[now_channel][0]+=(uint)(CCPR1H)<<8;
          channel_int_num&=~(1<<now_channel);//将通道中断次数置0(3)
          channel_error&=~(1<<now_channel);//将通道状态清零,正常
          CCP1IE=1;
 }
  else //是第二次捕获中断
  {
  CCP1IE=0;//暂停CCP1中断
  TMR3ON=0;//暂停T3
  channel_period[now_channel][1]=CCPR1L;//记录第二次中断数值(2)
  channel_period[now_channel][1]+=(uint)(CCPR1H)<<8;
  channel_int_num|=(1<<now_channel);//将通道中断次数置1
  ccp_over=1;
  }
		 	}
	 }
void port_init(void)
{
 PORTA=0XFF;
 TRISA=0Xff;

 PORTB=0XFF;
 TRISB=0Xff;

 PORTC=0XFF;//
 TRISC=0X94;//1001 0100
 
 PORTD=0XFF;
 TRISD=0x00;//
}

void device_init(void)
{
 port_init();
 uart_init(FOSC,BUAD);
 ccp1_init();
 lcd_init();
 WDTCON=0x00;//禁止看门狗
 }

void main(void)
{ 
  
   delay(1000);//启动延时
   device_init();
   GIE=1;
   while(1)
   {
    ccp();
    frequency_caculate(); 
    CLRWDT();
   }
        
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -