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

📄 led8.c

📁 此程序为51,可以接收红外遥控,读温度18b20.非常好懂.欢迎下载
💻 C
字号:
//--------------------------------------------------
//
//		作者:闵运华
//		qq:121758163
//		Email:minyunhua163@163.com
//--------------------------------------------------
#define Support_18b20
#define Support_i2c
#define Support_led



#include <reg51.h>
#ifdef Support_led
	#include <led.h>
#endif

#ifdef Support_18b20
	#include <18b20.h>
#endif

#ifdef Support_i2c
	#include <i2c.h>
#endif

sbit		Tab00000 =  P2^4;
sbit		Tab00001 =  P2^5;
sbit		Tab00002 =  P2^6;
sbit		Tab00003 =  P2^7;

sbit 		Tab00004 = P1^0;
sbit 		Tab00005 = P1^1;
sbit 		Tab00006 = P1^2;
sbit 		Tab00007 = P1^3;
sbit 		Tab00008 = P1^4;




sbit		Tab00009 = P3^0;
sbit		Tab00010 = P3^1;
unsigned char 	Tab00011;
unsigned int 	Tab00012;
bit		Tab00013;	//为1表示门己关着了
#define		Tab00014		0
#define		Tab00015		1

//遥控区
struct Tab00016nec{
	unsigned char Tab00017;
	unsigned char Tab00018;
	unsigned char Tab00019;
	unsigned int Tab00020;
	unsigned int Tab00021;
	unsigned char Tab00022;
	unsigned char Tab00023;
};
struct Tab00016nec Tab00016; 
#define Tab00024  			(Tab00016.Tab00019 & 0x01)
#define Tab00025  			Tab00016.Tab00019	&=	0x0fe;
#define Tab00026			Tab00016.Tab00019	|=	0x01;

#define Tab00027108Tab00028  		(Tab00016.Tab00019 & 0x02)
#define Tab00029108Tab00028  		Tab00016.Tab00019	&=	0x0fd;
#define Tab00030108Tab00028		Tab00016.Tab00019	|=	0x02;

#define Tab00031  			(Tab00016.Tab00019&0x04)
#define Tab00032  			Tab00016.Tab00019	&=	0x0fb;
#define Tab00033			Tab00016.Tab00019	|=	0x04;

#define Tab00034 			(Tab00016.Tab00019 & 0x10)
#define Tab00035  		Tab00016.Tab00019	&=	0x0ef;
#define Tab00036		Tab00016.Tab00019	|=	0x10;

//函数声明
void Tab000371Tab00038(void);
void Tab0003710Tab00028(void);
void Init_Sys();
void Tab00039(void);





void main(void)
{
	unsigned char Tab00040 = 0;
	Init_Sys();
	Tab00041(0x1234);
	Tab00011 = 0;
	//初始化遥控结构的值
	Tab00016.Tab00017 = 0;
	Tab00016.Tab00018 = 0;
	Tab00016.Tab00019 = 0;
	Tab00016.Tab00020 = 0;
	Tab00016.Tab00021 = 0;
	Tab00016.Tab00022 = 0;
	Tab00016.Tab00023 = 0;
	
	while(1)
	{
		
		Tab00039();
		
		
		
		#ifdef Support_18b20
		//显示温度
		if(Tab00016.Tab00019 == 0 )
		{
			Tab00044(Tab00045());
		}
		#endif
	}
 }



//延时子程序
void Tab000371Tab00038(void)
{
	Tab00012 = 0;
	while(Tab00012 < 5000);
}


//延时子程序
void Tab00039(void)
{
	Tab00012 = 0;
	while(Tab00012 < 2500);
}
//延时子程序
void Tab0003710Tab00028(void)
{
	Tab00012 = 0;
	while(Tab00012 < 50);
}

void Init_Sys()
{
	TH0 = (0xffff - 2500)/256;//定时中断为2.5ms
	TL0 = (0xffff - 2500)%256;
	TMOD = 0x01;// t0为十六位计数器
	TR0 = 1;		//允许时间零中断
	ET0 = 1;
	
	TH1 = 55;
	TL1 = 55;
	TMOD |= 0x20;//时间计数器1的工作模式为八位自动重装
	TR1 = 1;		//允许时间零中断
	ET1 = 1;
	
	
	IE0 = 1;	//开外部中断零
	EX0 = 1;
	IT0 = 1;// INT0低电平触发(为1则为下降沿触发
	EA = 1;		//开总中断
	
}

//外部中断零
void ex0_int(void) interrupt 0
{
	//EA = 0;		//
	Tab00016.Tab00018 = 0;
	if(Tab00024)
	{
		if(Tab00016.Tab00017 <= (9000 + 4500 + 1000)/200 && Tab00016.Tab00017 >= (9000 - 1000 )/200)
		{
			Tab00025;
			Tab00033;
		}
	}
	else if(Tab00031)
	{
		if(Tab00016.Tab00017 <= (2250 + 400)/200 && Tab00016.Tab00017 >= (1125 - 400)/200)
		{
			if(Tab00016.Tab00022 > 15)
				Tab00016.Tab00021 >>= 1;
			else
				Tab00016.Tab00020 >>= 1;
			
			if(Tab00016.Tab00017 >= (2250 + 1125)/200/2)
			{
				if(Tab00016.Tab00022 > 15)
					Tab00016.Tab00021 |= 0x8000;
				else
					Tab00016.Tab00020 |= 0x8000;
			}
			Tab00016.Tab00022++;
			if(Tab00016.Tab00022 == 32)
			{
				Tab00030108Tab00028;
				Tab00032;
				Tab00016.Tab00023 = 0;
				Tab00041(((Tab00016.Tab00020 & 0xff)<< 8) | (Tab00016.Tab00021 &0xff));
				Tab00016.Tab00022 = 0;
				Tab00036;
				
				
			}	
		}
		else
		{
			Tab00016.Tab00019 = 0;
			Tab00026;
			Tab00016.Tab00022 = 0;
		}		
	}
	else if(Tab00027108Tab00028)
	{
		if(Tab00016.Tab00017 >= (9000 + 2250 - 1000)/200)
		{
			Tab00016.Tab00023++;
			Tab00041(((Tab00016.Tab00020 & 0xff)<< 8) | (Tab00016.Tab00021 &0xff));
			
			if(Tab00016.Tab00023 > 10)
			{
				Tab00016.Tab00023 = 0;
			}
			Tab00035;
		}
		else
		{
			Tab00016.Tab00019 = 0;
			Tab00026;
			Tab00016.Tab00022 = 0;
		}
	}
	else
	{
		Tab00026;
	}
	Tab00016.Tab00017 = 0;
	//EA = 1;		//开总中断
}




//每2.5毫秒中断一次
void time0(void) interrupt 1
{
	//EA = 0;		//
	TH0 = (0xffff - 2500)/256;//定时中断为2.5ms
	TL0 = (0xffff - 2500)%256;
	Tab00011++;
	#if 1
	Tab00000 = 0;
	Tab00001 = 0;
	Tab00002 = 0;
	Tab00003 = 0;
	
	P0=Tab00049[Tab00011-1];
	
	switch(Tab00011)
	{
		case 1:
			Tab00000 = 1;
			break;
		case 2:
			Tab00001 = 1;
			break;
		case 3:
			Tab00002 = 1;
			break;
		case 4:
			Tab00003 = 1;
			Tab00011 = 0;
			break;
		default:
			break;
	}
	#endif
	
	Tab00016.Tab00018++;
	
	//如果过了一百一十毫秒证明没有遥控信号
	if(Tab00016.Tab00018 > 50)
	{
		if(Tab00016.Tab00019)
			Tab00016.Tab00019 = 0;
			
		Tab00016.Tab00018 = 0;
	}
	//EA = 1;		//开总中断
	
}

//每200us中断一次
void time1(void) interrupt 3
{
	//EA = 0;		//
	Tab00016.Tab00017 ++;
	Tab00012++;
	//EA = 1;		//开总中断
}

⌨️ 快捷键说明

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