📄 shan.c
字号:
#include <pic.h>
/***********************/
//---fosc=4MHz---//
#define DLY_882US 110 //0.88ms
#define DLY_1000US 128
#define DLY_4740US 607
/***********************/
unsigned char BufferCount;
unsigned char Buffer[2];
#define INFRARED RB0//红外线接口定义
#define SPEAKER RC1//蜂鸣器接口定义
char i;
char j;
char k;
void shan()
{ for(i=0;;i++)
{ TMR1H=(65536-65535)/256;
TMR1L=(65536-65535)%256;
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1ON=0;
TMR1IF=0;
PORTD=~PORTD;
}
}
void main(void)
{
TRISD=0;
PORTD=0xFF;
TRISC0=0;
SPEAKER=1;
TRISB0=1;
RB0=1;
T1OSCEN=0;//禁止自带振荡器功能
TMR1CS=0;//选择内部时钟源(FOSC/4),工作于定时方式
T1CKPS1=1;//预分频比为1:8
T1CKPS0=1;
TMR1IF=0;
RBPU=0;//启RB内部若上拉功能
INTEDG=0;//选择下降沿触发
INTF=0;
INTE=1;//允许INT开中断
GIE=1;//允许CPU开中断
while(1);
}
void interrupt Infrared_isr(void)
{
unsigned char i,j;
unsigned char temp;
GIE=0;
if(INTF==1)
{
INTF=0;
INTE=0;
TMR1H=(65536-1120)/256;
TMR1L=(65536-1120)%256; //0.904ms
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1ON=0;
TMR1IF=0;
if(INFRARED==1)goto Exit_Int0;
while(INFRARED==0);
TMR1H=(65536-630)/256; //5ms
TMR1L=(65536-630)%256;
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1ON=0;
TMR1IF=0; //跳过将近5ms的低电平
while(INFRARED==0); //把用户吗的第一个低电平浪费掉
TMR1H=(65536-12)/256; //进入用户码的第一个高电平一点点
TMR1L=(65536-12)%256;
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1ON=0;
TMR1IF=0;
for(j=0;j<26;j++) //跳过26位用户码
{
while(INFRARED==0);
while(INFRARED==1);
}
TMR1H=(65536-12)/256; //进入下一个高电平一点点
TMR1L=(65536-12)%256;
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1ON=0;
TMR1IF=0;
BufferCount=0; //解用户码控制码前八位
temp=0;
for(i=0;i<8;i++)
{
temp>>=1;
while(INFRARED==0);
TMR1H=(65536-DLY_882US)/256;
TMR1L=(65536-DLY_882US)%256;
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1IF=0;
TMR1ON=0;
if(INFRARED==1)temp+=0x80;
if(INFRARED==1)
{
TMR1H=(65536-DLY_1000US)/256;
TMR1L=(65536-DLY_1000US)%256;
TMR1IF=0;
TMR1ON=1;
while(TMR1IF==0);
TMR1IF=0;
TMR1ON=0;
}
}
if(temp==0b00000001)
shan();
Exit_Int0:
INTF=0;
INTE=1;
}
GIE=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -