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

📄 main.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		第一个八 =  P2^4;
sbit		第二个八 =  P2^5;
sbit		第三个八 =  P2^6;
sbit		第四个八 =  P2^7;

sbit 		第一个灯脚位 = P1^0;
sbit 		第二个灯脚位 = P1^1;
sbit 		第三个灯脚位 = P1^2;
sbit 		第四个灯脚位 = P1^3;
sbit 		第五个灯脚位 = P1^4;




sbit		开门脚 = P3^0;
sbit		关门脚 = P3^1;
unsigned char 	点亮当前八;
unsigned int 	二百微秒重复次数;
bit		门的状态;	//为1表示门己关着了
#define		门开着		0
#define		门关着		1

//遥控区
struct 遥控nec{
	unsigned char 二百微秒出现的次数;
	unsigned char 二点五毫秒出现的次数;
	unsigned char 遥控状态;
	unsigned int 系统码;
	unsigned int 客户码;
	unsigned char 码值位数计数;
	unsigned char 遥控键长按重复次数;
};
struct 遥控nec 遥控; 
#define 接收头码  			(遥控.遥控状态 & 0x01)
#define 清除接收头码  			遥控.遥控状态	&=	0x0fe;
#define 置接收头码			遥控.遥控状态	|=	0x01;

#define 重复接收108毫秒  		(遥控.遥控状态 & 0x02)
#define 清除重复接收108毫秒  		遥控.遥控状态	&=	0x0fd;
#define 置重复接收108毫秒		遥控.遥控状态	|=	0x02;

#define 接收客户码  			(遥控.遥控状态&0x04)
#define 清除客户码  			遥控.遥控状态	&=	0x0fb;
#define 置客户码			遥控.遥控状态	|=	0x04;

#define 遥控码接收完毕 			(遥控.遥控状态 & 0x10)
#define 清除遥控码接收完毕  		遥控.遥控状态	&=	0x0ef;
#define 置遥控码接收完毕		遥控.遥控状态	|=	0x10;

//函数声明
void 延时1秒(void);
void 延时10毫秒(void);
void Init_Sys();
void 延时半秒(void);





void main(void)
{
	unsigned char 前一次的八 = 0;
	Init_Sys();
	显示数据(0x1234);
	点亮当前八 = 0;
	//初始化遥控结构的值
	遥控.二百微秒出现的次数 = 0;
	遥控.二点五毫秒出现的次数 = 0;
	遥控.遥控状态 = 0;
	遥控.系统码 = 0;
	遥控.客户码 = 0;
	遥控.码值位数计数 = 0;
	遥控.遥控键长按重复次数 = 0;
	
	当(1)
	{
		
		延时半秒();
		
		
		
		#ifdef Support_18b20
		//显示温度
		如果(遥控.遥控状态 == 0 )
		{
			显示温度(读取温度());
		}
		#endif
	}
 }



//延时子程序
void 延时1秒(void)
{
	二百微秒重复次数 = 0;
	while(二百微秒重复次数 < 5000);
}


//延时子程序
void 延时半秒(void)
{
	二百微秒重复次数 = 0;
	while(二百微秒重复次数 < 2500);
}
//延时子程序
void 延时10毫秒(void)
{
	二百微秒重复次数 = 0;
	while(二百微秒重复次数 < 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;		//
	遥控.二点五毫秒出现的次数 = 0;
	如果(接收头码)
	{
		if(遥控.二百微秒出现的次数 <= (9000 + 4500 + 1000)/200 && 遥控.二百微秒出现的次数 >= (9000 - 1000 )/200)
		{
			清除接收头码;
			置客户码;
		}
	}
	否则如果(接收客户码)
	{
		if(遥控.二百微秒出现的次数 <= (2250 + 400)/200 && 遥控.二百微秒出现的次数 >= (1125 - 400)/200)
		{
			if(遥控.码值位数计数 > 15)
				遥控.客户码 >>= 1;
			else
				遥控.系统码 >>= 1;
			
			if(遥控.二百微秒出现的次数 >= (2250 + 1125)/200/2)
			{
				if(遥控.码值位数计数 > 15)
					遥控.客户码 |= 0x8000;
				else
					遥控.系统码 |= 0x8000;
			}
			遥控.码值位数计数++;
			if(遥控.码值位数计数 == 32)
			{
				置重复接收108毫秒;
				清除客户码;
				遥控.遥控键长按重复次数 = 0;
				显示数据(((遥控.系统码 & 0xff)<< 8) | (遥控.客户码 &0xff));
				遥控.码值位数计数 = 0;
				置遥控码接收完毕;
				
				
			}	
		}
		else
		{
			遥控.遥控状态 = 0;
			置接收头码;
			遥控.码值位数计数 = 0;
		}		
	}
	否则如果(重复接收108毫秒)
	{
		if(遥控.二百微秒出现的次数 >= (9000 + 2250 - 1000)/200)
		{
			遥控.遥控键长按重复次数++;
			显示数据(((遥控.系统码 & 0xff)<< 8) | (遥控.客户码 &0xff));
			
			if(遥控.遥控键长按重复次数 > 10)
			{
				遥控.遥控键长按重复次数 = 0;
			}
			清除遥控码接收完毕;
		}
		else
		{
			遥控.遥控状态 = 0;
			置接收头码;
			遥控.码值位数计数 = 0;
		}
	}
	否则
	{
		置接收头码;
	}
	遥控.二百微秒出现的次数 = 0;
	//EA = 1;		//开总中断
}




//每2.5毫秒中断一次
void time0(void) interrupt 1
{
	//EA = 0;		//
	TH0 = (0xffff - 2500)/256;//定时中断为2.5ms
	TL0 = (0xffff - 2500)%256;
	点亮当前八++;
	#if 1
	第一个八 = 低;
	第二个八 = 低;
	第三个八 = 低;
	第四个八 = 低;
	
	P0=显示区[点亮当前八-1];
	
	switch(点亮当前八)
	{
		case 1:
			第一个八 = 高;
			break;
		case 2:
			第二个八 = 高;
			break;
		case 3:
			第三个八 = 高;
			break;
		case 4:
			第四个八 = 高;
			点亮当前八 = 0;
			break;
		default:
			break;
	}
	#endif
	
	遥控.二点五毫秒出现的次数++;
	
	//如果过了一百一十毫秒证明没有遥控信号
	if(遥控.二点五毫秒出现的次数 > 50)
	{
		if(遥控.遥控状态)
			遥控.遥控状态 = 0;
			
		遥控.二点五毫秒出现的次数 = 0;
	}
	//EA = 1;		//开总中断
	
}

//每200us中断一次
void time1(void) interrupt 3
{
	//EA = 0;		//
	遥控.二百微秒出现的次数 ++;
	二百微秒重复次数++;
	//EA = 1;		//开总中断
}

⌨️ 快捷键说明

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