自制示波器进行无线遥控波形分析及STC单片机解码
示波器测红外遥控器的波形

今越电子工作室 - 1 - 怎样捕捉红外遥控器的波形?今越电子工作室 刘泽民 红外遥控在我们的日常生活中有着普遍的应用,许多家用电器都使用红外遥控器,很多时候电子爱好者可能会产生这样的想法,就是怎样用现有的遥控器控制其他设备,或用自己设计的遥控器控制现有的电器,在这些情况下,我们都需要知道现有红外遥控器的控制编码。
红外遥控器发出的信号通常是一低频编码对一频率较高的载波调制后的信号,载波的频率一般在38~40KHz 左右,编码信号依不同的厂家不同的产品各不相同,我们要想知道的就是这些编码。
由于红外遥控器信号一般是不重复或重复频率很低的信号,用普通模拟示波器基本无法观测。
市面有一些专用的红外线遥控信号分析仪,但这不是一般电子爱好者会去考虑的。
您可以考虑利用单片机和PC 专门做一个电路测试,但这样所牵涉的硬件软件工作也不是三五天能完成,那是另一个不小的项目。
而如果您有一台带有捕捉功能的数字存储示波器,那您就不会有这一切问题。
下面我们以ZDS1002电视数字存储示波器为例说明捕捉红外遥控器波形的方法。
测量电路获取红外线遥控器信号的方法有两种,一是将遥控器打开,找到红外发射管,从适当管脚取信号。
这种方法不是很方便,因为您还要操作遥控器,而且取得的信号是未经解调的。
另一种方法是找一个红外接收头,用它来接收红外遥控器发出的信号,它带有解调器,输出的是已解调的信号。
这种接收头很容易找,每一台有遥控功能的电器都有,要买一个新的也仅2、3元钱。
这种接收头有3只引脚,分别是正电源(通常是5V)、地和信号输出,关键要分清除,然后按图1连接电路。
测量步骤1. 将示波器的A 通道接到测试点A 与地之间。
2. 将通道A 置为2V (这是因为我们用的电压是5V ,这个增益设置比较适合观察) ,将耦合方式均选为DC ,并将它们的0V 线调到适当位置;将通道B 置为OFF ,因为只要一个通道就够了。
3. 将触发方式置为AUTO (自动) ,然后用遥控器对准接收头按任意键,这时我们会看到屏幕上的波形上下跳动,这说明已经收到红外信号了。
毕业论文基于STC单片机虚拟简易示波器的设计

题目:基于STC单片机虚拟简易示波器的设计目录1.实验目的及意义 (1)2. 试验内容及方案论证 (1)3.系统工作原理 (2)4.硬件电路设计 (2)5.系统软件设计 (3)5.1下位机设计 (3)5.2 上位机设计 (6)6.系统调试 (8)6.1硬件调试 (8)6.2 软件调试 (8)6.3 软硬联调 (9)7.实验结果与误差分析 (9)8.实验小结及体会 ........................................................................ 错误!未定义书签。
参考文献: (11)1.实验目的及意义(1)学会利用AT89C5X系列单片机控制AD7862实现模拟的电压的采集;(2)学会利用串口与PC机进行通信将测量数据发送给PC机,在PC机上利用Visual C++ 6.0编写上位机界面,并显示数据与波形;(3)通过应用Altium Designer 6软件掌握电路板的原理图绘制及pcb板的生成;(4)学会利用Keil uVision4软件编写并调试单片机的下位机程序,利用Keil uVision4与wave6000软件结合,对硬件电路采集来的数据进行分析。
2. 试验内容及方案论证在实际应用中,经常会遇到一些突发信号,需要对其进行高速采集,这种情况下采用高速的A/D自然成为首选。
AD7862是AD公司推出的一个高速,低功耗,双12位的A/D转换,单+5V供电,功率为60mW。
它包含两个4us的延时的ADC,两个锁存器,一个内部的+2.5V参考电压和一个高速并行输出端口。
有四个模拟输入通道,分为两组,由A0选择。
每一组通道有两个输入(VA1 & VA2 or VB1 & VB2),它们能同时的被采样和转化,保存相对的信号信息。
它可以接受+10v的输入电压范围(AD7862-10),+2.5(AD7862-3)和0-2.5v(AD7862-2)。
DIY示波器

一年前,在《无线电》杂志上看到一篇示波器的连载文章(作者是魏坤)很是心动,希望自己也能亲手DIY一个。
但当时材料、实力有限,于是笔者拼命的研究文章中提供的电路图和使用的芯片资料。
现在,自己终于也能DIY一个了,当然,性能远远没有那篇文章介绍的强,但软、硬件技术及制作难度很小,容易让DIY爱好者们自制成功。
在这里,笔者愿和大家分享一下制作过程。
这款简易示波器的性能如下:1.电压挡位:200mV、500mV、1V、2V、5V、12.5V、25V、50V。
2.频率挡位:12MHz、6MHz、4MHz、3MHz、2MHz、1MHz、500kHz、250kHz、100 kHz、50kHz、25kHz、10kHz。
3.能较好地测量300 kHz的波形。
这次DIY的示波器性能虽然较弱,仅仅能用来测试音频等300kHz以下频率的周期波形。
不过它还有一个实用的功能,可以用来测试+/-50V的电压(量程是自动切换的)。
主要零件编号零件名称数量1ATMEGA8单片机 1924MHz有源晶振 18128x64液晶屏[ST7565控制器] 125532运放 23AD603压控放大器 14TLV5618[DA] 15ADS830E[AD] 16IDT7205 17ILC7660 2101117-5.0 2111117-3.3 11279L05 113继电器 214电容、电阻、二极管若干15三极管 216洞洞板 117按钮 2电路分析这个版本示波器的电路原理如图1所示。
电路制作时,我用了1块16cm×10cm的万用板,电路中仅仅使用2个按钮来操作示波器,因为我只使用了一片M8单片机作为控制器,1个按钮用于循环改变采样频率,另一个按钮用来选择信号的耦合方式,直流或者交流耦合。
大家要问了,如何用一片 M8 单片机产生12MHz的采样时钟呢?呵呵,其实我对M8单片机进行了超频,使用24MHz的有源晶振作为它的时钟频率。
然后,通过定时器2的比较匹配翻转电平,以产生不同的时钟。
STC12C2052AD单片机-万能学习遥控器-记录波形方式

// 中断函数注意养成指定寄存器组的习惯//不同优先级的中断程序绝对不能使用同一组寄存器/*****编程时防止中断把寄存器中的数据改变的解决方法是给中断指定寄存器,同优先级的使用同一组没事。
1、写中断程序一定要用using语句指定寄存器组。
第1、2、3组都可以,不能是0.2、51单片机的中断有两个优先级。
一个中断不会打断另一个相同优先级的中断。
这样相同级别中断可以使用同一个组。
比如:低优先级的中断函数都用using 1,高优先级的中断都用using 2 。
这样不会冲突。
下面是一个正常的例子:C程序:void int0() interrupt 0 using 1默认5个中断时同级的,不会冲突,但是最好养成好习惯不指定中断要使用的寄存器,每次都要入栈保护数据,中断完还要出栈,代码会增加32字节********************************************************************/#include <stc12c2052ad.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//少占鱼制作河北正定欢迎您长沙航空职业技术学院2010 年QQ:411656434//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对ISP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对ISP_CONTR 寄存器设置此值#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对ISP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对ISP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对ISP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对ISP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对ISP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对ISP_CONTR 寄存器设置此值union union_temp16{uint un_temp16;uchar un_temp8[2];}my_unTemp16;uchar Byte_Read(uint add); //读一字节,调用前需打开IAP 功能void Byte_Program(uint add, uchar ch); //字节编程,调用前需打开IAP 功能void Sector_Erase(uint add); //擦除扇区void IAP_Disable(); //关闭IAP 功能/******************************************************************/sbit JIESHOU=P1^0; //接收指示灯sbit FASHE=P1^1; //发射指示灯sbit KEY=P3^5;sbit cin=P3^2; //接收端sbit contrl=P3^0;//发射控制端sbit khz=P3^1;//38KHZ产生,由T1设置/****************************************************************/void delayms(uint);void ADC();void InitADC();void init1();void init2();void fashe();void jieshou();void delayus(uchar i);void led(uchar x);/******************************************************/uint voltage;bit receive=0;//接收标志bit flag=0;//低电平记录完成标志bit end=0;bit finish=1;uchar xdata a[111]={121,1,3,4,44,55,24,156,35};//间接寻址的高128RAM,内部256RAM高128只能间接寻址uint j=0;uint zu=0,addr=0; //扇区地址uchar k;//按键代号uchar m=0;//写EEPROM时用来移动数组的uchar b[6];//用来存储每一组数据的总字节数/**********************************************************************//****************************************************************/void main(){//默认STC12是1T运行模式。
旧手机如何自制示波器

旧手机如何自制示波器
示波器是一种用途十分广泛的电子测量仪器。
它能把肉眼看不见的电信号变换成看得见的图像,便于人们研究各种电现象的变化过程。
示波器利用狭窄的、由高速电子组成的电子束,打在涂有荧光物质的屏面上,就可产生细小的光点(这是传统的模拟示波器的工作原理)。
在被测信号的作用下,电子束就好像一支笔的笔尖,可以在屏面上描绘出被测信号的瞬时值的变化曲线。
利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用它测试各种不同的电量,如电压、电流、频率、相位差、调幅度等等。
下面小编就教大家如何用旧手机制作简单的示波器
工具/原料
Oscilloscope 软件(安卓有免费版本,苹果似乎要收费,小伙伴们自己搜索一下)
智能手机1部。
DIY 51单片机 + ADC0809 示波器

通过对两个单片机的控制实现电压信号的采集以及显示波形,可以调整显示频率... 主单片机控制12864的显示,从单片机实现对ADC0809的驱动转换...下面是该系统的程序:主单片机:#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned int#define dataIO P1#define ADdataIO P0unsigned char p[]={0xf7,0xfb,0xfd,0xfe};int num;static int count=20;sbit RS=P2^5;sbit RW=P2^4;sbit E=P2^3;sbit PSB=P2^2;sbit NC=P2^1;sbit BF=P1^7;sbit EOC=P3^4;sbit EN=P3^5;static unsigned char DATA[128]=0;void delay(long int x){long int i;for(i=0;i<x;i++);}void checkbusy(){RS=0;RW=1;E=1;while(BF);E=0;}void transfer(uchar word ,bit a ,bit b) //数据交换, a:1数据, 0指令b:1读,0写。
// {checkbusy();RS=a;RW=b;E=1;dataIO = word;delay(2);E=0;RS=~RS;RW=~RW;}uchar readRAM(bit a)//a:1.data 2.cmd//{uchar x;checkbusy();dataIO=0xff;RS=a;RW=1;E=1;delay(2);x=dataIO;delay(2);E=0;RS=~RS;RW=~RW;return(x);}void clear(){transfer(0x01,0,0);delay(10);}void LCDstatus(uchar a){checkbusy();transfer(a,0,0);}void clr(){unsigned char x,y,i;checkbusy();transfer(0x36,0,0);for(i=0;i<9;i+=8)for(x=0;x<32;x++)for(y=0;y<16;y++){transfer(x+0x80,0,0);transfer(y+0x80+i,0,0);transfer(0x00,1,0);transfer(0x00,1,0);}}void Point(unsigned char x,unsigned char y){char x_real,y_real,data_H,data_L, Memory_H,Memory_L; if(x>=128||y>=64);else{if(y<32){x_real=x/16+0x80;y_real=0x80+y;}else{x_real=x/16+0x88;y_real=0x80+y%32;}if(x%16<8){data_H=(0x01<<(7-x%16));data_L=0;}else{data_H=0;data_L=(0x01<<(15-x%16));}checkbusy();transfer(0x36,0,0);transfer(y_real,0,0);transfer(x_real,0,0);transfer(0x34,0,0);transfer(0x30,0,0);checkbusy();readRAM(1);Memory_H=readRAM(1);Memory_L=readRAM(1);checkbusy();data_H=data_H|Memory_H;data_L=data_L|Memory_L;}checkbusy();transfer(0x36,0,0);transfer(y_real,0,0);transfer(x_real,0,0);transfer(data_H,1,0);transfer(data_L,1,0);}void reset(){delay(2000);transfer(0x30,0,0);delay(50); //选择基本指令集transfer(0x30,0,0); //选择8bit数据流delay(20);transfer(0x0c,0,0); //开显示(无游标、不反白)delay(20);transfer(0x01,0,0); //清除显示,并且设定地址指针为00Hdelay(500);transfer(0x06,0,0); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位delay(0);}void enterdata(char * word){while(*word!='\0'){transfer(*word,1,0);word++;delay(10);}}void line(uchar x0,uchar y0,uchar x1,uchar y1){char temp;char dx,dy; //定义起点到终点的横、纵坐标增加值char s1,s2,status,i;uchar Dx,Dy;int sub;dx=x1-x0;if(dx>=0) //X的方向是增加的{ s1=1;Dx=dx;}else //X的方向是降低的{ s1=-1;Dx=-dx;}dy=y1-y0; //判断Y的方向是增加还是降到的if(dy>=0){s2=1;Dy=dy;}else{s2=-1;Dy=-dy;}/******Dx=fabs(x1-x0); //计算横、纵标志增加值的绝对值Dy=fabs(y1-y0);******/if(Dy>Dx) //{ //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0 temp=Dx;Dx=Dy;Dy=temp;status=1;}elsestatus=0;/*********Bresenham算法画任意两点间的直线********/sub=2*Dy-Dx; //第1次判断下个点的位置for(i=0;i<Dx;i++){Point(x0,y0); //画点if(sub>=0){if(status==1) //在靠近Y轴区,x值加1x0+=s1;else //在靠近X轴区,y值加1y0+=s2;sub-=2*Dx; //判断下下个点的位置}if(status==1)y0+=s2;elsex0+=s1;sub+=2*Dy;}}main(){unsigned char x,x_m,y_m,i;TCON=0x05;IE=0x85;reset();clr();EOC=0;while(1){x_m=0;for(x=0;x<128;){if(EOC==1);{EN=1;DATA[x++]=ADdataIO;EN=0;i=0;while(i<=count)i++;}}y_m=DATA[0]/4;for(x=0;x<128;x++){line(x_m,y_m,x,DATA[x]/4);x_m = x;y_m = DATA[x]/4;}clr();}}void stop() interrupt 0 /*用两个外部中断实现对频率的控制*/ {count--;delay(100);}void stop1() interrupt 2{count++;delay(100);}从单片机程序:#include<reg51.h>sbit dataIO=P1;sbit ADD_A =P2^1;sbit ADD_B =P2^2;sbit ADD_C =P2^3;sbit ALE =P2^4;sbit START =P2^5;sbit EOC =P2^6;sbit EN =P2^7;void delay(){unsigned char i,j;for(i=0;i<34;i++)for(j=0;j<1;j++);main(){unsigned char DATA;START=0;ALE=0;ALE=1;ADD_A = 0;ADD_B = 1;ADD_C = 1;ALE=0;while(1){START=1; START=0; delay();}}。
基于STC单片机的红外解码测试仪设计

53第2卷 第6期基于STC 单片机的红外解码测试仪设计钱小四(厦门建霖健康家居股份有限公司,福建 厦门 361000)摘要:很多家用电器都采用红外遥控作为短距离无线控制方式,文章采用STC 单片机作为核心解码控制器,通过其强大功能分析解码各种红外遥控器的数据,为遥控器厂家及产品设计人员提供一种可靠便捷的解码仪器,能极大的提高制造企业生产效率。
关键词:STC 单片机;红外解码;测试仪中图分类号:TP368.1;TN407 文献标识码:A 文章编号:2096-6164(2020)06-0053-021 红外解码测试仪概述红外解码测试仪是专门用于红外遥控器的数据解码测试仪器,不仅解码常用的NEC 、RC5等市场覆盖率高的协议的遥控器,还可以解码市场上常见空调协议如格力、海信、奥克斯、LG 等长数据的遥控器及其它自定义类型的家用电器红外遥控器;各种协议的解码精度都保持在3%的范围内,超出范围的不良产品均可以通过仪器筛选出;可支持40种以上红外遥控协议,同时也可以兼容无线通讯模块如2.4G 或蓝牙模块的解码测试,能极大提升遥控器生产厂家的生产检测效率,同时也为设计开发人员提供极其便利设计及检测的方法。
2 红外线原理特征描述红外线是波长在760 nm ~1 mm 之间的电磁波,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。
红外通信一般采用红外波段内的近红外线,波长在0.75 um ~25 um 之间。
红外数据协会(IRDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通信效果,红外通信协议将红外数据通信所采用的光波波长的范围限定在850 nm ~940 nm 之内。
作为无线局域网的传输方式,红外线方式的最大优点是不受无线电干扰,且它的使用不受国家无线管理委员会的限制。
中国遥控器产量占全球总产量的80%;遥控器制造业属于一个发展成熟及竞争激烈的行业,集中度较高。
国内遥控器企业目前大多停留在劳动力密集的代加工状态,受成本限制测试仪器使用率低、生产效率低下。
基于单片机的简易数字示波器设计-电子信息

摘要示波器是设计制造和维修电子设备必不可少的一种硬件设施,在多个领域都有广泛的应用。
近年来微型集成电路和计算机信息都有着稳固的发展和提升,也就使得示波器也有了一定技术层次上的提高,逐渐开始被应用到了很多领域。
本次的设计方案主要是制作一个简易的数字示波器,主要研究的方向是硬件设施的选用以及有效构成,配合的软件程序的编写这两大部分。
硬件设施主要选用的是A/D转换设备,运行时间短,设备准确程度高,选用的是单片机at89c52和At89c51,有效的提高设备的运行速率,在同等状态的工作时间下,能够高质量高速度的完成作业。
数据最终的呈现效果选用液晶设备,能够有效地展现呈现效果,并且简单易识别,数据频率的显示设备也非常便捷。
有效的实现了数据的采集和读取,提高准确程度。
AbstractOscilloscope is an indispensable hardware facility for the design, manufacture and maintenance of electronic equipment, which is widely used in many fields. In recent years, micro-integrated circuits and computer information have developed and improved steadily, which makes the oscilloscope have also improved at a certain technical level, and gradually began to be applied to many fields.The design of this project is mainly to make a simple digital oscilloscope, the main research direction is the choice of hardware facilities and effective composition, with the compilation of software program these two parts. Hardware facilities mainly choose A/D conversion equipment, which has short running time and high accuracy. The micro-integrated circuits connected with AT89c52 and AT89c51 are selected to effectively improve the operation speed of the equipment. Under the same working time, it can complete the operation with high quality and high speed. The final display effect of data is LCD device, which can effectively show the presentation effect, and is easy to identify, and the display device of data frequency is also very convenient. Effective realization of data acquisition and reading, improve accuracy.Key Words: SCM ; Real-time sampling; Waveform; Frequency关键词:单片机;实时采样;波形;频率目录前言 (6)1.1选题的背景意义和研究现状 (6)1.1.1选题的背景和意义 (6)1.1.2国内外研究现状 (6)1.2 本设计所要实现的目标 (6)1.3 设计内容 (7)1.4 本章小结 (7)第二章单片机简易数字示波器的系统设计 (8)2.1简易数字示波器的基本原理 (8)2.1.1 简易数字示波器的组成 (8)2.2简易数字示波器的运作方式 (8)2.2.1简易数字示波器的功能 (8)2.2.2简易数字示波器驱动方式 (8)2.3简易数字示波器的特点 (9)2.4本章小结 (9)第三章单片机简易数字示波器硬件设计与实现 (7)3.1 频率测量及显示电路的硬件设计 (7)3.1.1 测频电路总体构成 (7)3.1.2 信号调理电路设计 (7)3.1.3 数码管显示模块 (9)3.1.4 数码管显示驱动模块 (9)3.2 幅度测量及显示模块的硬件设计 (10)3.2.1 显示电路总体结构 (15)3.2.2 单片机外围电路设计 (16)3.2.3 信号波形采集模块 (17)3.2.4 显示模块 (17)3.2.5 电源设计 (18)3.3 本章小结 (10)第四章系统软件设计 (39)4.1 测频系统软件设计 (39)4.2 显示系统软件设计 (40)4.3 信号采集系统软件设计 (41)4.4 本章小结 (41)第五章调试及仿真 (42)结论 (43)致谢 (44)参考文献 (45)附录 (46)1 前言1.1选题的背景意义和研究现状1.1.1选题的背景和意义世界上第一台示波器是阴极射线管示波器,他诞生于1897年,至今还被许多德国人称为布朗管。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近想做无线遥控,在网上没有找到好的资料,要想做好无线遥控,就要清楚无线遥控的波形,最好用示波器,但太贵了,自己动手先做一简单的示波器,利用声卡当示波器,很好用,对红外遥控、315M/443M无线遥控、51单片机串口分析等足够用了。
下面是我做的图片:1、硬件(音频线1根,万用表表笔1付);2软件。
这就是硬件,一根音频线各和两只表笔。
(10元钱不到)双通示波器
表笔接测式端,
屏蔽线接地。
音频线插头插入“话筒输入端”
这是软件CoolEdit2.0
值得注意的是接收到的波形图是通过声卡后反了相的,可以通过软件编辑反相,能接收到发送的波形图,就好办了,对波形图分析,就可以解码,可以根据对波形图分析理解,找到你自己的解码方式。
这是用声卡示波器对315M/443M无线遥控接收到的波形图:
通过对波形的分析,好像是很乱,这就是为什么很多初学者无线遥控解码失败的原因,在没有接收到无线遥控信号时,也有一些乱的波形,有些朋友想用315M/443M无线遥控模块做串口通信,结果发现接收到很多乱码,而且不停的接收到。
你会看到波形有突然的变化,放大后,你就会发现有一定的规律,
首先有一段比较长的波形,通过软件可以看出有多少ms(大概13ms),这就是同步码,后面有25短的波形,这就是PT2262的编码格式。
首先要识别出同步码,这个很关键,我们在做发射编码时也要做这个,一般为10-20ms,这是区别于乱码的标志。
下面说说我是怎样解码的,利用51单片机,接收信号接到P3.2,用下降沿外部中断。
检测每2次下降沿中断的时间,用T1计时;每2次下降沿之间的高电平段的时间,用T0计时;
这是常用的PT2262的格式,
首先要检测到同步码,每两次中断的时间大于(T1计时)12ms;检测到同步码后才开始解码,如果接收到的高电平在450us左右为“0”;
如果接收到的高电平在1300us左右为“1”;这样我们就能解码了。
这是我的解码程序:
#include <STC12C5A60S2.h>
#include <intrins.h>
#include<stdlib.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uint INT0_H_timer=0;//两个下降沿之间的高电平宽度uint INT0_L_timer=0;//两个下降沿总宽度
bit DBM =0;//同步码标志
long DATA=0;//取得24位数据(暂存);
long DATAZ=0;//取得24位数据(比较暂存);
long DATAX=0;//取数据
uchar DATA_x=0;//取数据次数;
//uint INT0_H[24]={0,};
uchar TY=0;//连续取数标志
void InitTimer0(void)//T0用于计两个下降沿之间的高电平宽度{
TMOD |= 0x09;//T0加门控计高电平宽度
TH0 = 0x00;
TL0 = 0x00;
ET0 = 0;//关T0定时中断
TR0 = 1;
TF0=0;//溢出清0
}
void InitTimer1(void)//T1用于计两个下降沿总宽度
{
TMOD |= 0x10;
TH1 = 0x00;
TL1 = 0x00;
ET1 = 0;//关T1定时中断
TR1 = 1;
TF1=0;//溢出清0
}
void INT0_int()//外部中断初始化
{
IT0=1;//下降沿
EX0=1;
EA=1;
}
void main(void)
{
uchar x=12,y=0;
// AUXR &= 0x7F; //定时器时钟12T模式InitTimer0();
InitTimer1();
INT0_int();
TH0=10;
TL0=10;
while (1)
{
P0=DATAX;
}
}
void INT0Interrupt(void) interrupt 0
{
INT0_L_timer=TH1*256+TL1;//两个下降沿总宽度
INT0_H_timer=TH0*256+TL0;//两个下降沿之间的高电平宽度TH0 = 0x00;
TL0 = 0x00;
TH1 = 0x00;
TL1 = 0x00;
if (TF0)//有溢出不取值出错
{
INT0_L_timer=0;//两个下降沿总宽度
INT0_H_timer=0;//两个下降沿之间的高电平宽度
TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
// P0=0xfe;
}
//晶振22.1184、12分频,13~15ms为同步码
if (INT0_L_timer>24000&&INT0_L_timer<27000)//晶振22.1184、12分频
{
DBM=1;
//P0=0;
}
if (DBM)//取第3次同步码后的数据
{
if ((INT0_H_timer>600)&&(INT0_H_timer<1000))//350~500us为0
{
DATA &= 0xfffffe;
if (DATA_x<23)
{
DATA_x++;
DATA=DATA<<1;
}
else
{
if (TY>=1)
{
TY=0;
if (DATAZ==DATA)//如果2次取数一致,读出数
{
DATAX=DATA;
}
else
{
INT0_L_timer=0;//两个下降沿总宽度
INT0_H_timer=0;//两个下降沿之间的高电平宽度
TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
}
}
else
{
DATAZ=DATA;
TY++;
}
DATA=0;
DBM=0;
DATA_x=0;
// P0=0x7f;
}
}
else if ((INT0_H_timer>2200)&&(INT0_H_timer<2600))//1200~1400us为1 {
DATA |= 0x000001;
if (DATA_x<23)
{
DATA_x++;
DATA=DATA<<1;
}
else
{
if (TY>=1)
{
TY=0;
if (DATAZ==DATA)//如果2次取数一致,读出数
{
DATAX=DATA;
}
else
{
INT0_L_timer=0;//两个下降沿总宽度
INT0_H_timer=0;//两个下降沿之间的高电平宽度
TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
}
}
else
{
DATAZ=DATA;
TY++;
}
DATA=0;
DBM=0;
DATA_x=0;
// P0=0x7f;
}
}
else//出错
{
INT0_L_timer=0;//两个下降沿总宽度
INT0_H_timer=0;//两个下降沿之间的高电平宽度TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
//P0=0xfd;
}
}
}。