红外线遥控c语言程序,红外遥控的C程序

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.

引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.

遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为

EF10也是互为反码.关于SC6122的资料在我们的网页资料下载上有.

SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,

低电平在4000-5000之间都看作是正常范围.

引导码后的32位编码(16位系统码和16位键码)不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高电平持续时间是2250

微秒,所以低电平除去载波时间大约是560微秒,高电平除去载波时间大约是1680微秒.低电平也有一个波动范围,在400-700之间都看作是正常

的,具体多少可以通过示波器测量出来.高电平也有一个波动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕

捉红外线的范围也越宽,越精确.在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微

秒是高电平.

下面有两个经过实践能在实验板上显示键码的程序,一个是汇编写的,一个是用C写的,与大家一起探讨遥控器.

以下程序能在LCD上显示系统码和键码,按不同的按键,系统码不变,变的是键码.有不懂的地方可以在留言本上留言.

RS EQU P2.5                 ;这几个是LCD引脚.

RW EQU P2.6

E EQU P2.7

IRR EQU P3.3                ;红外接收的输出接P3.3.

BUF EQU 30H ;30H-33H保存解码结果

;=============================================

ORG 0000H

AJMP MAIN

;=============================================

ORG 0030H

MAIN:

MOV SP,#70H ;堆栈指针设到70H的地方

ACALL INIT_LCD                                    ;初始化LCD

MOV R7,#10

ACALL DELAY_MS

MOV DPTR,#MSG1

CALL DISPLAY_LINE1                        ;在第一行显示 Test8: IR Reader

MOV DPTR,#MSG2

CALL DISPLAY_LINE2                        ;在第二行显示www.mcuedu.com

MAIN_LOOP:

JB IRR,$ ;等待接收头信号为低

ACALL GET_LOW ;测量引导脉冲低电平

CLR C

MOV A,R7

SUBB A,#(8000/50) ;SC6122的引导脉冲低电平为9000US,我们只要测到低电平的值在8000-10000US范围内就认为合格的.

JC MAIN_LOOP ;如果小于8000US,不对,重新等待接收

CLR C

MOV A,R7

SUBB A,#(10000/50)

JNC MAIN_LOOP

ACALL GET_HIGH ;测量引导脉冲高电平

CLR C

MOV A,R7

SUBB A,#(4000/50)

JC MAIN_LOOP                    ;如果小于4000US,不对,重新等待接收

CLR C

MOV A,R7

SUBB A,#(5000/50)

JNC MAIN_LOOP                        ;如果大于5000US,不对,重新等待接收

MOV R0,#BUF ;

MOV R5,#8 ;SC6122发的码有32位,我们用4个字节来存放,每个字节有8位

IR_NEXT:

CALL GET_LOW

CLR C

MOV A,R7

SUBB A,#(300/50) ;300US

JC MAIN_LOOP                                ;低电平小于300微秒认为不对,重新接收

CLR C

MOV A,R7

SUBB A,#(800/50) ;800US

JNC MAIN_LOOP                                ;低电平大于800微秒认为不对,重新接收

ACALL GET_HIGH

CLR C

MOV A,R7

SUBB A,#(300/50) ;300US

JC MAIN_LOOP                                ;高电平小于300微秒认为不对,重新接收

CLR C

MOV A,R7

SUBB A,#(2000/50) ;2000US

JNC MAIN_LOOP                                     ;高电平大于2000微秒认为不对,重新接收

CLR C

MOV A,R7

SUBB A,#(1120/50) ;                            ;跟中间值1120进行比较

RRC A

MOV @R0,A                                    ;通过CY移到间接地址R0中去

DJNZ R5,IR_NEXT                                    ;8位移完了吗

MOV R5,#8

INC R0

MOV A,R0

XRL A,#(BUF+4)

JNZ IR_NEXT ;如果不到4个字节,接收下一个

MOV DPTR,#MSG_6122

ACALL DISPLAY_LINE1 ;显示格式名称

ACALL DISPLAY_IR_CODE ;显示码

AJMP MAIN_LOOP

;============================================

MSG1: DB " Test8: IR Reader "

MSG2: DB " www.mcuedu.com "

MSG_6122: DB " Format: SC6122 "

;============================================

;转为ASCII码在LCD在显示

TO_ASCII:

CJNE A,#0AH,TO_ASCII_1

TO_ASCII_1:

JC TO_ASCII_2 ;小于10

ADD A,#('A'-10)

RET

TO_ASCII_2:

ADD A,#'0'

RET

;============================================

DISPLAY_IR_CODE:

MOV A,#0C0H ;显示在第二行

ACALL SEND_COMMAND_BYTE ;设置DDRAM地址

MOV R0,#BUF

DISPLAY_IR_CODE_NEXT:

MOV A,@R0

SWAP A

ANL A,#0FH                            ;分离出高字节

ACALL TO_ASCII                                ;转为ASCII码

ACALL SEND_DATA_BYTE                             ;显示

MOV A,@R0

ANL A,#0FH                            ;分离出低字节

ACALL TO_ASCII                                 ;转为ASCII码

ACALL SEND_DATA_BYTE                            ;显示

MOV A,#' '

ACALL SEND_DATA_BYTE                                ;显示空格

INC R0

MOV A,R0

XRL A,#(BUF+4)

JNZ DISPLAY_IR_CODE_NEXT

MOV R0,#8 ;第2行共有20个字符,前面显示用了12个,再用8个空格填满

DISPLAY_IR_CODE_B:

MOV A,#' '

ACALL SEND_DATA_BYTE

DJNZ R0,DISPLAY_IR_CODE_B

RET

;============================================

;测量低电平时间,50US采样一次,R7加1一次,比如低电平时间为9000US,测得R7的结果为180(0B4H)

;OUTPUT: R7

GET_LOW:

MOV R7,#00H

GET_LOW_NEXT:

MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,

DJNZ R6,$ ;这条指令执行需要2个机器周期

JB IRR,GET_LOW_RTN ;接收头为高电平,结束测量

INC R7

MOV A,R7

JNZ GET_LOW_NEXT ;看R7是否有溢出

GET_LOW_RTN:

RET

;============================================

;测量高电平时间,50US采样一次,R7加1一次,比如高电平时间为4500US,测得R7的结果为90

;OUTPUT: R7

GET_HIGH:

MOV R7,#00H

GET_HIGH_NEXT:

MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,

DJNZ R6,$ ;这条指令执行需要2个机器周期

JNB IRR,GET_HIGH_RTN ;接收头为低电平,结束测量

INC R7

MOV A,R7

JNZ GET_HIGH_NEXT ;看R7是否有溢出

GET_HIGH_RTN:

RET

;============================================

;============================================

DELAY_MS:

MOV R6,#250

DELAY_MS_NEXT:

NOP

NOP

DJNZ R6,DELAY_MS_NEXT

DJNZ R7,DELAY_MS

RET

;============================================

;INPUT: R7

DELAY:

DJNZ R7,$

RET

;============================================

;向LCD写一个命令字节

;INPUT: ACC

SEND_COMMAND_BYTE:

CLR RS

CLR RW

MOV P0,A

SETB E

NOP

NOP

NOP

NOP

NOP

NOP

CLR E

MOV R7,#100

ACALL DELAY

RET

;===============================================

;向LCD写一个数据字节

;INPUT: ACC

SEND_DATA_BYTE:

SETB RS

CLR RW

MOV P0,A

SETB E

NOP

NOP

NOP

NOP

NOP

NOP

CLR E

MOV R7,#100

ACALL DELAY

RET

;======================================================

;初始化LCD

INIT_LCD:

MOV A,#30H

ACALL SEND_COMMAND_BYTE

ACALL SEND_COMMAND_BYTE

ACALL SEND_COMMAND_BYTE

MOV A,#38H ;设置工作方式

ACALL SEND_COMMAND_BYTE

MOV A,#0CH ;显示状态设置

ACALL SEND_COMMAND_BYTE

MOV A,#01H ;清屏

ACALL SEND_COMMAND_BYTE

MOV A,#06H ;输入方式设置

ACALL SEND_COMMAND_BYTE

RET

;=======================================================

;在第一行显示

;INPUT: DPTR指向要显示的内容

DISPLAY_LINE1:

MOV A,#080H

DISPLAY_LINE1_A:

ACALL SEND_COMMAND_BYTE ;设置DDRAM地址

MOV R6,#20

DISPLAY_LINE1_NEXT:

CLR A

MOVC A,@A+DPTR

ACALL SEND_DATA_BYTE

INC DPTR

DJNZ R6,DISPLAY_LINE1_NEXT

MOV R7,#100

ACALL DELAY

RET

;=======================================================

;在第二行显示

;INPUT: DPTR指向要显示的内容

DISPLAY_LINE2:

MOV A,#0C0H

AJMP DISPLAY_LINE1_A

;=======================================================

END

下面是一个用C写的遥控器程序.能在数码管上显示键码.

#include

#define c(x) (x*110592/120000)

sbit Ir_Pin=P3^3;

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};                        //共阳极数码显示码0-F.

unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};

unsigned char Led_Buf[4]; //显示缓冲区

char Led_Index;                   //位选

unsigned char Ir_Buf[4]; //用于保存解码结果

//==============================================================

//数码管扫描

timer0() interrupt 1 using 1

{

TL0=65536-1000;

TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描

P0=0xff;

P2=Led_Sel[Led_Index];                            //位选

P0=Led_Tab[Led_Buf[Led_Index]];                    //段选

if(++Led_Index>3) Led_Index=0;                    //四个扫描完了,到第一个数码管

}

//==============================================================

unsigned int Ir_Get_Low()

{

TL1=0;

TH1=0;

TR1=1;

while(!Ir_Pin && (TH1&0x80)==0);

TR1=0;

return TH1*256+TL1;

}

//=============================================================

unsigned int Ir_Get_High()

{

TL1=0;

TH1=0;

TR1=1;

while(Ir_Pin && (TH1&0x80)==0);

TR1=0;

return TH1*256+TL1;

}

//==============================================================

main()

{

unsigned int temp;

char i,j;

Led_Index=1;

TMOD=0x11;

TL0=65536-1000;

TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描

EA=1;

ET0=1;

TR0=1;

Led_Buf[0]=0;

Led_Buf[1]=0;

Led_Buf[2]=0;

Led_Buf[3]=0; //显示区设成0

do{

restart:

while(Ir_Pin);

temp=Ir_Get_Low();

if(tempc(9500)) continue;//引导脉冲低电平9000

temp=Ir_Get_High();

if(tempc(5000)) continue;//引导脉冲高电平4500

for(i=0;i<4;i++) //4个字节

for(j=0;j<8;j++) //每个字节8位

{

temp=Ir_Get_Low();

if(tempc(800)) goto restart;

temp=Ir_Get_High();

if(tempc(2000)) goto restart;

Ir_Buf[i]>>=1;

if(temp>c(1120)) Ir_Buf[i]|=0x80;

}

Led_Buf[0]=Ir_Buf[2]&0xf;

Led_Buf[1]=(Ir_Buf[2]/16)&0xf;

Led_Buf[2]=Ir_Buf[3]&0xf;

Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果

}while(1);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Retrofit2 完全解析 探索与okhttp之间的关系

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/51304204&#xff1b; 本文出自:【张鸿洋的博客】 之前写了个okhttputils的工具类&#xff0c;然后有很多同学询问这个工具类和retrofit什么区别&#xff0c;于是上了下官网&#xff0c;发现其底…

不变性真的意味着线程安全吗?

我经常阅读有关“如果对象是不可变的&#xff0c;则它是线程安全的”的文章。 实际上&#xff0c;我从未找到过一篇让我相信不变的意味着线程安全的文章。 即使是Brian Goetz的Java Concurrency in Practice一书中关于不变性的一本书也没有完全令我满意。 在这本书中&#xff0…

c语言设计 数组的知识点,C语言程序设计知识点及示例.pdf

C语言程序设计知识点及示例四川大学锦江学院C语言程序设计知识点及示例知识点1&#xff1a;除了复合语句而外&#xff0c;C语言的语句都以分号结束。示例1&#xff1a;C语言的简单语句 (非复合语句语句)必须以 结束。参考答案&#xff1a;分号知识点2&#xff1a;目标程序和可执…

移动端知识汇总

参见地址: https://github.com/jtyjty99999/mobileTech 转载于:https://www.cnblogs.com/duanyue/p/7337789.html

在移动端设置overflow:hidden禁止滚动的解决方法

如果你是将overflow:hidden用在了body上那么不管用&#xff0c;因为移动端是基于touch事件。 两种解决方法&#xff1a; 1、为html和body同时设置height:100%;overflow:hidden; html, body{height:100%;overflow:hidden; }2、使用touchmove $(document).on(touchmove,function …

单元测试线程代码的5个技巧

这是一些技巧&#xff0c;说明如何进行代码的逻辑正确性测试&#xff08;与多线程正确性相对&#xff09;。 我发现本质上有两种带有线程代码的刻板印象模式&#xff1a; 面向任务–许多短期运行的同类任务&#xff0c;通常在Java 5执行程序框架内运行&#xff0c; 面向流程–…

jsp2

D:\Software\Tomcat7\work\Catalina\localhost 是缓存目录&#xff0c;可以删掉隐藏域&#xff1a;页面表单中的一个元素&#xff0c;跟文本框一样&#xff0c;但是用户看不到1.建立test1--form表单需要它&#xff0c;而不需要用户看到&#xff0c;用隐藏域<body><%re…

MongoDB MapReduce 的示例。

// JavaScript source code db.runCommand({mapreduce: "page",map: function Map() {emit(this.title, // how to group{ name: this.name } // associated data point (document));},reduce: function Reduce(key, values) {//reduce用来处理group出来是多条数…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a;不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。空格没有转义字符。合法转义字符如下&#xff1a;\a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(VT)…

使用NoSQL实现实体服务–第1部分:概述

在过去的几周中&#xff0c;我一直在进行一些研发工作&#xff0c;以了解使用NoSQL数据库实现实体服务 &#xff08;也称为数据服务&#xff09;的优势。 实体服务是托马斯埃尔&#xff08;Thomas Erl&#xff09;的《服务技术》丛书中提出的服务分类。 它用于描述高度不可知和…

IO注意事项

read()方法返回值为什么是int? 因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111,那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不…

c语言用星号输出沙漏,《算法笔记》学习日记——3.3 图形输出

3.3 图形输出问题 A: 输出梯形题目描述输入一个高度h&#xff0c;输出一个高为h&#xff0c;上底边为h的梯形。输入一个整数h(1<h<1000)。输出h所对应的梯形。样例输入web5样例输出数组*********************************************思路这一类的题目都比较简单&#xf…

JavaOne 2012:101种改进Java的方法-开发人员参与为何如此重要

Bruno Souza &#xff0c; Martijn Verburg和Heather Vancura在希尔顿酒店的大陆宴会厅4中展示了“ 101种改进Java的方法&#xff1a;开发人员参与为何如此重要”。 他们将其分为自己最熟悉的领域。 SouJava的创始人兼协调员 Souza谈到了通过用户组的更大参与。 Verberg也在伦敦…

Java组合实体模式~

组合实体模式用于EJB持久化机制。 组合实体是表示对象图的EJB实体bean。 当组合实体更新时&#xff0c;内部依赖对象bean将自动更新为由EJB实体bean管理。 以下是组合实体Bean的参与者。 组合实体 - 它是主要的实体bean。 它可以是粗粒度的或可以包含用于持久性目的的粗粒度对象…

python中的一些小知识

在最近学习python中遇到的一些小问题汇总一下&#xff1a; 1.在windows7下安装python3.5版本时提示安装不了&#xff0c;缺少ServicePack1. 解决办法是&#xff0c;打开控制面板\系统和安全\Windows Update&#xff0c;下载和更新计算机安装&#xff0c;然后卸载以前的python版…

在Java中衡量执行时间– Spring StopWatch示例

有两种方法可以通过使用System.currentTimeinMillis&#xff08;&#xff09;或通过使用System.nanoTime&#xff08;&#xff09; 来测量Java中经过的执行时间 。 这两个方法可用于测量 Java中两个方法调用或事件之间的经过时间或执行时间 。 计算经过的时间是Java程序员要做的…

c语言getch在哪个头文件,用getch()需要头文件吗?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include "string.h"#includeusing namespace std;struct student{ int num;char name[10];char banji[10];float score[3];struct student *next;};struct student *creat(){struct student *head,*p…

My solution for Git Client Error: Permission denied (publickey)

在使用Git客户端的过程中遇到的问题以及解决方案分享。 我之前已经安装Git客户端并且使用Git开发过公司项目&#xff0c;也已经正确生成PublicKey并且添加到SSH keys on github of my account&#xff0c;但是当我想从github上克隆另一个客户端push的代码的时候一直报错&#x…

OutOfMemoryError:无法创建新的本机线程–问题神秘化

正如您从我以前的教程和案例研究中可能已经看到的那样&#xff0c;要确定和解决Java Heap Space OutOfMemoryError问题可能很复杂。 我从Java EE生产系统中观察到的常见问题之一是OutOfMemoryError&#xff1a;无法创建新的本机线程&#xff1b; HotSpot JVM无法进一步创建新的…

求10以内平均数的c语言,求助 给小学生出题,自己选加减乘除 做10题 10以内的数 然后统计分...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include void Menu(void){printf("1,加法 2,减法 3,乘法 4,除法 5,退出\n");printf("请选择题目类型:");}int Plus(void){int a, b;a rand() % 10 1;b rand() % 10 1;printf("%-2…