51单片机实训项目之“红外控制小风扇”代码详解

这篇具有很好参考价值的文章主要介绍了51单片机实训项目之“红外控制小风扇”代码详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本代码实现的功能是通过红外遥控来控制风扇的转速。废话不多说,直接上代码。

另外补充一点红外通信的原理:

51单片机实训项目之“红外控制小风扇”代码详解

红外接收51单片机实训项目之“红外控制小风扇”代码详解

NEC协议:

数据格式      发射端的方波图,接收端的正好与之相反,数据传输从最低位开始

NEC 标准下的编码表示

51单片机实训项目之“红外控制小风扇”代码详解

其中:引导码高电平约9000us 左右,低电平约4500us 左右;

用户码16 位,数据码16 位,共32位;

数据0 是用“高电平约560us +低电平约560us”表示。

数据1 可用“高电平约560us+低电平约1680us”表示。

51单片机实训项目之“红外控制小风扇”代码详解

 信号调制和解调:通常为了使信号能更好的被传输,发送端将基带二进制信号调制为脉冲串信号,通过红外发射管发射。

51单片机实训项目之“红外控制小风扇”代码详解

/*
红外无线遥控风扇 +  加速  按- 减速
*/
#include <reg52.h>

sbit DU  = P2^6;   //数码管段选
sbit WE  = P2^7;   //数码管位选
sbit S2 = P3^0;
sbit S3 = P3^1;

 /*====================================
 自定义类型名
====================================*/
typedef unsigned char INT8U;
typedef unsigned char uchar;

typedef unsigned int INT16U;
typedef unsigned int uint;
/*====================================
 硬件接口位声明
====================================*/
sbit IR  = P3^2;     //定义红外脉冲数据接口	外部中断O输入口

uchar IRtime; 		//检测红外高电平持续时间(脉宽)
uchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)
uchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)
bit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕

unsigned char const discode[] ={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,0x6F,0x40,0x00/*-*/};

unsigned char pwm_left_val = 225;//左电机占空比值 取值范围0-170,0最快
unsigned char pwm_t;//周期



void time0() interrupt 1   //定义定时器0
{
	IRtime++; 			   //检测脉宽,1次为278us
}
//定时器1中断
void timer1() interrupt 3
{
	pwm_t++;
	if(pwm_t == 250)
		pwm_t = P1 = 0;
	if(pwm_left_val == pwm_t)
			P1 = 0xff;					 
}
void int0() interrupt 0	  		//定义外部中断0
{
	static uchar i;	 			//	声明静态变量(在跳出函数后在回来执行的时候不会丢失数值)i用于把33次高电平的持续时间存入IRdata
	static bit startflag;		//开始储存脉宽标志位
	if(startflag)	 			//开始接收脉宽检测
	{
		if( (IRtime < 53) && (IRtime >= 32) ) /*判断是否是引导码,底电平9000us+高4500us	
		这个自己可以算我以11.0592来算了NEC协议的引导码低8000-10000+高4000-5000 
		如果已经接收了引导码那么i不会被置0就会开始依次存入脉宽*/
			i = 0;				 //如果是引导码那么执行i=0把他存到IRdata的第一个位
		IRdata[i] = IRtime;  		 //以T0的溢出次数来计算脉宽,把这个时间存到数组里面到后面判断
		IRtime = 0;				 //计数清零,下一个下降沿的时候在存入脉宽
		i++; 					 //计数脉宽存入的次数
		if(i == 33) 				 //如果存入34次 数组的下标是从0开始i等于33表示执行了34次
		{
		 	IRok = 1;				 //那么表示脉宽检测完毕
			i = 0; 				 //把脉宽计数清零准备下次存入
		}
	}
	else		  
	{
		IRtime = 0; 				 //引导码开始进入把脉宽计数清零开始计数
		startflag = 1;			 //开始处理标志位置1
	}
}

void IRcordpro()   				 //提取它的33次脉宽进行数据解码
{
	uchar i, j, k, cord, value;	/*i用于处理4个字节,j用于处理一个字节中每一位,k用于33次脉宽中的哪一位
	cord用于取出脉宽的时间判断是否符合1的脉宽时间*/
	k = 1; 						//从第一位脉宽开始取,丢弃引导码脉宽
	for(i = 0; i < 4; i++)
	{
		for(j = 0; j < 8; j++)
		{
			cord = IRdata[k];	    //把脉宽存入cord
			if(cord > 5)	 		//如果脉宽大于我11.0592的t0溢出率为约278us*5=1390那么判断为1
			value = value | 0x80;	/*接收的时候是先接收最低位,
			把最低位先放到value的最高位在和0x08按位或一下
			这样不会改变valua的其他位的数值只会让他最高位为1*/
			if(j < 7)
			{
				value = value >> 1;	//value位左移依次接收8位数据。
			}
			k++;				//每执行一次脉宽位加1
		}
		IRcord[i] = value;	   //每处理完一个字节把它放入IRcord数组中。
		value = 0; 			   //清零value方便下次在存入数据
	}
	IRpro_ok = 1;				   //接收完4个字节后IRpro ok置1表示红外解码完成	
}

void main()
{
	unsigned char i = 9;
	TMOD |= 0x20;//T1 8位自动重装模块
	TH1 = 245;
	TL1 = 245;//11.0592M晶振下占空比最大比值是256,输出100HZ
	TR1 = 1;//启动定时器0
	ET1 = 1;//允许定时器0中断
	EA	= 1;//总中断允许

	TMOD |= 0x02; //定时器0工作方式2,8位自动重装
	TH0 = 0x00;  //高8位装入0那么定时器溢出一次的时间是256个机器周期
	TL0 = 0x00;
	ET0 = 1;	   //定时器0中断
	TR0 = 1;     //启动定时器0

	IT0 = 1;	   //设置外部中断0为跳沿触发方式,来一个下降沿触发一次
	EX0 = 1;	   //启动外部中断0
	//delay(2000);
	WE = 1;
	P0 = 0XFE;
	WE = 0;
	DU = 1;
	P0 = discode[i];
	while(1)
	{
		
		if(IRok)    //判断脉宽是否检测完毕                    
		{   
			IRcordpro();//根据脉宽解码出4个字节的数据
			IRok = 0;	//重新等待脉宽检测
			if(IRpro_ok) //判断是否解码完毕  
			{
		        switch(IRcord[2])
		   		{
				     case 0x15:   //+
					 if(i > 0)
					{
						pwm_left_val = pwm_left_val - 15;
						i--;
						P0 = discode[i];
					}
				             break;
				     case 0x07:   //-
				if(i < 9)
				{
					pwm_left_val = pwm_left_val + 15;
					i++;
					P0 = discode[i];
				}
				             break;
		   		}
				IRpro_ok = 0;
			}
		}	
	}
}

最后,希望我的分享能带给你启发和收获,敬请关注,持续更新中!如有问题,请私信,收到后一定及时回复!

考虑到一些读者需要相关资料和解决一些疑问,因此我新建立了一个学习交流群,我在群文件里上传了一些资料,需要的读者可以入群下载。

群中文件资料我会时常更新,主要资料是51单片机开发、32单片机开发、编程、嵌入式学习、算法控制等。

由于群中文件还在不断更新上传,有些方面的资料还不太完善,希望大家理解。若群中涉及违规行为,欢迎举报!

51单片机实训项目之“红外控制小风扇”代码详解

51单片机实训项目之“红外控制小风扇”代码详解文章来源地址https://www.toymoban.com/news/detail-480904.html

到了这里,关于51单片机实训项目之“红外控制小风扇”代码详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机课设———基于51单片机的智能风扇控制器(汇编语言)

    说明:单片机芯片为AT89C52,使用普中开发板,用汇编语言编程。 系统实现了对风扇的控制: (1)控制器面板包括:启/停键、模式选择键、风速键和类型选择键。 (2)模式分为:手动模式和自动温控模式。在温控模式下,风速键和类型选择键无效。 (3)风速分为:强、中

    2024年02月11日
    浏览(51)
  • 使用C51单片机实现红外遥控行为控制

    目录 引言 红外遥控原理 实现红外遥控功能 代码示例 结论

    2024年02月12日
    浏览(38)
  • 43、基于51单片机数码管温控温度控制风扇系统设计

    温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于单片机的温控风扇系统,采用单片机作为控制器,利用温度传感器DS18B20作为温度采集元件,并根据

    2024年02月04日
    浏览(56)
  • 63、基于51单片机红外遥控人体感应自动门控制系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、Protues仿真 七、程序 部分代码 八、资料包括 伴随着电气技术的发展,电气控制控制技术已经成熟,针对电子自动门进行研究。基于8051内核的单片

    2024年02月03日
    浏览(44)
  • C语言课设项目-51单片机-红外通信

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一. 什么是红外线 二. 红外线系统的组成  三. 红外发射管  四. 红外遥控器发射  五. 红外线接收 六.数据格式 ​七. 位定义 人的眼睛能看到的可见光按波长从长到短排

    2024年02月03日
    浏览(40)
  • 51单片机智能电风扇控制系统proteus仿真设计( 仿真+程序+原理图+报告+讲解视频)

    51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042 基于51单片机的智能电风扇控制系统proteus仿真设计 运用所学知识,制作一个 51单片机智能电风扇控制系统仿真设计

    2024年02月09日
    浏览(45)
  • 51单片机设计多功能电子秤(实训项目)

    1.压力传感器(HX711称重模块) 2.接线说明 如上图接线所示:称重模块HX711模块各个引脚与单片机引脚对应如下: (1).VCC——VCC (2).GND——GND (3).SCLK——SDA (4).DT——SCLK 注:引脚一定要对应接好,尤其是数据(SDA)脚和时钟(SCLK)脚 (一).称重模块原理图 (二).单片机原理图

    2023年04月18日
    浏览(41)
  • 51单片机实训项目之“万年历”代码原理详解

    读者若需要工程源码,可以私信我,收到后会第一时间回复。这是仿真效果  51单片机万年历程序设计(附源码+仿真分享)_哔哩哔哩_bilibili STC89C52 DS18B20(温度传感器) DS1302(时钟芯片) LCD1602液晶显示 独立按键 杜邦线 (一).子程序 EEPROM.h LCD1602.h DS1302时钟模块的三个引脚:

    2024年02月08日
    浏览(48)
  • 51单片机--红外遥控

    红外遥控是一种无线、非接触控制技术, 通过使用红外线来传送控制信号。它具有抗干扰能力强、信息传输可靠、功耗低、成本低、易实现等显著优点 ,因此被广泛应用于各种电子设备和家用电器,也越来越多地应用于计算机和手机系统中。 红外遥控系统一般由 发射和接收

    2024年02月15日
    浏览(40)
  • 51单片机 (十八)红外遥控

    什么是红外线?         人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线.红外线遥控就是利用波长为0.

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包