📄 ir.c
字号:
//参考程序B: C程序 //IR.C
//程序说明:此程序接收红外发射过来的数据解码后由CPU读取并显示在LED数码管上.
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
#define PORTA 0x8000 /*8255的A口*/
#define PORTB 0x8001 /*8255的B口*/
#define PORTC 0x8002 /*8255的C口*/
#define PORTCON 0x8003 /*8255的控制口*/
#define DataPort 0x8400 /*红外数据接收口*/
void PORT_Init (void); //端口初始化
void displayled(void) ;//显示1位数据
sbit BUZ = P3^5;
unsigned char ReadFlag; /*读红外数据标志*/
unsigned char ReadData,IRData;
unsigned char WE[6]={1,2,4,8,0x10,0x20}; //位选
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)
{
EIE2 |= 0x10; /*允许外部中断6*/
}
void INT6_ISR(void) interrupt 18
{
P3IF &= ~0x40; /*清外部中断6标志*/
ReadFlag = 0x01; /*置允许读标志*/
}
void main (void) {
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; /*蜂鸣器灭*/
displayled() ;//显示1位数据
do{
ReadData = *Pointir;
}while((ReadData&0x80)==0x80); /*上次红外中断是否结束*/
_nop_();
}
_nop_();
}
void PORT_Init (void)
{
EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高*/
/*低脉宽占1个SYSCLK周期*/
EMI0TC |= 0x6d; /*地址建立/保持时间占1个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
P74OUT=0x3f; /*P7为漏极开路,P4,P5,P6为推拉方式*/
}
void displayled(void)
{unsigned int i;
unsigned char k;
char j;
unsigned char xdata * Pointm;
unsigned char code F7SEG[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
Pointm=PORTCON;
*Pointm=0x80; //8255初始化,设定B口输出,C口输出,A口不用
while(1) //循环显示
{
k=F7SEG[IRData]; // 查表,得到字形码数值存放在变量K中
Pointm=PORTB; // B口存放字位码
*Pointm=0x01; //从左边第一位数码管开始显示数字
Pointm=PORTC; //C口存放字形码
*Pointm=k; //显示K中存放的字形码
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -