📄 irdrv.c
字号:
//***********************************************************************************************************************
// *Filedis: IR driver
// *Author: Meijjun Wang,ShangHai,China
// *E-MAIL: Jimmy416@163.com
// *Sys Info: MCS51 @ 12MHz /DG00B board
// *date: 2006.5
//***********************************************************************************************************************
//*****************************************************************************************************************
//红外发射芯片UPD6121G接收驱动程序
//接收头为一体化红个接收头,可以将38K红外信号解调成TTL电平
//*****************************************************************************************************************
#include <reg52.h>
#include "1602.h"
#include "IrDrv.h"
unsigned int HardId,IRValue;
bit okflag=0;
//---------------------------------------------------------------------
//延时,延时时间为 val*2+3 us
//@12MHz
//---------------------------------------------------------------------
void delayus(unsigned char val){
while(--val);
}
//---------------------------------------------------------------------
//初始化
//---------------------------------------------------------------------
void IrInit(void){
INT0 = 1;
EA = 1; //开中断
EX0 = 1; //外部中断0开启
IE0 = 1; //外部中断边沿触发
}
//--------------------------------------------------------------------
//中断服务程序
//--------------------------------------------------------------------
void Int0ser(void) interrupt 0{
unsigned char i=0;
unsigned int count=0;
EX0 = 0; //关闭INT0中断
//------------------------------------------------------------
count=0;
while(INT0==0){ //开始时序中的9ms低电平等待
count++;
if(count>=3000){ //超时
EX0 = 1;
return;
}
}
//------------------------------------------------------------
count=0;
while(INT0==1){ //开始时序中的4.5ms高电平等待
count++;
if(count>=1500){ //超时
EX0 = 1;
return;
}
}
//------------------------------------------------------------
HardId = 0x00;
for(i=0;i<16;i++){ //32个位接收
count = 0;
while(INT0==0){ //等待0.56ms低电平过去
count++;
if(count>=3000){ //超时
EX0 = 1;
return;
}
}
delayus(200);delayus(200); //延时大概800us
if(INT0==1) {HardId |= (0x01<<i);} //'1',如果800us后还是1,表示此位为1,否则为0
count = 0;
while(INT0==1){ //等待高电平过去
count++;
if(count>=3000){ //超时
EX0 = 1;
return;
}
}
}
//-------------------------------------------------------------
IRValue = 0x00;
for(i=0;i<16;i++){ //16个硬件标实位接收
count = 0;
while(INT0==0){ //等待0.56ms低电平过去
count++;
if(count>=3000){ //超时
EX0 = 1;
return;
}
}
delayus(200);delayus(200); //延时大概800us
if(INT0==1) {IRValue |= (0x01<<i);} //'1',如果800us后还是1,表示此位为1,否则为0
count = 0;
while(INT0==1){ //等待高电平过去
count++;
if(count>=3000){ //超时
EX0 = 1;
return;
}
}
}
//------------------------------------------------------------
okflag = 1;
EX0 = 1; //重开INT0中断
}
unsigned char GetIrValue(void){
unsigned int temp,temp2;
if(okflag){
okflag = 0;
temp = (IRValue>>8)&0x00FF;
temp2 = (~IRValue & 0x00FF);
if(temp==temp2){
return temp;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -