C8051F320红外发射接收程序
- 格式:docx
- 大小:12.96 KB
- 文档页数:2
红外发送调用SendIRdata();while(over==0);地址储存在addr(可根据需要改成发送16位地址,此程序发送的是八位地址,第二地址是第一个的反码)中,hwdata,c,d,over,dat是全局unsigned char ,在等待红外发送完成while(over==0)语句,等待时间为几十ms,可在前面或while中可执行其他程序。
(等待期间不需要执行其他程序也可把while语句放入SendIRdata()末尾)void SendIRdata(unsigned char x){TH1=0xdc;//发送9ms的起始码TL1=0xd8;TR2=1;TR1=1;hwdata=x;over=0;//红外发送结束标志,为1完成}/**************定时器1中断处理***************/void timeint(void) interrupt 3{switch(c){case 0: //起始码4.5msTH1=0xee;TL1=0x6c;TR2=0;c=1;dat=addr;//发送十六位地址的前八位break;case 1:TH1=0xfd; //560us高电平TL1=0xd0;TR2=1;c=2;break;case 2:if(dat&0x01){ TH1=0xf9;TL1=0x5c;}//1.7ms低电平else{ TH1=0xfd;TL1=0xd0;}//560us低电平TR2=0;dat>>=1;d++;c=1;if(d==8)dat=~addr;//发送十六位地址的后八位if(d==16)dat=hwdata;//发送八位数据if(d==24)dat=~hwdata;//发送八位数据的反码if(d==33){over=1;TR1=0;TR2=0;d=0;c=0;}break;}}外中断0 接收,储存在dat[3]全局变量中,hu,time1,time2,h,b,是unsigned char型全局变量,time是unsigned intvoid extern0() interrupt 0 //中断程序{if(hu==0){TL1=0;TH1=0;TR1=1;hu=1;}else{TR1=0;time1=TH1;time2=TL1;TL1=0;TH1=0;TR1=1;time=time1*256+time2;if(start==0){if((14000>time)&&(time>13000))start=1;}else{//if((time>2100)&&(2400>time))//{dat[h]>>=1; dat[h]=dat[h]|0x80;}//else//if((time>1000)&&(1250>time))//dat[h]>>=1;dat[h]>>=1;if((time>2100)&&(2400>time))dat[h]=dat[h]|0x80;b++;if(b>7){ b=0;h++;if(h>3){h=0;start=0;hu=0;if(dat[0]!=~dat[1]|| dat[2]!=~dat[3])dat[2]=0;}}}}}。
红外接收程序讲解 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
下面,我们将使用下面两种设备:另外,使用51单片机进行解码。
2、原理图从原理图看出,IR的data脚与51的PD2相连。
2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。
a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码()组成。
下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。
b) 编码格式遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。
通常有曼彻斯特编码和脉冲宽度编码。
XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。
下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为、间隔、周期为的组合表示二进制的“0”;以脉宽为、间隔、周期为的组合表示二进制的“1”。
3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:×16=18ms 16位地址码的最长宽度:×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(+)×8=27ms所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。
用8051单片机接收红外遥控的实现
赵瑛琪
【期刊名称】《电脑知识与技术》
【年(卷),期】2006(000)001
【摘要】μPD6121,6122是用NEC传输格式的红外线遥控发射芯片,目前广泛的用在电视,录像机,音响,空调等设备上.8051系列单片机是目前应用最为广泛的8位机,其内核由美国因特公司设计.本文介绍如何用8051单片机准确接收红外遥控信号,并写出高效的代码.
【总页数】2页(P193-194)
【作者】赵瑛琪
【作者单位】湖南城建职业技术学院信息工程系,湖南,湘潭,411101
【正文语种】中文
【中图分类】TP368
【相关文献】
1.IRM81XY系列红外遥控接收微型组件及红外遥控发射,接收电路 [J], 杜雪芳
2.基于PS/2接口红外遥控接收装置的设计与实现 [J], 李乐
3.嵌入式红外遥控键盘接收端和USB闪存的整合实现 [J], 李中政;闫鹤;李娜;乔贵春
4.智能型红外遥控器中信号接收与压缩方法 [J], 李慧静;金晓民;井雅;张博尧
5.红外遥控接收放大器的解码特性 [J], 陈巍;
因版权原因,仅展示原文概要,查看原文内容请购买。
C8051F320驱动金鹏2x8C-5液晶C程序程序师从网上找的,稍加修改,用c8051f320的开发板驱动,能显示字符汉字点阵图形,下面是程序:/*c语言实例st7920标签:无标签ST7920驱动的12864(并行工作方式)*//******************************************************************************Copyright 2007All rights reserved.文件名: .c模块名称:st7920 并行方式驱动12864液晶驱动功能概要:st7920显示驱动取代版本:0.0.1修改人:pulan完成日期:2007.07.08升级说明:createCPU: stc89c58 主频:11.0592M液晶型号:生产厂家:驱动芯片:st7920******************************************************************************///#include <reg52.h> 2009年6月10日修改,用于C8051F320单片机,主频12MH, #include <C8051F320.h> // 两行液晶模块。
HYL修改。
#define uint unsigned int#define uchar unsigned char#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1sbit RS = P2^1; //H=data; L="command";sbit RW = P2^2; //H=read; L="write";sbit E = P2^4; //input enable;sbit PSB= P2^5; //H=并口; L="串口";sbit RST= P2^3; //Reset Signal 低电平有效sbit busy=P0^7; //lcd busy bitvoid wr_lcd (uchar dat_comm,uchar content);void chk_busy (void);void delay (uint us);void delay1 (uint ms);uchar code tab1[]={"本系列中文模块内""置二级字库,可在"};uchar code tab2[]={"任意位置反白显示""使用更方便更灵活"};uchar code tab31[]={"保定市宇恒科技荣""誉出品为您服务!!"//"金鹏科技有限公司"//"Golden Palm TECH"};/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*/ /*-- 宽度x高度=128x32 --*/uchar code tab33[]={0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x7E,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x3E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x30,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1F,0x7C,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x1E,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xDA,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xF2,0x30,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab32[]={/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab5[]={/*-- 调入了一幅图像:F:\梁\画图\COCK.bmp --*//*-- 宽度x高度=128x64 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x43,0x01,0x80,0x00,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xFF,0x07,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0xFC,0x1E,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xBF,0xFF,0xFC,0x00,0x7F,0xFC,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,0x00,0xFF,0xC0,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xDF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xFF,0xE0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x1F,0xFF,0xF0,0x03,0xF8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0xC0,0x7C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xF0,0x00,0x3F,0xFF,0xFF,0xF8,0x1E,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0xFE,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xFF,0x87,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0x83,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xC3,0x88,0x00,0x00,00x00,0x00,0x00,0x7F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xE1,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xE1,0x88,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF1,0x88,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF3,0x08,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xF2,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xF0,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x7E,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x3E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x30,0x40,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1F,0x7C,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x1E,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xDA,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xF2,0x30,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0x0C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/******************************************************************************************* 函数名称:* 功能描述:液晶初始化* 参数:参数名称:输入/输出?类型描述** 返回值:* 作者:* 创建日期:2006-12-19* 全局变量:* 全局静态变量:* 局部静态变量:*----------------------------------------修改历史------------------------------------------* 当前版本:修改人:修改日期:* 修改说明:******************************************************************************************/void init_lcd (void){RST = 1;PSB = 1;wr_lcd(comm,0x30); /*30---基本指令动作*/wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/wr_lcd(comm,0x06); /*光标的移动方向*/wr_lcd(comm,0x0c); /*开显示,关游标*/}/******************************************************************/void SysClkInit(void)//配置系统时钟 C8051F320初始化{OSCICN=0x81;RSTSRC=0x04;}/**********************************************************************/void SystemInit(void)//系统配置 C8051F320初始化{CA0MD&=~0x40;//禁止看门狗定时器EA=1;ES0=1;}/************************************************************/void PortInit(void)//端口配置 C8051F320初始化{//P2MDIN = 0x0F;P2MDOUT = 0xff;//P0MDOUT = 0x7f;// XBR0 = 0x07;XBR1 = 0x40;}/******************************************************************************************* 函数名称:chn_disp* 功能描述:显示汉字或字符* 参数:参数名称:输入/输出?类型描述** 返回值:* 作者:* 创建日期:2006-12-19* 全局变量:* 全局静态变量:* 局部静态变量:*----------------------------------------修改历史------------------------------------------* 当前版本:修改人:修改日期:* 修改说明:******************************************************************************************/void chn_disp(uchar code *chn){uchar i,j;wr_lcd(comm,0x34);wr_lcd(comm,0x05); //第二行反白显示wr_lcd(comm,0x30);wr_lcd(comm,0x80);for(j=0;j<4;j++){if(j==1) //{wr_lcd(comm,0x90);} //修改后可用二行液晶显示,源程序是四行液晶for(i=0;i<16;i++)wr_lcd(dat,chn[j*16+i]);}}/******************************************************************************************* 函数名称:chn_disp1* 功能描述:上半屏显示汉字或字符,此函数可直接用于二行液晶。
#include "reg51.h"#define uchar unsigned char#define uint unsignedint//用单片机来模拟发送SAA3010数据码//作者:全立波,quanlibo@ucharsendstart=3; //起始位2位+控制位1位+系统位6位=8位,其中起始两位为1,其它各为均为0ucharsenddatas=1; //数据位为6位,这里只用该字节的前6位uchar count=0;sbit P1_0=P1^0; //用来控制红外发光二极管来发送数据bit sendflag=0; //发送数据的标志量void Init();void sendData();uchardatas[28];void main(void){Init();while(1){if(sendflag==1){//串口不允许中断ET1=0;TR1=0;ES=0;//一个周期是26.32us,那么一个周期的一半应该是13us,所有的错误全部都在这里(看来网上发表的文章也是一些理论没有真正实践过)//12MHZ,38KHZ//TH1=0xf3;//TL1=0xf3;//11.0592MHZ ,38KHZTH1=0xf4;TL1=0xf4;sendflag=0;sendData();}};}//这里定义1位的时间为在 1.651ms,那么半位的时间为1.651ms/2=0.8255ms=825.5us//事先准备要发送的数void sendData(){uchar c=0;uint b=0;//待发送的数据uchar s=0;sendstart=3;//起始码for(c=0;c<8;c++){if(senddatas-(senddatas/2)*2){//为1b=b|1;}else{//为0b=b|0;}if(c<7){b=b<<1;}senddatas=senddatas>>1;}b=b<<8>>2;//做起来真是精细,还要搞掉后面没有被占掉的值,否则数据不准确,做学问真的是不容易啊b=b |sendstart;//下面代码用来装配发送数据c=0;//先发送起始位2位+控制位1位+系统位5位=8位,后面的6位是数据位,共14位//用NPN三极管放大信号do{if(b-(b/2)*2){//发送1的前半位datas[s++]=1;}else{//发送0的前半位datas[s++]=0;}if(b-(b/2)*2){//发送1的后半位datas[s++]=0;}else{//发送0的后半位datas[s++]=1;}//数据循环右移,发送下一位数据b=b>>1;}while(++c<14);//开始发送数据count=0;//12MHZ,延时0.8255ms用//TH0=0xfc;//TL0=0xc6;//11.0592MHZ,延时0.8255ms用TH0=0xfd;TL0=0x07;ET0=1;TR0=1;}void Init(){//刚开始启动不发送P1_0=0;//我们这里利用定时器1的工作方式2(8位自动重载)来发送载波信号TMOD=0x21;EA=1;//总中断允许ES=1;//允许串口中断//串口工作于方式1,8位UART,波特率可变,允许串口接受数据,工作方式为1,无奇偶校验位。
遥控发送程序ORG0000HLOOPO: MOV SCON ,#0C0H ;设定串行口工作方式3MOV TMOD , #20H ;T1工作方式2MOV PCON , #00H ;波特率设置MOV TL1 , #OF4H ;定时初始值F4送TL1MOV TH1 , #OF4H ;定时初始值F4送TH1*******************************************************************CP: JB P1.0 ,CPK ;判断遥控按键P1.0是否按下LCALL PP ;调用延时JB P1.0 , CPSTEB TR1 ;启动定时器T1MOV 50H ,#5FH ; 将立即数5FH 送50H 存储单元MOV RO ,#50H;将立即数50H 送RO寄存器MOV R1 , #05H ;将立即数05H送R1寄存器IND: MOV A,@R0 ; 将50H中的5F送累加器AMOV C , PMOV TB8 ,CMOV SBUF ,A;将要发送数据5F送串行数据缓冲器AAA : JNB P1.1 ,ON1 ; P1.1是”0”电平时转至调制程序BBB”JB P1.1 ,CCC ;P1.1是”1”电平等待AMP AAACCC : JBC TI ,CP ;判断发送中断标志位]SETB P1.2 ;P1.2置1AJMP BBBON1: ACALL ONAJMP AAAPP: MOV R6, #05H ;延时子程序100P3: MOV R5 , #OF9HNOPNOP100P4: DJNZ R5 ,100P4DJNZ R6 ,100P3RETON: CP1 P1.2 ;0电平调制程序。
(共有82个CP1 P1.2)RET********************************************************************4、遥控接收程序W AIT: JBC R1 ,LOOP5 ;遥控接收程序LJMP KEYLOOP5: MOV R0 ,#51H;将立即数51H送R0MOV R7 ,#03H ;将立即数03H送R7LOOP6: MOV A ,SBUF ;将串行缓冲器接收到的数据累加器AJNB PSW.0 LOOP7 ;标志位F0清零了吗?JNB RB8 ,LOOP8 ;数据接收完了吗?LOOP9 MOV @RO ,A;开锁处理程序MOV R1 , 51HCJNE R1 ,#1EH ,LPDJNZ 52H , KPCLR P1.7MOV 52H ,# 02HMOV R0 ,#OOHLJMP W AITKP: SETB P1.7MOV R0 ,#00HLJMP W AITLP: DJNZ R7 ,W AITCLR PSW.5LJMP W AITLOOP7: JB RB8 , LOOP8LJMP LOOP9LOOP8: SETB PSW.5 ;给标志位F0置1LJMP W AIT ;继续接收数据。
/*-----------------------------------------------名称:红外发射接收修改:无内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。
*正常情况下,由于反射和高灵敏度接收,LED4(P1.7)一直闪烁,可以用黑色纸片完全遮挡接收头使*之不能接收到发射管的信号,这是LED4熄灭。
说明功能性正常------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P2^3; //红外发射sbit LED1=P0^1;bit Flag;void Init_Timer0(void){TMOD |= 0x01;TH0=0xf0; /* Init value */TL0=0x00;EA=1; /* interupt enable */ET0=1; /* enable timer0 interrupt */TR0=1;}/******************************************************************/ /* 定时器0初始化 *//******************************************************************/ void Timer0_isr(void) interrupt 1 using 1{TH0=0x0f; /* Init value */TL0=0x00;Flag=!Flag;}/******************************************************************/ /* 主函数 *//******************************************************************/ main(){unsigned int j;Init_Timer0(); //定时器初始化LED1=0;while(1){ //读取一体化接收头数值if(Flag){for(j=0;j<27;j++)//大约38KHz{LED=!LED; //发射管输出}}}}#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P0^1;sbit IR=P2^3; //红外一体化接收sbit LED1=P0^2;sbit BUZZER=P2^5;void delayus(unsigned us){ unsigned int i,j;for(i=0;i<us;i++)for(j=0;j<101;j++);}main(){LED1=0;BUZZER=0;while(1){unsigned int a,b;b=0;for(a=0;a<22;a++){ if(IR==0)b=b+1;delayus(6);//对脉冲采样}if(b>5){LED=0;BUZZER=0;}else{LED=1;BUZZER=1;}//有障碍物灯灭、蜂鸣器响}}。
电脑知识与技术研究开发1引言对遥控信号的接收实际上是把红外光信号转换成TTL信号的过程,现在有集成度比较高的一体化接收头来处理。
对信号的解码方式则可以结合不同的MCU硬件资源写出不同的解码程序来。
这里使用8051单片机,具体是用外部中断脚INT0来接收信号,用计数器Time0测两次外部中断产生的时间间隔来区别每个位(bit)是“1”或“0”,再把数据流还原成各种命令,来控制其他的I/O做不同的工作。
2系统构成红外遥控系统由发射和接收两大部分组成,应用编/解码集成电路芯片来进行控制操作。
发射部分即遥控器(包括键盘矩阵、编码调制、红外发送二极管);接收为红外接收头(包括光/电转换、放大、解调),解码MCU(这里用的是8051单片机),如图1。
图13编码方式遥控发射器专用芯片很多,根据编码格式可以分成两大类,即日本NEC的uPD6121G系列和荷兰Philips的RC5传输协议系列。
这里我们以运用比较广泛的前者来说明。
本协议采用脉宽调制的串行码,用脉宽为0.56ms、间隔0.565ms、周期为1.125ms的组合表示二进制的“0”;用脉宽为0.56ms、间隔1.69ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
UPD6121G产生的遥控编码是连续的32位二进制码组(如图3所示),其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
后16位为8位操作码(功能码)及其反码。
图2图3遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图4为发射波形图。
图4当一个键按下超过36ms,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9m~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
发射部分#include <reg52.h>sbit P2_2=P2^2;sbit signalBit=P2^1; //发送信号标志位sbit LED=P3^7; //使能信号位,将E位定义为P2.2引脚unsigned char irData[]={0x14,0xeb,0xf0,0x0f}; //存放所有的控制码unsigned char mazhi[]={0x33,0x22,0xeb,0x14};unsigned char key,send_flag=0;void SendIRdata(unsigned char irdata[4]); //红外发射函数void anjian_send(unsigned char flag);void delay(unsigned int tt) //延时函数{while(--tt);}void main(void){signalBit=0;P2_2= 0;TMOD=0x12;//设定定时器1和0工作方式为1和2EX1=1;IT1=1;ET0 =1; //定时器0中断允许ET1 =1;TH0= 0xf4;TL0= 0xf4; //设定时值0为38K 也就是每隔13us中断一次周期为26us TR0= 0;//先关闭定时器0TR1= 0;IP=0X01;EA=1; //允许CPU中断LED=0;while(1){P1=0XF0;if(send_flag==1){anjian_send(key);send_flag=0;}}}void anjian_send(unsigned char flag){unsigned char zhi=flag;switch(zhi){case 0xee: SendIRdata(irData); break;case 0xbe: SendIRdata(irData); break;case 0xde: SendIRdata(irData); break;case 0x7e: SendIRdata(irData); break;case 0xed: SendIRdata(irData); break;case 0xdd: SendIRdata(irData); break;case 0xbd: SendIRdata(irData); break;case 0x7d: SendIRdata(irData); break;case 0xeb: SendIRdata(irData); break;case 0xdb: SendIRdata(irData); break;case 0xbb: SendIRdata(mazhi); break;case 0x7b: SendIRdata(mazhi); break;case 0xe7: SendIRdata(mazhi); break;case 0xd7: SendIRdata(mazhi); break;case 0xb7: SendIRdata(mazhi); break;case 0x77: SendIRdata(mazhi); break;}}/******* 定时器1中断处理***********/void isr_T1(void) interrupt 3{}/******* 定时器0中断处理38K载波发生器***********/ void timeint(void) interrupt 1{P2_2=~P2_2; //产生38k的载波信号}/**************** 中断1 键盘的扫描********************/ void Int1(void) interrupt 2{unsigned char l,h;P1=0XF0;l=P1;l=l&0xf0;if(l!=0xf0){delay(10);if(l!=0xf0){l=P1&0xf0;l=l|0x0f;P1=l;h=P1;h=h&0x0f;l=l&0xf0;key=h+l;send_flag=1;LED=~LED;}}}/********* 红外发射函数************/void SendIRdata(unsigned char *mData){unsigned char i,j;unsigned char test[4];for(i=0;i<4;i++)test[i]=mData[i];TR0=1; //开定时器T0 输出38K载波/********* 发送9ms的高电平************/TH1=0XDF; //装入初值设置波延时为9msTL1=0XE3;TR1=1; //启动T1工作定时所需时间signalBit=1; //发送信号while(!TF1);TF1=0;/********* 发送4.5ms的低电平*************/TH1=0xef;TL1=0xf0;signalBit=0;while(!TF1);TF1=0;/********* 发送用户码控制码控制反码***********/for(j=0;j<4;j++)//发送十六位地址的前八位{for(i=0;i<8;i++){//先发送0.565ms的38KHZ红外波(即编码中0.565ms的高电平)TH1=0XFE;TL1=0X70;signalBit=1;while(!TF1);TF1=0;//停止发送红外信号(即编码中的高电平)if(test[j]&0x01) //判断二进制数个位为1还是0{TH1=0XFA; // //1为宽的低电平,持续时间1.685msTL1=0X30;}else{TH1=0XFE; //0为窄的低电平,持续时间0.56msTL1=0x50;}signalBit=0;while(!TF1);TF1=0;test[j]=test[j]>>1;}}TR1=0; //发送停止位关闭定时器T0signalBit=1;delay(100);signalBit=0;TR0=0; //关闭定时器T1}检测部分#include<reg52.h> //包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //将IR位定义为P3.2引脚sbit rs=P2^4; //寄存器选择位,将RS位定义为P2.0引脚sbit rw=P2^5; //读写选择位,将RW位定义为P2.1引脚sbit e=P2^6; //使能信号位,将E位定义为P2.2引脚sbit LED=P2^0; //使能信号位,将E位定义为P2.2引脚unsigned char code string[ ]= "1602IR-CODE TEST";unsigned char code smg[]="code:";unsigned char code MA[]="0123456789ABCDEF";unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; //储存高、低电平的宽度0-65535void delay(unsigned int tt){while(--tt);}void w_cmd(unsigned char dd){rs=0;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void w_dat(unsigned char dd){rs=1;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void disp_ma(uchar *p,uchar hang,uchar wei){if(hang==1)w_cmd(0x80+wei);if(hang==2)w_cmd(0xc0+wei);while(*p!='\0'){w_dat(*p);p++;}}void init_LCD(void){w_cmd(0x38);delay(1000);w_cmd(0x38);delay(300);w_cmd(0x38);//注意顺序,设置工作方式,显示模式设置delay(300);w_cmd(0x08);//注意顺序,关闭显示w_cmd(0x01);//清屏w_cmd(0x06);//光标·画面滚动模式设置w_cmd(0x0c);//显示及光标模式设}/************************************************************函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0出口参数:dat*************************************************************/bit DeCode(void){unsigned char i,j;unsigned char temp=0; //储存解码出的数据for(i=0;i<4;i++) //连续读取4个用户码和键数据码{for(j=0;j<8;j++) //每个码有8位数字{temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是低位数据TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==0) ;//如果是低电平就等待低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平宽度TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平宽度if((LowTime<300)||(LowTime>620))return 0; //如果低电平长度不在合理范围,则认为出错,停止解码if((HighTime>300)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次{temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0}if((HighTime>1300)&&(HighTime<1850)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次{temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1}}a[i]=temp; //将解码出的字节值储存在a[i]temp=0;}if(a[2]==~a[3])return 1; //解码正确,返回1else return 0;}/************************************************************函数功能:1602LCD显示*************************************************************/void Disp(void){w_cmd(0xc5); // 设置显示位置为第二行的第6个字w_dat(MA[(a[0]>>4)]);w_dat(MA[(a[0]&0x0f)]);w_dat(0x20);w_dat(MA[(a[1]>>4)]);w_dat(MA[(a[1]&0x0f)]);w_dat(0x20);w_dat(MA[(a[2]>>4)]);w_dat(MA[(a[2]&0x0f)]);w_dat(0x20);w_dat(MA[(a[3]>>4)]);w_dat(MA[(a[3]&0x0f)]);}/************************************************************函数功能:主函数*************************************************************/void main(){init_LCD(); //调用LCD初始化函数disp_ma(string,1,0);disp_ma(smg,2,0);EX0=1; //开外中断0ET0=1; //定时器T0中断允许IT0=1; //外中断的下降沿触发TMOD=0x01; //使用定时器T0的模式1TR0=0; //定时器T0关闭EA=1; //开启总中断while(1); //等待红外信号产生的中断}/************************************************************函数功能:红外线触发的外中断处理函数*************************************************************/void Int0(void) interrupt 0{EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==0); //如果是低电平就等待,给引导码低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存引导码的高电平长度if((LowTime>7500&&LowTime<10000)&&(HighTime>3500&&HighTime<5000)){//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.if(DeCode()==1) // 执行遥控解码功能Disp();//调用1602LCD显示函数}EX0=1; //开启外中断EX0}。
发射部分程序:/********************************************************* FUNCTION: 红外数据发送 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-6 * COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HSend BIT P2.0LedSend BIT P2.1;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0030HL_Main: MOV SP,#60HMOV DPTR,#T_SendBufferMOV R1,#08H ;发送1字节数据(先低位后高位)MOV R2,#00H;发送4字节L_Loop1:CLR LedSend ;开LED指示NOPNOPSETB SendLCALL F_Delay4500us ;引导码LCALL F_Delay4500usCLR SendLCALL F_Delay4500usL_Loop2:MOV A,R2MOVC A,@A+DPTRL_Loop3:SETB SendLCALL F_Delay560us ;560usCLR SendRRC AJC L_Next1LCALL F_Delay560usLJMP L_Next2L_Next1:LCALL F_Delay1680usL_Next2:DJNZ R1,L_Loop3INC R2CJNE R2,#04H,L_Loop2SETB Send ;560us高电平结束LCALL F_Delay560usCLR SendSETB LedSend ;关LED指示LJMP $/*INT_Int0:PUSH ACCPUSH PSWCPL LED1POP PSWPOP ACCRETI*/;---------------------------------------------------------- ;延时约4500usF_Delay4500us:MOV R7,#20L_Delay4500:MOV R6,#225DJNZ R6,$DJNZ R7,L_Delay4500RET;---------------------------------------------------------- ;延时约560usF_Delay560us:MOV R7,#2L_Delay560:MOV R6,#140DJNZ R6,$DJNZ R7,L_Delay560RET;---------------------------------------------------------- ;延时约1680usF_Delay1680us:LCALL F_Delay560usLCALL F_Delay560usLCALL F_Delay560usRET;---------------------------------------------------------- ;延时约1sF_Delay1s:MOV R7,#5L_Delay1s1:MOV R6,#200L_Delay1s2:MOV R5,#250DJNZ R5,$DJNZ R6,L_Delay1s2DJNZ R7,L_Delay1s1RET;-----------------------------------------------;红外发送区数据T_SendBuffer:DB 0FH,0F0H ;用户码及反码DB 56H,0A9H ;操作码及反码END ;结束接收部分程序:/********************************************************* FUNCTION: 红外数据接收程序 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-7 *COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HF_Re BIT P3.2LED1 BIT P2.6R_Receive: DS 4 ;红外数据接收空间;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0003H ;INT0入口LJMP INT_Int0ORG 0030HL_Main: MOV SP,#60HSETB EASETB EX0SETB IE0 ;下降沿触发MOV DPTR,#T_CodeL_LoopMain:;------------------------MOV R1,#R_Receive+2MOV A,@R1ANL A,#0FH ;屏蔽高4位MOVC A,@A+DPTRMOV P1,A;------------------------;CPL P2.5;LCALL F_Delay300msLJMP L_LoopMain;---------------------------------------------------------- ;外部中断0;Function: NEC红外解码.黑色遥控器用户码FFH,00H;P3.2接外部中断INT_Int0:PUSH ACCPUSH PSWMOV R0,#R_ReceiveMOV R3,#08HMOV R4,#04HLCALL F_Delay8000usJB F_Re,L_ExitINT0 ;非引导码退出JNB F_Re,$LCALL F_Delay2500usJNB F_Re,L_ExitINT0 ;遇简码退出JB F_Re,$CLR LED1 ;open LED1L_NextBit:JNB F_Re,$LCALL F_Delay840usJB F_Re,L_Next1MOV C,F_ReLJMP L_Next2L_Next1:MOV C,F_ReLCALL F_Delay1100usL_Next2:RRC A ;先收低位DJNZ R3,L_NextBitMOV @R0,AINC R0MOV R3,#08HDJNZ R4,L_NextBitL_ExitINT0:SETB LED1 ;close LED1POP PSWPOP ACCRETI;---------------------------------------------------------- ;延时约8000usF_Delay8000us:MOV R7,#20L_Delay8000:MOV R6,#200DJNZ R6,$DJNZ R7,L_Delay8000RET;---------------------------------------------------------- ;延时约840us。
C8051F320 I/O 使用总结
首先, 要区分数字信号与模拟信号!!!!并且还有是输入还是输出.其次,大家要知道不论在交叉开关的设置如何,端口I/O 引脚的状态总是可以被读到相应的
端口锁存器.
即:不管引脚被分配给数字外设还是作为通用I/O 端口,总是可以通过读相应
的数据寄存器得到I/O 端口引脚的状态.
再次
当一个引脚被配置为模拟输入时,它的弱上拉、数字驱动器和数字接收
器都被禁止,这可以节省功耗并减小模拟输入的噪声。
当一个引脚被配置为数字输入时,设为漏开,并向端口写1,引脚为高阻,按照I/O 结构原理图,初始化有弱上拉。
引脚与施密特连接,所以在引脚上的
电平状态是可以读进端口寄存器的,而且经过试验验证,5v 的逻辑电平也可以分辨出来,但是建议加上拉电阻。
不加也可以。
有一个网友:作为数字输入时,输出方输出特性千差万别,对于输出阻抗
高的器件可以不加上拉,对于输出阻抗低的器件就要用上拉电阻,否则无法输
出高电平。
PDF 上说交叉开关分配的输入引脚(例如NSS 或/INT0)是漏极开路或推挽并不重要, 这些引脚被配置为输入而与相应端口配置寄存器的设置无关。
为了将一个通用I/O 引脚配置为输入与这一引脚相关的端口配置寄存器位必须被清0。
这样即可选择该引脚为漏极开路输出方式另外与该引脚相关的端口位必须
被置1 这样使该引脚处于高阻态。
或在XBR2 中的WEAKPUD 被清0 时弱上
拉为高电平,这是端口引脚的复位配置。
好像可以解释为输入状态!!!。