⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir.c

📁 C8051F系列单片机外围电路功能模块程序
💻 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 + -