DAC和ADC的实现各有哪些方法?

DAC和ADC的实现各有哪些方法?,第1张

将输入电阻和反馈电阻的比值设为1:10

基本上DAC有电流和方法,即用2R,2R的T网络作输入,R作输出接在运放上,

ADC的方法就多了,并行法,天平法,Sigma-Delta

嵌入式实时系统开发的正确选择

随着嵌入式实时系统复杂度的提高,设计工程师在定义和分析系统初始要求时必须认真考虑软硬件的协同关系。通常设计工程师还必须权衡系统的灵活性、速度、成本、计划和可用工具之间的关系。本文打算描述嵌入式系统和实时系统的关键特性,并探讨在选择或开发硬件和软件组件的基础上开发高效嵌入式系统的解决方案,同时详细说明嵌入式系统和实时系统开发所特有的关键工艺技术。

嵌入式系统通常是一个包含微处理器的特殊计算机系统,是一个较大系统或设备的组成部分,它在很大程度上决定了设备的功能特性。许多具备数字接口的设备如微波设备、录像机(VCR)和汽车等都会用到嵌入式系统。有些嵌入式系统需要使用 *** 作系统,有些则用单个程序实现整个逻辑,但所有嵌入式系统提供的功能都要比通用计算系统更专业些。嵌入式系统功能包括:

1. 监视环境-从输入传感器读取数据,然后处理数据并显示结果。

2. 控制环境-产生并向激励器发送命令。

3. 转换信息-转换并处理收集到的数据。

虽然通过传感器和激励器完成与外部世界的交互是嵌入式系统的重要特点,但这些嵌入式系统还提供适合它们所在设备的特殊功能。嵌入式系统一般用来执行控制程序、有限状态机和信号处理算法。这些系统还必须检测内部计算环境和周围电磁系统中发生的故障并对此做出响应。

嵌入式系统特性

嵌入式系统的设计挑战是使嵌入式系统的独特性能与设备的特殊约束条件相一致。以下是一些嵌入式系统的重要特性:

1. 特殊应用系统-嵌入式系统不同于通用处理器,它针对特殊应用进行了优化。

2. 反应性系统-反应性计算的意思是系统(主要是软件部分)根据传感器信息对环境作出响应,并利用激励器控制环境,同时系统速度能与环境速度同步。

3. 分布式-嵌入式系统的一般特征是多个通信进程在多个通过通信链路链接的CPU或ASIC上运行。

4. 异类性-不同的嵌入式系统一般具有不同的结构,以便在处理严格设计约束的嵌入式系统时能够提供更好的设计便利性。

5. 苛刻环境-许多嵌入式系统并不工作在受控的环境中,因此它们必须能够经受过热、振动、冲击、电源波动和其它恶劣的物理环境条件的考验。

6. 系统安全性和可靠性-由于嵌入式系统复杂度和运算量的不断增长,需要更多地考虑系统安全因素。

7. 小型化、重量轻-为了达到便携目的,许多嵌入式系统的重量必须设计得很轻。

8. 成本敏感性-不同的嵌入式系统对成本的敏感性有很大的不同。

实时系统的特性

实时系统要求在外部环境指定的时间间隔内对来自环境的激励信号作出响应(包括物理时间的过渡)。从输入时间到输出时间的延迟必须足够小,以满足可以接受的时间值。通常实时系统需要对环境作出连续及时的响应。

计算的正确性不仅依赖于结果,而且取决于输出发生的时间。一个实时系统必须满足有限响应时间约束条件,否则会产生严重的后果。如果后果是性能的劣化而不是故障,那么这种系统可以看作是一个软实时系统。如果后果是系统发生故障,那么这种系统就是一种硬实时系统。

实时系统有反应式和嵌入式两种类型。反应式实时系统会与环境发生连续的互作用,而嵌入式实时系统主要用于控制大型系统中安装的特殊硬件。

嵌入式系统开发生命周期

许多系统设计工程师都会经历硬件/软件协同设计的过程(图1),此过程中硬件与软件将同时进行开发。理解硬件与软件功能相互之间的关系及界限有助于确保设计要求得到完整正确的理解和实现。

早在设计要求的定义与分析阶段,系统开发人员就必须与设计工程师协同分配硬件或/和软件方面的要求。这种分配的依据是早期系统仿真、原型设计和行为建模结果、工程师自己的经验以及上文提及的各种因素权衡结果(图2)。一旦分配结束,就可以立即着手具体的设计和实现。实时系统开发中软硬件的并行设计会使用到各种分析技术,包括:

1. 硬件与软件仿真;

2. 硬件/软件协同仿真;

3. 可调度的建模技术,如速率恒定分析;

4. 原型设计和渐进式开发。

可以在各种抽象层次使用的仿真技术主要用于开展早期的性能评估。低层仿真可以用来为总线宽度和数据流程建模,这对性能评估是非常有用的。高层仿真可以满足功能的交互,并促成硬件/软件权衡研究及有效性设计。利用仿真可以将一个复杂的系统向下抽象成基础组件和行为。仿真还助于解决功能性问题(数据与算法)、行为(进程排序)或性能问题(资源利用、吞吐量和时序)。

理解设计要求

在作执行任何类型的处理器评估时,首先要详细理解用户的功能和非功能性要求。功能性要求通常比较容易获得,而非功能性要求较难定量测量。但对于实时系统来说,定义响应时间这样的要求是非常重要的。实时要求可以有以下几种:

1. 激励-激励(S-S):到系统去的两个激励之间的实时关系;

2. 激励-响应(S-R):一个激励与来自系统的一个后序响应之间的实时关系;

3. 响应-激励(R-S):一个响应与到系统去的一个后序激励之间的实时关系;

4. 响应-响应(R-R):来自系统的两个响应之间的实时关系。

S-R和R-R关系定义了对指定系统的时序要求。这种情况下所实现的功能必须足够快(或足够慢)才能满足时序要求。S-S和R-S约束暗示系统必须能够从环境(可能是一个用户或另外一个系统)中检测出特定时序约束的破坏。这些约束与功能的快慢没有关系,相反它们能够检测出某些遭到破坏的时序约束并采取必要的措施。

因此要从最初系统要求设计时就很好地理解这一点,因为S-R和R-R约束可以引导设计工程师进行代码优化,而S-S和R-S约束需要用额外的软件来检测和响应时序冲突。

处理器选择

嵌入式实时系统比较适合用于系统优化。由于这些系统主要用来解决范围相对较窄的问题,因此硬件和软件能够得到最佳优化,并很好地应用于单一设备。这样做的目的是要在软硬件最佳折衷状态下开展系统设计。影响这一阶段设计的主要因素是处理器的选择、软硬件的分割和总体系统集成。

在为嵌入式实时系统选择处理器时需要考虑以下几个方面:

1. 性能:处理器必须有足够的性能执行任务和支持产品生命周期。

2. 实现:根据具体应用情况,处理器可能需要被高度集成。在DSP应用中可以有好几种选择,专用集成电路(ASIC)就是其中的一种。这些器件可以被用作DSP协处理器,但对于许多通用信号处理来说显得不够灵活。另外可以选择精简指令集计算机(RISC)处理器。这些处理器的时钟速度特别快,但可扩展性不是很强,而且会发生其它实时(可预测性)问题。现场可编程阵列(FPGA)是一种快速器件,能够快速高效地完成某些DSP功能,但与DSP相比开发难度比较大,因为在DSP中一个简单的程序就能完成相同的功能。如果是主信号处理应用,则最好采用性能强大功耗也较大的通用处理器。如果需要快速升级信号处理应用,采用DSP等可编程器件比定制的硬件方案要更好些。

3. 工具支持:支持软件创建、调试、系统集成、代码调整和优化工具对整体项目成功与否非常关键。

4. *** 作系统支持:嵌入式系统应用需要使用有帮助的抽象来减少其复杂性。针对处理器系列产品作过优化的商用 *** 作系统(OS)能够缩短设备开发周期和上市时间。

5. 过去的经验:拥有处理器或处理器系列产品的开发经验可以减少可观的学习新处理器、工具和技术的时间。

6. 仿真支持:循环精确仿真对某些类型的应用来说非常重要,特别是数字信号处理应用中许多功能正确性验证都是采用仿真技术完成的。嵌入式系统的软硬件协同设计模型也促使处理器仿真器成为开发流程中一个非常有用的工具。

7. 应用支持:应用支持有多种方式,从通过热线或网站取得的应用专家支持,到预打包的软件和应用框架,甚至完好的测试平台。一些DSP处理器能够提供外围器件的驱动器、板级支持包和其它“启动帮助组件”。有了这些软件组件后,应用开发师就无需再编写器件驱动器等“无附加值”的软件,相反,他们可以把精力放在具有附加值的功能开发上,使他们的产品能独树一帜。

8. 成本:嵌入式应用对成本特别敏感,而产品成本的稍许差别都可能导致市场的失败。

9. 功耗:市场上有许多依靠电池工作的便携嵌入式实时系统,此时电池寿命将成为系统的重要参数。这种情况下应该考虑使用针对便携式应用优化的低功耗器件。

10. 传统代码:如果选中的处理器需要设计人员编写与现存代码的接口,将会导致整个设计流程的严重滞后。因此需要选择一款代码兼容的器件来避免或减少这一步骤造成的影响。

11. 算法复杂性:某些处理器能够非常高效地处理某类算法,因此最好选择能够与应用最佳匹配的处理器。例如,具有许多控制代码的有限状态机应用应该映射为类似ARM处理器的RISC器件。编码、解码和回波抵消等信号处理应用应该映射为数字信号处理器,或具有信号处理加速的某种器件。

12. 上市时间:项目的完成时间会加快处理器的选择过程,这一过程与先前讲述的几个关键事项密切相关,如OS的可用性、其它软件组件以及便携性问题。

设计还是购买?

是自己设计还是购买成品呢?如果有可能不重新设计,价格也比较合理的话,购买要比自己开发更有利。由于嵌入式系统预算的缩减、实时 *** 作系统(RTOS)和TCP/IP堆栈等商用技术的改进、嵌入式系统要求的扩展,采用商业性现成(COTS)技术正变得越来越普遍。采用COTS技术能够缩短开发周期中编码、调试、单元测试和代码检查阶段的时间。

然而,作出购买而非设计的决定会改变一个组织的基础开发流程。一个组织希望实现的新业务有:供应商调研和评估、产品评估以及实时的供应商交流与关系建立。产品开发的其它活动不会取消,但会作出一些改变。这些变化包括更关注如何将系统硬件与软件更好地组合在一起,而不再把重点放在模块自己内部的运作上。另外必须更侧重于兼容性、可配置性和可集成性等结构上的问题。

必须很好的理解和高效地管理由于决定采用“购买”而非“设计创建”方式所导致的结果。首先,自然是对供应商提出产品要求、产品可靠性、计划和产品文档等依赖请求。这种情况下产品要求中的灵活性会打些折扣。购买商用产品意味着接受现有的产品要求,但这种要求也许不能完美地匹配自身产品的要求,这就需要设计人员把这种缺点与COTS技术提供的成本与上市时间优势作一个理智的权衡。

因此重要的是最终用户与技术人员必须参与COTS供应商的选择,考虑的重点要放在业务需求上而非技术本身。性价比分析所要考虑的因素应包括易学性、易用性、供应商名声和长期稳定性、许可方式和培训。所有与性能有关的声明必须尽可能采用内部或外部基准或演示来到得有效性认证。为了避免可能出现的偏差,评估标准应该在收到供应商建议前就制定好。选择供应商的主要工作包括研究和理解技术标准和相当的文件、采用类似建议请求(RFP)的标准模式征求供应商的建议、对供应商建议进行评估和排序、选择供应商并签署合同。

除了评估技术外,还应对供应商本身进行评审。要充分了解供应商开业时间的长短、供应商的背景和名声、供应商的其它用户对它的评价和意见、供应商人力资源的投入和对你的计划或项目的支持情况,以及供应商对你业务和要求的理解程度,甚至对未来项目的承诺。以前软件团队认为软件开发方案遵循类似于创建架构的特定模式。提供符合一般模式的抽象方法能够使软件团队定制符合他们特殊要求的方案,同时遵循被前人证明是高效和正确的模式。

嵌入式系统供应商已经认识到需要通过提供软件组件和类似于设计模式的框架来加快软件开发进程。在DSP领域,供应商向DSP设计工程师提供包括参考框架(RF)在内的上百个以DSP为核心的软件组件用于产品和系统开发。设计完好的参考框架能够在设备开发的早期阶段让设计人员快速入门。RF内含方便易用并且适合多种应用的源代码。由此可以取消许多早期的低层设计决策,使开发人员能有更多的时间用在真正显示产品特色的代码开发上。设计人员可以选择能够最大程度满足他们系统需要的专业RF,然后集成适配的算法(可以是其它供应商出售的DSP COTS算法,或供应商自己的算法)生成适合各种终端设备的特殊应用,如宽带、语音、视频图像、生物测量和无线设施。这些RF提供百分之百的C语言源码,并且没有版税要求。RF源代码可以从<a href="http://www.ti.com/downloadrfnow" target="_blank">www.ti.com/downloadrfnow</a>网站下载。

软件性能工程

许多嵌入式实时系统必须满足一系列性能目标。一般来讲,性能是一个软件系统或组件对时间要求满足程度的一种指示。这里的时间指标可以用响应时间和吞吐量来衡量,该时间值是指响应某种要求所需的时间,而吞吐量用以指示系统在特定时间间隔内能够处理的请求数量。可扩展性是嵌入式实时系统的另外一个重要指标,可以用它来衡量系统要求提高时系统能够继续满足响应时间或吞吐量要求的能力。

如果在整个开发生命周期内得不到正确的性能管理,那么即使选择了正确的处理器和软件也是徒劳的。性能故障的后果是非常严重的,它可能损伤与客户的关系,造成收入下降,甚至导致整个项目失败。因此在整个生命周期内需要随时关注性能问题。性能管理可以被动或主动完成。被动方式需要采用一个较大的处理器解决性能问题,它只在系统完成构架、设计和实现后处理性能问题,在解决问题前一直处于等待状态,直到实际需要测量的事件发生。主动方式是指整个生命周期内一直在跟踪和交流性能问题,同时开发用以识别性能劣化的进程,并在性能处理中培养团队成员。

本文小结

显然开发嵌入式实时系统是一个相当复杂的过程,本文旨在启发设计人员在分析初始要求时如何权衡硬件与软件之间的关系,要时刻在系统灵活性、速度、成本、计划和可用工具之间作出权衡,并充分考虑各个供应商提供长期可靠支持的可能性。

//////////////////////////////////////

//晶振频率为6MHz 一个机器周期2us //

//实现按键地址码、指令码的数码管显示//

//2010-06-01 //

//////////////////////////////////////

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6

sbit wela=P2^7

bit overflag,dataover//开始接收数据,数据处理完毕

uchar timedata//定时器0溢出次数

uchar chubus[33]//33Byte数据 timedata组成的数组

uchar jieguos[4]//地址码,地址反码,数据码,数据反码;

void initial()//初始化

{

IT0=1EX0=1//负边沿触发

TMOD=0x01ET0=1TR0=1//模式1,十六位定时器

TH0=0xffTL0=0x06//0.5ms溢出

EA=1//开总中断

}

void time0() interrupt 1//定时器0中断

{TH0=0xffTL0=0x06

timedata++

}

void ex0() interrupt 0//外部中断0,接收数据

{

static bit startflag//开始接收

static uchar i

if(startflag)

{

if(timedata<32&&timedata>=16) i=0

chubus[i]=timedata

timedata=0

i++

if(i==33){overflag=1i=0}

}

else

{

startflag=1

timedata=0

}

}

void chulidata()

{

uchar chubu//初步数据

uchar jieguo//结果数据

uchar x,y,z=1

for(x=0x<4x++)//处理四组数据

{

for(y=1y<=8y++)//处理一组数据8Byte

{

chubu=chubus[z]

jieguo=jieguo>>1

if(chubu>3) jieguo=jieguo|0x80//大于1.5mS为1

z++

}

jieguos[x]=jieguo

jieguo=0

}

dataover=1

}

void delay(uint z)

{

uint x ,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void display()

{

uchar gao,gao1

uchar di,di1

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71}

gao1=table[jieguos[0]/16]

di1=table[jieguos[0]%16]

gao=table[jieguos[2]/16]

di=table[jieguos[2]%16]

dula=1

P0=gao1

dula=0

P0=0xff

wela=1

P0=0x7e

wela=0

delay(2)

dula=1

P0=di1

dula=0

P0=0xff

wela=1

P0=0xfd

wela=0

delay(2)//地址码

dula=1

P0=gao

dula=0

P0=0xff

wela=1

P0=0x77

wela=0

delay(2)

dula=1

P0=di

dula=0

P0=0xff

wela=1

P0=0x6f

wela=0

delay(2)//指令码

}

void main()

{

initial()//初始化

while(1)

{

if(overflag)//数据接收完毕

{

chulidata()//处理数据,完成标志dataover

overflag=0

}

if(dataover)

{

display()//数码管显示

}

}

}

(1)发送程序

#include <reg52.h>

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

static unsigned int count //延时计数器

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

static unsigned int temp//按键

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

static unsigned char num

sbit ir_in=P3^4

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

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

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 2009-8-11 <br>4 <br>红外数据传输 <br>0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e} //共阳数码管 0~~f

void SendIRdata(char p_irdata)

void delay(unsigned int)

void keyscan()

/******************主函数**************************/

void main(void)

{

num=0

P2=0x3f

count = 0

flag = 0

OP = 0

ir_in= 0

EA = 1//允许CPU中断

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

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

TH0 = 0xFF

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

TR0 = 1//开始计数

iraddr1=3//00000011

iraddr2=252//11111100

do{keyscan()<br>}while(1)

}

/***********************定时器0中断处理 **********************/

void timeint(void) interrupt 1

{

TH0=0xFF

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

count++

if (flag==1)

{

OP=~OP

}

else

{

OP = 0

}

ir_in= OP

}

void SendIRdata(char p_irdata)

{ 2009-8-11

5

红外数据传输

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=0i<8i++)

{

/*****先发送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=0i<8i++)

{

endcount=10

flag=1

count=0

do{}while(count<endcount)

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

{

endcount=41

}

else

{ 2009-8-11

6

红外数据传输

endcount=15

}

flag=0

count=0

do{}while(count<endcount)

irdata=irdata>>1

}

/******************发送八位数据********************************/

irdata=p_irdata

for(i=0i<8i++)

{

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=0i<8i++)

{

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

}

2009-8-11

7

红外数据传输

endcount=10

flag=1

count=0

do{}while(count<endcount)

flag=0

}

void delay(unsigned int z)

{

unsigned char x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

/*********************4×4键盘扫描按下按键发射数据************************/

void keyscan()

{

P1=0xfe

temp=P1

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P1

switch(temp)

{

case 0xee:num=1

break

case 0xde:num=2

break

case 0xbe:num=3

break

case 0x7e:num=4

break

}

while(temp!=0xf0)

{

temp=P1

temp=temp&0xf0

}

P2=table[num-1]

SendIRdata(table[num-1])

}

P1=0xfd

temp=P1

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P1

switch(temp)

{

case 0xed:num=5

break

case 0xdd:num=6

break

case 0xbd:num=7

break

case 0x7d:num=82009-8-11

8

红外数据传输

break

}

while(temp!=0xf0)

{

temp=P1

temp=temp&0xf0

}

P2=table[num-1]

SendIRdata(table[num-1])

}

P1=0xfb

temp=P1

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P1

switch(temp)

{

case 0xeb:num=9

break

case 0xdb:num=10

break

case 0xbb:num=11

break

case 0x7b:num=12

break

}

while(temp!=0xf0)

{

temp=P1

temp=temp&0xf0

}

P2=table[num-1]

SendIRdata(table[num-1])

}

P1=0xf7

temp=P1

temp=temp&0xf0

while(temp!=0xf0)

{

temp=P1

switch(temp)

{

case 0xe7:num=13

break

case 0xd7:num=14

break

case 0xb7:num=15

break

case 0x77:num=16

break

}

while(temp!=0xf0)

{

temp=P1

temp=temp&0xf0

} 2009-8-11

9

红外数据传输

P2=table[num-1]

SendIRdata(table[num-1])

}

}

(2)接收程序

#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar dis_num,num,num1,num2,num3

sbit led=P1^0

unsigned char code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e} //共阳数码管 0~~f

sbit prem =P3^2 //定义遥控头的接收脚

uchar ram[4]={0,0,0,0}//存放接受到的4个数据 地址码16位+按键码8位+按键码取反的8位

void delaytime(uint time) //延迟90uS

{

uchar a,b

for(a=timea>0a--)

{

for(b=40b>0b--)

}

}

void rem()interrupt 0 //中断函数

{

uchar ramc=0 //定义接收了4个字节的变量

uchar count=0 //定义现在接收第几位变量

uint i=0 //此处变量用来在下面配合连续监测9MS 内是否有高电平

prem=1

for(i=0i<1100i++) //以下FOR语句执行时间为8MS左右

{

if(prem) //进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平

return //引导码错误则退出

}

while(prem!=1) //等待引导码的后半部 4.5 MS 高电平开始的到来。

delaytime(50) //延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据32位中

//第一位数据的0.56MS开始脉冲

for(ramc=0ramc<4ramc++)//循环4次接收4个字节

{for(count=0count<8count++) //循环8次接收8位(一个字节)

{

while(prem!=1) //开始判断现在接收到的数据是0或者1 ,首先在这行本句话时,

//保已经进入数据的0.56MS 低电平阶段

//等待本次接受数据的高电平的到来。

delaytime(9)//高电平到来后,数据0 高电平最多延续0.56MS,而数据1,高电平可 2009-8-11

10

红外数据传输

//延续1.66MS大于0.8MS 后我们可以再判断遥控接收脚的电平,

if(prem) //如果这时高电平仍然在继续那么接收到的数据是1的编码

{

ram[ramc]=(ram[ramc]<<1)+1//将目前接收到的数据位1放到对应的字节中

delaytime(11)//如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨入

//下个位编码的低电平中(即是开始的0.56MS中)

}

else //否则目前接收到的是数据0的编码

ram[ramc]=ram[ramc]<<1 //将目前接收到的数据位0放到对应的字节中

} //本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收

}

if(ram[2]!=(~(ram[3]&0x7f)))//本次接收码的判断

{

for(i=0i<4i++) //没有此对应关系则表明接收失败,清除接受到的数据

ram[i]=0

return

}

dis_num=ram[2] //将接收到的按键数据赋给显示变量

}

main()

{

IT0=1 //设定INT0为边沿触发

EX0=1 //打开外部中断0

EA=1 //全局中断开关打开

while(1)

{

switch(dis_num)

{

case 0x81: num=0break

case 0xcf: num=1break

case 0x92: num=2break

case 0x86: num=3break

case 0xcc: num=4break

case 0xa4: num=5break

case 0xa0: num=6break

case 0x8f: num=7break

case 0x80: num=8break

case 0x84: num=9break

case 0x88: num=10break

case 0xe0: num=11break

case 0xb1: num=12break

case 0xc2: num=13break

case 0xb0: num=14break

case 0xb8: num=15break

}

P2=table[num]

P1=0x01

delaytime(5)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8123703.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存