📄 interrupt.c
字号:
/****************************************************************************************
项目工程: 超声传感器应用程序
单片机: PIC16F876A
晶振: 20MHz
*****************************************************************************************/
#include <pic.h>
#define RCRA1 PORTA^=0x02
#define RCRA0 PORTA^=0x01
void Delay (unsigned int t)//延时子程序
{
while(t)t--;
}
unsigned char LEDDATA[]=
{
0x3F,0x06,0x5B,0x4F,0x66, //01234 共阴数码管显示
0x6D,0x7D,0x07,0x7F,0x6F, //56789
};
unsigned char LEDBuffer[3]={0,0,0}; //动态数码管显示的缓冲区定义
unsigned char ScanLEDCount=0;
unsigned char ScanLEDPoint=0x01;
unsigned char TMPL,TMPH;
unsigned int temp=0;
unsigned int CountValue=0;
bit flag=0;
unsigned char INT_Time=0;
//unsigned char Point=0x01;
void initial (void);
/*****************************初始化程序***************************************************/
void initial (void)
{
GIE=0;
/************************I/O口初始化********************************************************/
PORTA=0;
TRISA=0;
PORTB=0; //定义A口RA2为输入,其他为输出
PORTC=0;
TRISB=0x01; //B口为输出
TRISC=0x80; //C口最高位RXD为输入,其他为输出
// ADCON1&=0x07; ADCON1|=0x07;
//置RA0-RA5为数字IO
PCFG2=1;
PCFG1=1;
PCFG0=1;
TRISA=0x04;
INTEDG=0;
INTE=1;
INTF=0;
/*********************TMR0初始化,定时25us作为40khz频率发生器*****************/
TMR0=256-21; //定时1mS初值装入TMR0
T0CS=1; //选择TMR0工作
PSA=0;
T0IF=0; //清TMR0溢出标志位
PS2=0; //TMR0分频比为1:2
PS1=0;
PS0=0;
T0IE=1;
/*********************TMR1初始化,作为接收定时器**************************************/
T1OSCEN=0; //禁止自带振荡器功能
TMR1CS=0; //工作于定时方式
T1CKPS1=0; //预分频比为1:4
T1CKPS0=0;
//T1SYNC=1; //异步方式
TMR1H=0;
TMR1L=0;
TMR1IF=0;
TMR1IE=1; //TMR1允许中断
PEIE=1; //允许第二梯队的中断源
/*********************TMR2初始化,定时13ms作为扫描数码管定时器******************/
T2CKPS1=1; //预分频系数为1:16
T2CKPS0=1;
TOUTPS3=0; //后分频系数为1:16
TOUTPS2=1;
TOUTPS1=1;
TOUTPS0=1;
TMR2=0; //定时13.107ms的初值
TMR2IF=0; //清定时器2中断标志
TMR2IE=1; //允许定时器2中断
PEIE=1; //允许第二梯队的中断源
TMR2ON=1;//关定时器2
GIE=1; //开全局中断
}
void Display ()
{
unsigned char i;
INTE=0;
TRISB=0x00;
PORTB=LEDDATA[LEDBuffer[ScanLEDCount]];
PORTC=PORTC|ScanLEDPoint;
for(i=0;i<255;i++)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
PORTB=0;
PORTC=0;
ScanLEDPoint=ScanLEDPoint<<1;
ScanLEDCount++;
if(8==ScanLEDPoint)ScanLEDPoint=0x01;
if(3==ScanLEDCount)ScanLEDCount=0;
TRISB=0x01;
INTE=1;
}
/********************************主程序*********************************************/
void main (void)
{
// unsigned char i,j;
// unsigned int adder=0;
initial();
while(1)
{
Delay(10000);
// Delay(10000);
Delay(40000);
Delay(40000);
// Delay(40000);
RA3=1;
T0CS=0;
TMR1ON=1;
//
// flag=1;
// while(RA2==0);
// TMR1ON=0;
// T0CS=1;
// if(j==1)
// {
// TMPL=TMR1L;
// TMPH=TMR1H;
// CountValue=TMPH*256+TMPL;
// }
Delay(600);
// INT_Time=0;
TMR1ON=1;
/////////@@@@@@@@********
//滤波处理程序
// adder+=CountValue;
/* if(j==20)
// {adder=adder/20;}*/
// flag=0;
// TMR1H=0;
// TMR1L=0;
T0CS=1;
RA1=0;
RA3=0;
temp=CountValue;
LEDBuffer[2]=temp/100;
temp=temp%100;
LEDBuffer[1]=temp/10;
temp=temp%10;
LEDBuffer[0]=temp;
RCRA0;
}
}
void interrupt PIC16F876A_ISR(void)
{
if(INTF==1)
{
INTF=0;
TMR1ON=0;
RA1=0;
INT_Time++;
// if(INT_Time==1)
// {
TMPL=TMR1L;
TMPH=TMR1H;
CountValue=TMPH*256+TMPL;
// }
TMR1H=0;
TMR1L=0;
}
if(T0IF==1)
{
T0IF=0;
TMR0=256-21;
RCRA1;
}
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H=0;
TMR1L=0;
}
if(TMR2IF==1)
{
TMR2IF=0;
Display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -