📄 main.c.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 + -