📄 ir.c
字号:
//-----------------------------------------------------------------------------
// 版权归新华龙电子公司所有
//-----------------------------------------------------------------------------
//
//文件名: IR.c
//
//编写人: LC
//
//编写时间:2005/03/10
//
//目标器件: C8051F02x
//
//编译工具: Silicon Laboratories IDE
//
//程序说明: 此程序接收红外发射过来的数据,接收解码后由CPU读取,程序运行前将S2
// 都拨到ON.J17短接第一和第二脚。
//------------------------------------------------------------------------------------
// 头文件包含
//------------------------------------------------------------------------------------
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define DataPort 0x8400 /*红外数据接收口*/
sbit BUZ = P3^5;
unsigned char ReadFlag; /*读红外数据标志*/
//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
void PORT_Init (void);
/***************************************************************************************
函数名称: void sleep_ms(WORD count)
功能描述: 延时
输入: WORD count(所要延时的长度)
输出: 无
全局变量: 无
调用模块: _nop_()
***************************************************************************************/
void sleep_ms(unsigned int count)
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
/***************************************************************************************
函数名称: void INITEXINT67(void)
功能描述: 初始化外部中断6
输入: 无
输出: 无
全局变量: EIE2
调用模块: 无
***************************************************************************************/
void INITEXINT67(void)
{
EIE2 |= 0x10; /*允许外部中断6*/
}
/***************************************************************************************
函数名称: void INT6_ISR(void) interrupt 18
功能描述: 外部中断6的中断服务程序
输入: 无
输出: 无
全局变量: P3IF
ReadFlag: 读取红外数据标志
调用模块: 无
***************************************************************************************/
void INT6_ISR(void) interrupt 18
{
P3IF &= ~0x40; /*清外部中断6标志*/
ReadFlag = 0x01; /*置允许读标志*/
}
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {
unsigned char ReadData,IRData;
unsigned char xdata *idata Pointir;
/*无效看门狗*/
WDTCN = 0xde;
WDTCN = 0xad;
PORT_Init(); /*输入/输出口初始化*/
INITEXINT67(); /*初始化外部中断6*/
EA=1; /*开总中断*/
ReadFlag=0;
while(1){
while(ReadFlag==0x00); /*是否允许读红外数据*/
Pointir=DataPort;
ReadData=*Pointir; /*读红外数据*/
if((ReadData&0x80)==0x00) continue; /*是否接到红外数据*/
IRData = ReadData &0x0f; /*保存收到的红外数据*/
BUZ = 0; /*蜂鸣器响*/
sleep_ms(250);
BUZ = 1; /*蜂鸣器灭*/
_nop_();
do{
ReadData = *Pointir;
}while((ReadData&0x80)==0x80); /*上次红外中断是否结束*/
_nop_();
}
_nop_();
}
/***************************************************************************************
函数名称: void PORT_Init(void)
功能描述: 配置交叉开关和输入/输出口
输入: 无
输出: 无
全局变量: XBR2,P74OUT,EMI0CF,EMI0TC,P3MDOUT
调用模块: 无
***************************************************************************************/
//------------------------------------------------------------------------------------
// PORT_Init
//------------------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
XBR2 = 0x40; /*使能交叉开关和弱上拉*/
P74OUT |= 0x0f; /*使能P4~P7推挽输出*/
EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
EMI0TC |= 0x6c; /*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
P3MDOUT |= 0x00; /*使能P3.5推挽输出*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -