使用AT89S51单片机制作红外遥控器,

发布者:采菊东篱下最新更新时间:2023-06-28 来源: elecfans关键字:AT89S51  单片机  红外遥控器 手机看文章 扫描二维码
随时随地手机看文章

本文档的主要内容详细介绍的是使用AT89S51单片机制作红外遥控器的资料和源代码详细说明。


一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz的方波进行脉冲幅度调制而产生的。


当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。


上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。一般电视遥控器的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。


根据红外编码的格式,发送数据前需要先发送9ms的起始码和4.5ms的结果码。


接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以红外遥控器发送红外信号时,参考上面遥控串行数据编码波形图,在低电平处发送38kHz红外信号,高电平处则不发送红外信号。


C51程序代码:

#include 《AT89X51.h》

static bit OP; //红外发射管的亮灭

static unsigned int count; //延时计数器

static unsigned int endcount; //终止延时计数

static unsigned char flag; //红外发送标志

char iraddr1; //十六位地址的第一个字节

char iraddr2; //十六位地址的第二个字节

void SendIRdata(char p_irdata);

void delay();

void main(void)

{

count = 0;

flag = 0;

OP = 0;

P3_4 = 0;

EA = 1; //允许CPU中断

TMOD = 0x11; //设定时器0和1为16位模式1

ET0 = 1; //定时器0中断允许

TH0 = 0xFF;

TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次

TR0 = 1;//开始计数

iraddr1=3;

iraddr2=252;

do{

delay();

SendIRdata(12);

}while(1);

}

//定时器0中断处理

void timeint(void) interrupt 1

{

TH0=0xFF;

TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次

count++;

if (flag==1)

{

OP=~OP;

}

else

{

OP = 0;

}

P3_4 = OP;

}

void SendIRdata(char p_irdata)

{

int i;

char irdata=p_irdata;

//发送9ms的起始码

endcount=223;

flag=1;

count=0;

do{}while(count《endcount);

//发送4.5ms的结果码

endcount=117

flag=0;

count=0;

do{}while(count《endcount);

//发送十六位地址的前八位

irdata=iraddr1;

for(i=0;i《8;i++)

{

//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

//停止发送红外信号(即编码中的高电平)

if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0

{

endcount=41; //1为宽的高电平

}

else

{

endcount=15; //0为窄的高电平

}

flag=0;

count=0;

do{}while(count《endcount);

irdata=irdata》》1;

}

//发送十六位地址的后八位

irdata=iraddr2;

for(i=0;i《8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count《endcount);

irdata=irdata》》1;

}

//发送八位数据

irdata=p_irdata;

for(i=0;i《8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count《endcount);

irdata=irdata》》1;

}

//发送八位数据的反码

irdata=~p_irdata;

for(i=0;i《8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count《endcount);

irdata=irdata》》1;

}

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

flag=0;

}

void delay()

{

int i,j;

for(i=0;i《400;i++)

{

for(j=0;j《100;j++)

{

}

}

}


关键字:AT89S51  单片机  红外遥控器 引用地址:使用AT89S51单片机制作红外遥控器,

上一篇:C51编程经验汇总分享
下一篇:基于AT89C51单片机和放大器实现音频信号均幅控制放大电路的设计

推荐阅读最新更新时间:2024-11-10 08:12

解析单片机的几种复位电路
在单片机的使用中,经常会接触到复位电路,它是单片机最小系统重要的一个构成部分。同样它也是非常重要的一部分。 复位就是让单片机从初始化状态开始重新运行,即程序从头开始执行。复位电路设计的好坏,直接影响整个系统是否稳定可靠。复位电路与单片机的RESET/NRST引脚相连,拿STM32系列单片机举例,当系统正常工作时,如果RESET引脚电压低于某一阈值,则单片机进入复位状态。单片机的复位可分为低电平复位和高电平复位,这是由厂家决定的,区分的方式可以看数据手册,手册中的复位章节会写清楚是什么电平复位。单片机的复位可以分为:上电复位、掉电复位、软件复位、外部手动复位等。 上电复位:单片机每次上电都会给RESET脚一个复位信号,让单片
[单片机]
解析<font color='red'>单片机</font>的几种复位电路
MCU为兼顾省电及功能 休眠频率应更具弹性
对智能型感应设备来说,为因应长时间运作需求,便须达到电源最佳化。其中,微控制器(MCU)的省电设计关键,在于了解应用情境以设计休眠模式,关闭必要的周边协同单元,同时强化不干扰微控制器的自主功能,才能兼顾省电及功能性。 根据Electronics Weekly网站报导,对采用电池供电的各式感应装置来说,为使设备时时保持运作(always on)状态,设计上反而需将其开发成几乎保持休眠(always off)状态,才能达到节省电力的目的。 不过,设备休眠时间的比例依设备的用途而有所不同。例如,心跳感应器需以50Hz的频率采样,才能取得正确数据。而家庭温度感应器则仅需每秒采样一次即可,二者休眠时间有所不同。 同样的,设备工
[单片机]
51单片机实验10:定时器中断
目的:通过定时器中断控制延时,使第一盏led的状态反转 开发板muc与led模块电路图如下: 关于定时器和计数器的要点请参考:https://blog.csdn.net/cax1165/article/details/86659302 关于中断的要点请参考:https://blog.csdn.net/cax1165/article/details/86633086 #include reg52.h #define uc unsigned char sbit led=P2^0; void timeint0() { TMOD=0X01;//工作方式 TH0=0XFC;//定时1ms TL0=0X18;//定时
[单片机]
51<font color='red'>单片机</font>实验10:定时器中断
51单片机ucos ii任务切换汇编代码分析(1)
ucos中任务切换函数都是汇编写的,属于“需移植”文件, 这个汇编文件名一般叫做:OS_CPU_A.ASM 要想看懂任务切换的原理,首先遇到的第一个难点,就是OS_CPU_A.ASM这个汇编文件里的一大堆不常见的汇编伪指令,搞懂这些指令是搞懂程序原理的第一步。 这篇文章先只分析这些汇编指令。 这个文件为ucos操作系统提供了4个API函数,分别是: PUBLIC OSStartHighRdy;函数功能:切换到已就绪的任务横纵优先级最高的那个任务中去 PUBLIC OSCtxSw ;函数功能:一般的上下文切换,ContextSwitch,上下文切换又叫任务切换 PUBLIC OSIntCtxSw ;函数功能:在
[单片机]
定时器中断是什么意思,定时器中断的工作原理
定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1。STM32中共有11个定时器。 一、定时器中断是什么意思 定时器中断是由单片机中的定时器溢出而申请的中断。 51单片机中有两个定时器T0和T1: (1)TF0:定时器T0溢出中断请求。当定时器TO产生溢出时,TO中断请求标志TF0置1,请求中断处理。 (2)TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。 Stm32共有11个定时器: 1、两个高级定时器:TIM1、TIM8-------------------------APB2 2、四个通用定时器:TIM2~TIM5-------------
[单片机]
基于C8051F120单片机实现虚拟仪器测试系统的设计
1、 引言 虚拟仪器是基于计算机的仪器。计算机和仪器密切结合,构建虚拟仪器代替复杂笨重的模拟仪器是目前仪器发展的趋势。与传统仪器相比,虚拟仪器在智能化、处理能力、性价比、可操作性等方面都具有明显优势,能将分散的仪器设备集中管理,实现生产流程的自动化管理,提高生产效率,降低成本。 2、 系统组成 本系统设计是一种新型的虚拟仪器测试系统,它是由数据采集系统和数据通讯子系统组成,其结构框图如图1所示。数据采集系统是以C8051F120单片机为核心,C8051F120单片机功能强大,可实现对目标信号精确采集、数字滤波和通过串口RS-232高速向上位机传输采集的数据通讯,上位机用LabVIEW完成数据的转换处理、分析、显示。数据采集系统
[测试测量]
基于C8051F120<font color='red'>单片机</font>实现虚拟仪器测试系统的设计
C8051F单片机PWM输出程序
//PWM输出脚P0.3 //----------------------------------------------------------------------------- // Includes //----------------------------------------------------------------------------- #include // SFR declarations #include #include //----------------------------------------------------------------------------- // Fun
[单片机]
基于单片机控制技术的无线电遥控多通道开关系统设计
随着集成电路技术的飞速发展,基于各类芯片新型遥控的不断出现。遥控装置的中心控制部件已从早期的分立元件、集成电路逐步发展到现在的单片微型计算机,智能化程度大大提高。   在无线遥控领域,目前常用的遥控方式主要有超声波遥控、红外线遥控、无线电遥控等。由于无线电波的自身技术特点可以在很大区域和空间内实现,成为遥控的主要方式,并在生产、建设和日常生活中具有广泛的应用价值。   为此,在前人研究的基础上探索出了一种基于单片机控制技术的可编程无线电遥控多通道开关系统的设计方法。研究表明,采用该方法设计的遥控开关系统控制方便,适用于含有较多受控电器的场合,可实现多路多功能控制。   2 系统设计   2.1 系统分析   系统结构主要由天
[模拟电子]
基于<font color='red'>单片机</font>控制技术的无线电遥控多通道开关系统设计

推荐帖子

MPLAB® Harmony之学习篇(五)-- 认识Harmony驱动和系统服务
本文转自Microchip麦田论坛——作者:炮灰哥通过本文希望大家了解MPLAB®Harmony的框架的组成模块有一个系统的概念,并对驱动和系统服务有个初步的认识。本文讨论以下内容:Harmony的主要软件模组Harmony中的驱动Harmony中的系统服务Harmony框架如下图所示,主要由六类软件模块组成:PLIB–外设库,实现直接对外设寄存器的访问;
橙色凯 Microchip MCU
msgQreceive返回error,表示什么?
是代表队列没数据,还是什么错误啊?一般都是什么引起的?多谢啊msgQreceive返回error,表示什么?
gtongy 嵌入式系统
Sense和Source之间的电压限制
正如前面对R/2R阶梯式网络介绍的那样,HI和LO端的source和sense之间都存在5V的最大电压限制。2400并不检查实际电压是否超过了这个限制,因为每条引线上的最大电阻必须是已知的。可以通过下列计算避免测量误差:Rmax是其中一条信号源引线上的最大引线电阻。例如,如果RSourceLO=200kΩ,RSource
Jack_ma 测试/测量
【安信可BW16-Kit】OLED显示
本篇讲述在SDK上i2c驱动,实现oled显示。一.硬件准备oled模块---开发板VCC---3V3GND---GNDSDA---PA26SCL---PA25硬件连接如下图:图1:oled模块接线二.代码准备1.驱动源码oled.c,oled.h编写准备,并分别放在hp工程src_hp和inc_hp目录下,工程添加后如下图2:工程源码添加oled.c含oled初始化函数OLED_In
dirty RF/无线
verilog中初值定义
此内容由EEWORLD论坛网友郝旭帅原创,如需转载或用于商业用途需征得作者同意并注明出处在利用verilog进行开发时,往往需要对某些寄存器进行赋初值,下面根据笔者在设计中遇到的情况进行分析。例如下面是实现流水灯(4个led),代码如下:moduleledrun(inputwireclk,inputwirerst_n,out
郝旭帅 模拟电子
TMC2208测试(问题排查)
TMC2208测试报告目录1.问题回顾2.测试平台展示3.针对性测试3.1.待机电流特性3.2.匀速过程电流特性4.总结 问题回顾 在上次测试中,主要对待机电流,微步的平滑度,电机加速/减速等进行测试,通过测试出的相电流波形不难看出电流波形圆滑,也不存在畸变的情况。但是保持电流的波动较大,匀速阶段也存在些许毛刺。初步推断是由于杜邦线的原因,为此我又进行了测试。 测试平台展示 本次测试和上次使用的平台一样,唯一的区别是将对接杜邦线改为新的单
m9wo 电机驱动控制(Motor Control)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved