当前位置: 首页 > news >正文

51单片机-红外遥控解码

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2010/09/27/5910475.aspx

image image

IR(Infrared Radiation)通用红外遥控系统由发射和接受两大部分组成,应用编/解码专用集成电路芯片来进行控制操作。发射部分包括键盘矩阵,编码调制,LED红外线发射。接受部分包括光,电转化放大器,解调,解码电路。接收电路可以使用一种集红外线接受和放大于一体的一体化红外接收器,不需要任何外接元件,就能完成从红外线接受到输出与TTL电平信号兼容的所有工作,而体积和普通的塑料三极管大小一样。它适合于各种红外线遥控和红外线数据传输。接收器对外只有3个引脚OUT,GND,VCC与单片机接口非常方便。

image

发射码的格式:

image

遥控器输出波形:

image

接受到的波形和发送的波形正好是反向,比如发送的是一高电平然后一低电平,接受的会是一低电平和一高电平。

image

外部中断触发方式:低电平和下降沿。

下面这段代码的作用是用遥控器向单片机发送数据,单片机响应并改变数码管上的数据。

这段代码仍然有问题,正在调试中,路过的大牛希望给与指导:

#include <reg52.h> #define uint unsigned int #define uchar unsigned char uint irtime,startflag,i,bitnum,decodeok,receiveok; uchar irdata[33],disp[8],vcode[4]; unsigned char code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char code wei[]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; void delay(int k){ int i,j; for(i = 0; i < k; i++) for(j = 0; j < 0xff; j++) ; } void Time0_Init(){ EA = 1; ET0 = 1; TH0 = 0x00; TL0 = 0x00; TMOD = 0x02; TR0 = 1; } void Int0_Init(){ EA = 1; IT0 = 1; EX0 = 1; } void Irpro(){ disp[0] = vcode[0] / 16; //把十六进制的数转化成两位显示 disp[1] = vcode[0] % 16; disp[2] = vcode[1] / 16; disp[3] = vcode[1] % 16; disp[4] = vcode[2] / 16; disp[5] = vcode[2] % 16; disp[6] = vcode[3] / 16; disp[7] = vcode[3] % 16; } void display(){ for(i = 0; i < 8; i++){ P1 = wei[i]; P2 = duan[disp[i]]; delay(1); } } void decode(){ uint k,i,j; uchar value; j = 1; for(k = 0; k < 4; k++){ value = 0; for(i = 0; i < 8; i++){ if(irdata[j]>6) //如果大于6个irtime是高电平 value |= 0x01 << i; j++; } vcode[k] = value; } decodeok = 1; } void main(){ Time0_Init(); //对定时器中断进行初始化 Int0_Init(); //对下降沿中断进行初始化 while(1){ if(receiveok == 1){ //如果接受成功进行解码 receiveok = 0; decode(); } if(decodeok == 1){ //如果解码成功,转换一下格式准备显示 decodeok = 0; Irpro(); } display(); } } void time0() interrupt 1{ //由于是模式2,8位自动重装,所以一个irtime为256us irtime++; } void int0() interrupt 0{ if(startflag){ if(irtime > 32){ //如果是引导信息,则bitnum清零 bitnum = 0; } irdata[bitnum] = irtime; //装载数据,包括1位引导位,16位用户码,8位数据码和8位数据码反码 irtime = 0; bitnum++; if(bitnum == 33){ //装载数据完成 bitnum = 0; receiveok = 1; } } else{ startflag = 1; //遇到第一个下降沿让irtime为0,遇到第二个时计算用了多少个irtime irtime = 0; } }

相关文章:

  • 汇编实验课程设计1
  • [转]实验室小科普之:方便又健康——洗水果的学问
  • C++ is on the way 8: 类初始化列表的分析总结
  • 异步DNS解析的实现
  • 图像绘制功能【OpenCV学习笔记5】
  • nopCommerce 3.3正式发布及新增功能改进
  • 对视频流进行边缘检测【OpenCV学习笔记6】
  • 发布一快速开发报表的类库,让报表的开发具有前所未有的方便和快速
  • 一个实用并且确实的内核补丁--关于桥接nat的
  • PHP数据连接主键与外键!
  • 封建制度的意义
  • 读苹果开发文档时遇到瓶颈,转而花2天看了Objc基本语法
  • 一幅数据在linux网络流动的图--非流程图
  • linux内核网络实现的一些问题
  • php global范例
  • 【技术性】Search知识
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HTTP 简介
  • JavaScript-Array类型
  • JavaScript学习总结——原型
  • java多线程
  • React系列之 Redux 架构模式
  • uni-app项目数字滚动
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 当SetTimeout遇到了字符串
  • 记录一下第一次使用npm
  • 前端之React实战:创建跨平台的项目架构
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 小程序开发之路(一)
  • 一道面试题引发的“血案”
  • ionic入门之数据绑定显示-1
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Lua:Lua调用C++生成的DLL库
  • #pragma once与条件编译
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (06)金属布线——为半导体注入生命的连接
  • (10)ATF MMU转换表
  • (3)STL算法之搜索
  • (39)STM32——FLASH闪存
  • (4)logging(日志模块)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (九)c52学习之旅-定时器
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)Java算法:二分查找
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net Core和.Net Standard直观理解
  • .NET Core跨平台微服务学习资源
  • .NET(C#) Internals: as a developer, .net framework in my eyes