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

📄 embed.c

📁 8051红外接收程序
💻 C
字号:
#include <AT89X52.H>
#include "intrins.h"
//#include "absacc.h"

#define uchar unsigned char
#define uint unsigned int

bit rbit;//接收到脉冲

uint Num_Of_Circle;
uint array[6]={1,2,3,4,5,6};   //显示数据存储区
uint display;

//阳极段码
uchar code	SEGPOS[34]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
											//"0"		"1"	"2"		"3"	"4"		"5"	"6"		"7"	"8"		"9"	"A"		"B"	"C"		"D"	"E"		"F"	"-"	 "空" "0." "1."	"2."	"3.""4."	"5.""6."	"7.""8."	"9.""A."	"B.""C."	"D.""E."	"F."	
											//带点的比不带点的大18个位置	  
//阴极段码											
uchar code	SEGNEG[34]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00,0xBF,0x86,0xD4,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1};
//uchar code  CON[6]={0x3E,0x3D,0x3B,0x37,0x2F,0x1F};//数据显示的位选信号00111110	到00011111
uchar code  CON[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//数据显示的位选信号11111110	到11011111
uint code  RED[29]={0xE200, //1
0xE210	, //2
0xE208	, //3
0xE218	, //4
0xE204	, //5
0xE214	, //6
0xE20C	, //7
0xE21C	, //8
0xE280, //9
0xE288	, //1-
0xE298	, //2-
0xE250	, //p v
0xE248	, //p ^
0xE244	, //v v
0xE254	, //v ^
0xE2C4	, //色度v
0xE2D4	, //色度^
0xE2CC	, //亮度v
0xE2DC	, //亮度^
0xE25C	, //TV/AV
0xE2F8	, //TIM0xE
0xE2D8, //+
0xE2D0, //->。<-
0xE2E4	, //ON.T
0xE2F4, //S0xEL
0xE2E8	, //CLOCK
0xE2EC	, //INC
0xE240	, //CLOSE
0xE24C	, //QUITE
};//M50462AP编码								低电平340us ,‘0’高电平730us ,‘1’高电平1.8ms			

uchar data inkey _at_ 0x30;//按键值
uchar data  key_down _at_ 0x7E;//按键次数
uchar key;
char IRCODE[2];
void initial(void)
{
	/*
	//51系列的专用寄存器
	PC	ACC	B(乘除法)	PSW(CY,AC,F0,RS1,RS2,OV,P)	DPTR(16位)	SP	SBUF

	IE	(EA,/,ET2,ES,ET1,EX1,ET0,EX0)
	IP	(/,/,/,PS,PT1,PX1,PT0,PX0)	//"0"位优先级低
	PCON	//最高位控制波特率加倍
	SCON	(SM0,SM1,SM2,REN,TB8,RB8,TI,RI)//方式0是移位;方式
	TCON	(TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0)//IEx 外部中断请求;ITx 外中断请求触发方式(1是脉冲负跳,0是电平低);TFx 计数溢出
	TMOD	(GATE1,C/~T,M1,M0,GATE0,C/~T,M1,M0)//方式0是13位;方式1是16位;方式2自动重载;
	T2CON (TF2,EXF2,RLCLK,TCLK,EXEN2,TR2,C/~T2,CP/~RL2)
														RCLK+TCLK   CP/~RL2    TR2    MODE
														0            0         1       16位自动重载(定时器1串口)
														0            1         1       16位捕捉(定时器1串口)
														1            x         1       波特率发生器
														x            x         0			 (不用)
	T2MOD (....,T2OE,DCEN)  DCEN上计数
	//*/
	
//*
	T2CON=0x30;//位C/T2(T2CON.1)必须清0,
	T2MOD=0x02;//位T2OE(T2MOD.1)必须置1
	SCON=0x50;//方式1(8位数据),可接收
	
	PCON=0x00;//波特率不加倍
	RCAP2L=0xB7;//时钟输出频率=晶振频率/{4 [65536-( RCAP2H,RCAP2L)]}
	RCAP2H=0xFF;//定时器2编程时钟输出38K
	
//*/
	inkey=0;key_down=0;
	rbit=1;IRCODE[0]=0x00;IRCODE[1]=0x00;
	Num_Of_Circle=0;display=0;
  
	TMOD=0x21;//T1 计时(方式2自动重载),T0 计时(方式1),	GATE C/~T M1 M0 
	TH0=0xFF;	TL0=0x83;//500us
	TH1=0xFD;	TL1=0xFD;//2400bps  11.0592M时钟晶振
	
	TR0=1;	TR1=1;	TR2 = 1;
	ET0=1;	ET1=0;
	IT0 = 1; //INT0下降沿有效
	EX0 = 1; //开INT0中断;
	EX1=0;
  ES=1;
	EA=1;
}
void Delay(void)
{
	uint TempCyc;
	for (TempCyc=0; TempCyc<6; TempCyc++);//0.05ms 防抖动
}

void delay10ms(uint s)//100 == 1second
{
	uint i;
	while(s--)
	{
		for(i=0;i<255;i++)
		{
			_nop_();
			_nop_();	
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}
void getKey()
{
	P3=P3|0xF0;
	delay10ms(1);
	key=P3&0xF0;
	if(key!=0xF0  && key_down==0)
		{
			key_down+=1;
			switch(key)
			{
				case 0x70:
					inkey=1;
					break;
				case 0xB0:
					inkey=2;
					break;
				case 0xD0:
					inkey=3;
					break;
				case 0xE0:
					inkey=4;
					break;
				default:
					key_down=0;
					break;
				}
			}
}

void show( uint bitCon,uint num)
{
  uchar seg =SEGPOS[num];
	P2=P2&0xC0;
	P0=seg;	
	switch(bitCon)
	{
    case 0:
			P2=P2|CON[0];
			break;
		case 1:
			P2=P2|CON[1];
			break;
		case 2:
			P2=P2|CON[2];
			break;
		case 3:
			P2=P2|CON[3];
			break;
 		case 4:
			P2=P2|CON[4];
			break;
		case 5:
			P2=P2|CON[5];
			break;

	}
}
uint READ(void)
{
	uint i;
	for(i=0;i<130;i++)
	{
		if(!P3_2) break;
	}
	if(i==130)
		{
			return 1;
		}
		else
			{
				return 0;
			}
}
/*
void setplay(char h2bit ,char m2bit,char l2bit)
{
		array[5]=h2bit/10%10;
		array[4]=h2bit%10;
		array[3]=m2bit/10%10;
		array[2]=m2bit%10;
		array[1]=l2bit/10%10;
		array[0]=l2bit%10;
}
//*/
void setplay(char h2bit ,char m2bit,char l2bit)
{
		array[5]=h2bit/10%10;
		array[4]=h2bit%10;
		array[3]=m2bit/10%10;
		array[2]=m2bit%10;
		array[1]=l2bit/10%10;
		array[0]=l2bit%10;
}
void check()
{
	uchar i,m,l;
	uint temp1,temp2;
//	setplay(10,3,7);
	temp1=(uint)IRCODE[0]&0x00FF;
	for(i=0;i<29;i++)
	{
		temp2=0x00FF&RED[i];
		if(temp1==temp2)
			{
				m=i+1;
				setplay(0,m,l);
			}
	}
}
void main()
{
    uint LED=0xFF7F;
    initial();

    while(1)
    {
	     getKey();//获得按键输入
	     if(key_down)
	     {
		     	key_down=0;
		     	P3_0=!P3_0;
	     }
	  
/*				
			P1=LED;//7个跑马灯
			LED=LED>>1;

		
			if(!rbit)
				P1=IRCODE[1];//7个跑马灯
//*/
/*
			if(LED==0x01FE)   //	0x01FE   0x00FF
			{
				LED=0xFF7F;
			}
//*/     
    }
}

/*/////////////////////////////////////////////////////////////
各中断函数的具体处理
//*/
void TIME0() interrupt 1			//
{
	TH0=0xF8;	TL0=0xCC;//100usFFA4  1msFC66  2msF8CC  4msF199 5msEE00 10msDC00  40ms7000     2^16-XX*1000*0.9216
	if(Num_Of_Circle ++==200)
	{	
		if(!rbit)
			check();
		Num_Of_Circle=0;			
		rbit=1;
		IRCODE[1]=0x00;
		IRCODE[0]=0x00;
	}
	P2_7=!P2_7;
	
			//动态显示四位数据
      show(display,array[display]);
      if(display==5)
      	{
      		display=0;     		
      	}
			else
				display +=1;
	
}

void TIME1() interrupt 3
{
}

void EX0INT()   interrupt 0	//低电平340us ,‘0’高电平730us ,‘1’高电平1.8ms		11100010
{
	uint i;
	EX0=0;
	if(rbit)
	{
		for(i=0;i<16;i++)
		{
			Delay();
			if(!P3_2)
			{
				while(!P3_2) ;
				if( READ())
				{
						switch(i)
						{
							case 0:
								IRCODE[1]=IRCODE[1]|0x80;
								break;
							case 1:
								IRCODE[1]=IRCODE[1]|0x40;
								break;
							case 2:
								IRCODE[1]=IRCODE[1]|0x20;
								break;
							case 3:
								IRCODE[1]=IRCODE[1]|0x10;
								break;
							case 4:
								IRCODE[1]=IRCODE[1]|0x08;
								break;
							case 5:
								IRCODE[1]=IRCODE[1]|0x04;
								break;
							case 6:
								IRCODE[1]=IRCODE[1]|0x02;
								break;
							case 7:
								IRCODE[1]=IRCODE[1]|0x01;
								break;
							case 8:
								IRCODE[0]=IRCODE[0]|0x80;
								break;
							case 9:
								IRCODE[0]=IRCODE[0]|0x40;
								break;
							case 10:
								IRCODE[0]=IRCODE[0]|0x20;
								break;
							case 11:
								IRCODE[0]=IRCODE[0]|0x10;
								break;
							case 12:
								IRCODE[0]=IRCODE[0]|0x08;
								break;
							case 13:
								IRCODE[0]=IRCODE[0]|0x04;
								break;
							case 14:
								IRCODE[0]=IRCODE[0]|0x02;
								break;
							case 15:
								IRCODE[0]=IRCODE[0]|0x01;
								break;
						}
				}
			}				
			while(P3_2)	;//等下一位
		}
		SBUF=IRCODE[0];
		P1=IRCODE[1];
		rbit=0;
	}
	EX0=1;
}


void EX1INT()   interrupt 2
{
}

void  SERIAL()  interrupt 4
{
	uchar temp;
//*
	if(TI)
		TI=0;
	if(RI)
	{
		RI=0;
		temp=SBUF;
		SBUF=temp;
	}
//*/	
}
///////////////////////////////////////////////////////////////


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -