编程原理

关键词:

编程原理(精选七篇)

编程原理 篇1

为了提高搜索效率, 缩小搜索空间, Lucene可以使用过滤器把可能的搜索匹配结果限制在所有文档的一个子集合中,这可以用来对已得到的搜索结果进行进一步搜索, 从而实现在搜索结果中的继续搜索功能。对Lucene的过滤器原理及编程实践进行深入探讨。

2 过滤器原理及编程实践

2.1 建立索引

(1) 准备要索 引的内容 , 本案例拟 索引学生信 息 , 具体包括学号 (id)、姓名 (name)、性别 (gender) 和年龄 (age)等内容, 定义如下数组:

(2) 决定索引 的存储位置 , 鉴于本案例 数据少 , 可将索引直接放在内存中, 因此创建如下Directory对象。

directory=new RAMDirectory();

其中, directory是个类级实例变量, 表示索引的 存储位置。

(3) 创建Index Writer对象 , 用以创建 和维护索引。

其中, Index Writer Config对象持有创建Index Writer对象时的所有配置信息, Version指明了Lucene的版本号, Smart Chinese Analyzer对象是Lucene提供的中 文分析器 , 用来在索引 期间对中文内容进行分词。

(4) 通过循环索引 书籍信息 。

2.2 过滤器原理

Lucene通过一个 抽象基类Filter来过滤搜 索期间返 回的文档。Filter有多个子类, 其中一个名为Multi Term Query WrapperFilter, 它是Multi Term Query类的包装 器 , 以过滤器 形式对外展示其功能。 不过, Multi Term Query Wrapper Filter类的设计目的并不是给Multi Term Query类使用的, 一般地, 需要将MultiTerm Query Wrapper Filter类的子类 提供给Multi Term Query类的子类使用。

Multi Term Query Wrapper Filter类有3个子类 , 分别是Prefix Filter类、Numeric Range Filter类和Term Range Filter类 , Filter类及其子类之间的继承关系如图1所示。

Term Range Filter类对特定域的项范围进行过滤。Term RangeFilter类提供了一个名为new String Range的静态方法用于创建实例对象, 这个方法的原型是public static Term Range Filter newString Range ( String field, String lower Term, String upper Term,boolean include Lower, boolean include Upper) , 其中field表示要过滤的域; lower Term表示项范围的起点项; upper Term表示项范围的终点项; include Lower如果为true, 表示项范围包含起点项, false表示不包含; includeUpper如果为true, 表示项范围包含终点项, false表示不包含, 创建Term Range Filter类实例对象的样例代码如下:

Numeric Range Filter类是Numeric Range Query的包装器 ,只接受特定范围的数值, 要使用它, 必须先用Int Field、FloatField、Long Field或Double Field类索引数 值型的值 。要创建Numeric Range Filter类的实例 对象 , 需要使用它 提供的一个静态 工厂方法 , 以Integer型数值为 例 , 该工厂方 法的原型 为public static Numeric Range Filter <Integer > new Int Range ( Stringfield, Integer min, Integer max, boolean min Inclusive, booleanmax Inclusive), 其中field表示要过 滤的特定 域 ; min表示整型数值范围的最小值; max表示整型数值范围的最大值; min Inclusive表示数值 范围是否 包含最小值 , true表示包含 , false表示不包含; max Inclusive表示数值范围是否包含最大值, true表示包含, false表示不包, 创建Numeric Range Filter类实例对象的代码如下:

Prefix Filter类返回与 指定域前 缀匹配的 查询结果 , 它是Prefix Query类的包装 器 , 该类的构 造函数原 型为Prefix Filter(Term prefix), 其中prefix为查询项 , 创建Prefix Filter类实例对象的样例代码如下:

2.3 编程实践

(1) 创建Index Searcher对象 , 这个对象 通过Index Reader实现对索引的搜索功能。

其中, Index Reader是一个抽象类, 它提供了在任意时间点访问索引的接口,

(2) 创建过滤 器 (以Term Range Filter类为例 )。

(3) 根据过滤 器实现搜 索功能。

其中, Top Docs表示搜索命中的所有文档, Score Doc则表示Top Docs中的一个命中文档, Document表示一个文档, 它通过get方法就可以获取指定域的内容。

下面我们观察一下上述程序的运行结果。

找到相关结果2个

从上面的结果可以看出, 过滤器有效地缩小了搜索空间,为实现在搜索结果中的继续搜索特性提供了良好的基础。

3 结语

编程原理 篇2

比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。

Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL(DynamicLinkableLibrary)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。MicrosoftWindows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。

一般来说,DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。

在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。

DLL现在越来越容易编写。Win32已经大大简化了其编程模式,并有许多来自AppWizard和MFC类库的支持。

一、导出和导入函数的匹配

DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。

简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其它DLL文件中的函数。这样,一个特殊的DLL可以既有导入函数,又有导入函数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。

在DLL代码中,必须像下面这样明确声明导出函数:

__declspec(dllexport)intMyFunction(intn);

但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在应用程序方面,要求像下面这样明确声明相应的输入函数:

__declspec(dllimport)intMyFuncition(intn);

仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。而且应用程序事实上必须至少包含一个对DLL函数的调用。

二、与DLL模块建立链接

应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。所谓的隐式链接是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载。而显式链接与此相反。

采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。

显式链接方式对于集成化的开发语言(例如VB)比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用Win32的LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。假设有一个导出如下函数的DLL文件:

extern“C”__declspec(dllexport)doubleSquareRoot(doubled);

下面是应用程序对该导出函数的显式链接的例子:

typedefdouble(SQRTPROC)(double);

HINSTANCEhInstance;

SQRTPROC*pFunction;

VERIFY(hInstance=::LoadLibrary(“c:winntsystem32mydll.dll”));

VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,“SquareRoot”));

doubled=(*pFunction)(81.0);//调用该DLL函数

在隐式链接方式中,所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中;但如果采用显式链接方式,程序员可以决定DLL文件何时加载或不加载,

显式链接在运行时决定加载哪个DLL文件。例如,可以将一个带有字符串资源的DLL模块以英语加载,而另一个以西班牙语加载。应用程序在用户选择了合适的语种后再加载与之对应的DLL文件。

三、使用符号名链接与标识号链接

在Win16环境中,符号名链接效率较低,所有那时标识号链接是主要的链接方式。在Win32环境中,符号名链接的效率得到了改善。Microsoft现在推荐使用符号名链接。但在MFC库中的DLL版本仍然采用的是标识号链接。一个典型的MFC程序可能会链接到数百个MFCDLL函数上。采用标识号链接的应用程序的EXE文件体相对较小,因为它不必包含导入函数的长字符串符号名。

四、编写DllMain函数

DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。下面是一个框架DLLMain函数的例子。

HINSTANCEg_hInstance;

extern“C”intAPIENTRYDllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserved)

{

if(dwReason==DLL_PROCESS_ATTACH)

{

TRACE0(“EX22A.DLLInitializing! ”);

//在这里进行初始化

}

elseif(dwReason=DLL_PROCESS_DETACH)

{

TRACE0(“EX22A.DLLTerminating! ”);

//在这里进行清除工作

}

return1;//成功

}

如果程序员没有为DLL模块编写一个DLLMain函数,系统会从其它运行库中引入一个不做任何操作的缺省DLLMain函数版本。在单个线程启动和终止时,DLLMain函数也被调用。正如由dwReason参数所表明的那样。

五、模块句柄

进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识。进程自己还有一个HINSTANCE句柄。所有这些模块句柄都只有在特定的进程内部有效,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。在Win32中,HINSTANCE和HMODULE的值是相同的,这个两种类型可以替换使用。进程模块句柄几乎总是等于0x400000,而DLL模块的加载地址的缺省句柄是0x10000000。如果程序同时使用了几个DLL模块,每一个都会有不同的HINSTANCE值。这是因为在创建DLL文件时指定了不同的基地址,或者是因为加载程序对DLL代码进行了重定位。

模块句柄对于加载资源特别重要。Win32的FindResource函数中带有一个HINSTANCE参数。EXE和DLL都有其自己的资源。如果应用程序需要来自于DLL的资源,就将此参数指定为DLL的模块句柄。如果需要EXE文件中包含的资源,就指定EXE的模块句柄。

但是在使用这些句柄之前存在一个问题,你怎样得到它们呢?如果需要得到EXE模块句柄,调用带有Null参数的Win32函数GetModuleHandle;如果需要DLL模块句柄,就调用以DLL文件名为参数的Win32函数GetModuleHandle。

六、应用程序怎样找到DLL文件

如果应用程序使用LoadLibrary显式链接,那么在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,或是进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:

1.包含EXE文件的目录,

2.进程的当前工作目录,

3.Windows系统目录,

4.Windows目录,

5.列在Path环境变量中的一系列目录。

这里有一个很容易发生错误的陷阱。如果你使用VC++进行项目开发,并且为DLL模块专门创建了一个项目,然后将生成的DLL文件拷贝到系统目录下,从应用程序中调用DLL模块。到目前为止,一切正常。接下来对DLL模块做了一些修改后重新生成了新的DLL文件,但你忘记将新的DLL文件拷贝到系统目录下。下一次当你运行应用程序时,它仍加载了老版本的DLL文件,这可要当心!

七、调试DLL程序

Microsoft的VC++是开发和测试DLL的有效工具,只需从DLL项目中运行调试程序即可。当你第一次这样操作时,调试程序会向你询问EXE文件的路径。此后每次在调试程序中运行DLL时,调试程序会自动加载该EXE文件。然后该EXE文件用上面的搜索序列发现DLL文件,这意味着你必须设置Path环境变量让其包含DLL文件的磁盘路径,或者也可以将DLL文件拷贝到搜索序列中的目录路径下。

编程原理 篇3

【摘 要】传统的可编程控制器实验由于种种原因存在學生积极性不高、实验效果不理想等问题,针对这个现状并结合技术本科院校“技术立校,应用为本”的教学方略及办学特色,本文提出适合可编程控制器原理及应用课程的配套实验改进措施,充分调动学生的积极性和主动性,显著提高学生的创新意识和动手能力。

【关键词】可编程控制器原理及应用课程 实验方法 创新

一、引言

实验教学在高等教育中占有极其重要的地位,是教育教学改革的重要组成部分。传统的验证性实验比较单调枯燥,不能充分调动学生的学习兴趣和学习热情,不能满足技术本科教学的发展要求。通过可编程控制器实验的课程建设,尝试将新的实验规则和实验内容应用于实验教学,可以不断提高学生将所学的理论知识应用于具体实践环节的应用能力和动手能力,激发学生自动自觉学习。

二、传统验证性实验教学中存在的问题

实验教学是技术应用型本科教学的重要组成部分。随着教育事业的发展和教育改革的推进,实验室建设得到加强,实验教学条件不断改善,实验教学活动深入开展,促进了教育理念的更新,教师的教学方式得到改进,学生的创新能力得到不断加强。但传统实验教学存在很多不足,实验室建设和发展中还有很多地方需要改革创新。

首先,实验室开放共享不到位,造成实验资源浪费。由于实验室师资有限,更是出于安全考虑,除了课堂时间外,实验室都是不开放的。很多时候实验设备都无人使用,造成了实验资源的巨大浪费。

其次,学生自主实验严重不足,缺乏参与实践教学的积极性。传统实践教学,课时比较少,内容比较固定,提供给学生发挥的空间有限。因为课时和学分比较少,多为考查性质,只要记忆相关内容就能应付考查,因此大部分学生缺少对实践课程的重视,对实践教学也缺少兴趣。

本着面向技术本科“技术立校,应用为本”的办学方略,充分发挥学生积极性,提高学生动手能力的原则,学院多个实验室开展了开放性实验教学尝试,收到了良好的效果。

三、可编程控制器实验的多方法设计

《可编程控制器技术及应用》是电气工程专业的必修课,配套的《可编程控制器技术及应用实验》是十六个学时考查课,两学时/双周,一个学分。每个实验安排两学时,学生两人一组,可做八个实验。

前两次实验,分别为认识实验和基础实验,考虑到学生所学内容较少,掌握的方法有限,实验为传统的验证性实验。随着教学的推进,后续实验可以采用开放式、多种方法实现模式。

每个开放性实验都要先做好实验前准备工作。为达到良好效果,给学生两周自由安排练习时间。故在上一次实验结束时布置下次实验任务,提出实验要求,介绍实验面板,提示可行性方法等。学生自拟题目练习,不是死记硬背,而是掌握方法,下次实验时每组同学随机抽取一个实验课题,两个同学相互协调帮助,当场编写程序,调试修改,并最终完成。

例如LED数码显示实验,可能要求学生编程实现控制由八组LED发光二极管模拟的八段数码管开始显示学号,(例如学号是091001130501),每个数字停留2秒,并循环,按下停止按钮后停止显示。显示的内容可以是今天的日期“20120426”,也可以是“SDJU。EDU”,还可以是“S7-200PLC”或者“HELLO-PLC”等等。除显示内容外,可以增加暂停等要求,这些要求可根据课程教学的进展以及学生掌握情况而定。“五相步进电机的模拟控制实验”、“喷泉彩灯控制实验”等可以采用多方法实现的开放式实验模式。

多方法实现型实验,要根据学生的实际能力,对学生提出要求,学生通过一定努力才能完成任务;避免固定形式,统一要求时,学生可以蒙混过关,可以抄袭或者死记硬背的情况。学生通过自己编程、自己调试,不但提升了动手能力,培养了学习兴趣,更增强了学习信心。

四、实验室开放环节

多方法实现型实验,在过程中加入了学生开放型实验的环节,因此最困难的是实验室管理环节。为了能使学生在各个时间段都能进行实验练习,需要有细致的管理规范、严谨认真的管理态度以及吃苦耐劳的牺牲精神。实验室老师通过不断研究和总结经验,结合监控系统等设备,克服各种困难,为学生提供了良好的实验环境。学生预约后,可以在上午、中午、下午等各时间段进行实验。

研究制订出能够体现学校定位及保障实验教学培养目标实现、教学方法实施、教学考核规范的教学过程相关管理规章制度和教学流程,汇编成册。编辑、整理、细化实验指导书都是需要完善之处。

五、培养考查环节及教学效果

通过一学期的多方法实现的开放型实验培养,学生动手能力和信心、兴趣都有所提高,在考查环节,学生表现良好,绝大多数能正常发挥,出色完成考查任务。

学期末尾的课程设计环节,学生的表现令人满意,很多学生对可编程控制器产生了兴趣,希望毕业设计也做相关内容。

结合技术应用型本科院校“技术立校,应用为本”的教学方略以及学校培养技术应用型人才的育人目标,不断设计、研究、开发、引导学生提高实验能力,提高自觉性,提高学习兴趣,建立信心,是我们开展多方法实现实验的目标。

【参考文献】

[1]刘树郁,林明河.实验室管理体制改革的实践和探索[J].实验室研究与探索,2001,20(02):6-8.

[2]左铁镛.高等学校实验室建设的作用与思考[J].实验室研究与探索,2011,30(04):1-5.

[3]苏春梅,杨红,姚金风,等.高职药学专业实验教学过程规范化管理[J].实验室研究与探索,2011,30(04):117-119.

[4]夏建国.技术应用型本科教育探索与实践[M].上海:东方出版中心,2008:1-7.

编程原理 篇4

别克荣御轿车采用UART和GM LAN两种通信协议, 发动机控制模块 (ECM) 、变速器控制模块 (TCM) 和防抱死制动系统/牵引力控制系统电子控制单元 (ABS/TCS ECU) 利用GM LAN通信协议在串行数据总线上进行通信;车身控制模块 (BCM) 则利用通用UART通信协议与组合仪表、音响主机 (AHU) 、乘员保护系统 (SRS) 和诊断模块 (SDM) 进行通信, 其数据总线布局如图1所示。

1-动力系统接口模块 (PIM) 2-方向盘转角传感器3-变速器控制模块 (TCM) 4-防抱死制动系统/牵引力控制系统电子控制单元 (ABS/TCS ECU) 5-发动机控制模块 (ECM) 6-车身控制模块 (BCM) 7-乘员保护系统 (SRS) 和诊断模块 (SDM) 8-音响主机 (AHU) 9-组合仪表10-数据链路连接器A-GM LAN串行数据电路B-主UART串行数据电路C-第二UART串行数据电路D-第三UART串行数据电路

一、特点与原理

1. 特点

GM LAN一词表明各种发动机和车辆控制模块都链接在了一条公共的双向数据总线上, 使用GM LAN的优点在于:由于公共传感器信号被多次使用, 因而所需的传感器和信号线减少;电缆线束中所需的导线减少;由于线束导线缩减, 使车辆的总重减小;控制单元连接器中所需的端子减少;改善了控制稳定性和可维修性。

UART协议规定数据以单线线路进行传输, 一次传送一位。UART总线是一个5V的数据线, 在通信过程中, 该线路以固定的脉宽在电压和接地 (0V) 之间切换, 并以8192Bit/s的速度向所连接的所有模块传送数据。当数据线路不进行通信时, 系统电压恒定在5V。

由于GM LAN通信协议与UART通信协议不兼容, 所以在串行数据通信系统中加设了动力系统接口模块 (PIM) , 这样就使通信网络的UART端和GM LAN端的控制模块之间实现双向通信。动力系统接口模块 (PIM) 集成在串行数据网络中, 相当于一个双向透明解释装置, 可使GM LAN串行数据总线上的控制模块与UART串行数据总线上的控制模块进行通信。

2. 原理

别克荣御轿车安装了10种电脑模块, 电脑模块之间采用UART和GM LAN两种通信协议, 具体电路如图2所示。

1) UART串行数据电路

主UART串行数据电路800 (红/黑色导线) 连接到数据链路连接器 (X40) 的端子9、动力系统接口模块 (A5) 和车身控制模块 (A15) 。第二UART串行数据电路1061 (绿/白色导线) 连接到车身控制模块 (A15) 和乘员温度控制模块 (A14) 、仪表 (P3) 、远程通信模块 (A158) 、座椅和后视镜记忆模块 (A21) 、高级音频放大器 (N7) 、音频接口模块 (A156) 、收音机 (A133) 和轮胎气压监测系统 (A157) 。第三UART串行数据电路744 (白/绿色导线) 连接到车身控制模块 (A15) 以及传感和诊断模块 (A65) 。

2) 动力系统接口模块 (PIM)

动力系统接口模块 (PIM) 作为一个通信网关, 它执行如下功能:使通信网络的UART端和GM LAN端的控制模块之间实现双向通信;将来自巡航控制开关和牵引力控制开关的模拟信号转换为数字串行数据;在发动机控制模块验证动力系统接口模块 (PIM) 之前, 动力系统接口模块 (PIM) 负责验证车身控制模块 (BCM) , 如有任何验证过程未通过, 车辆将不能起动。

3) GM LAN总线系统

GM LAN总线系统通过双线网络在发动机控制模块 (ECM) 、变速器控制模块 (TCM) 、防抱死制动系统/牵引力控制系统控制模块 (ABS/TCS ECU) 和动力系统接口模块 (PIM) 之间实现通信。该总线是一个双线系统, 包含一条棕黄/黑色导线 (CAN高位) 和一条棕黄色导线 (CAN低位) 。两条导线拧绞在一起, 以防止对车中其它控制单元造成电磁干扰, 因为导线扭绞在一起后, 可以抵消因线路电压快速改变而产生的磁场。

GM LAN使所有发动机和车辆控制模块都能以较快的速率交换数据, 这意味着发动机控制模块 (ECM) 、变速器控制模块 (TCM) 和防抱死制动系统/牵引力控制系统控制模块 (ABS/TCS ECU) 彼此之间能够交换数据。所有GM LAN模块都连接有特定的外部车辆装置, 模块从这些外围装置读取数据, 或向其传送指令。何时读出或传送数据, 通常是由发动机或车辆工作状况来决定的, 而这一工作状况是由连接到GM LAN上的其它控制模块提供的。任何模块传输的数据都将发送给GM LAN总线上的所有控制模块, 各控制模块必须判断其是否需要对所接收的数据进行处理, 如果需要则作出响应。

二、维修编程

在更换动力系统接口模块 (PIM) 、发动机控制模块 (ECM) 、车身控制模块 (BCM) 和音响主机 (AHU) 时, 必须对系统进行重新编程和安全连接。别克荣御轿车的控制模块较多, 并且采用两种数据通信协议, 因此给汽车的检测维修带来很多麻烦, 其中模块的“重设定”、“维修编程”、“安全链接”等程序非常复杂, 维修人员必须严格按照通用车型维修手册进行操作。

1. 更换新ECM

更换新ECM后, 车辆将出现发动机无法起动、仪表中有“SERVICE VEHICLE SOON”的故障提示、Tech2检测仪无法进入发动机诊断功能等现象。更换全新的ECM (售后维修状态的全新ECM, 在零件条形码附近应有一白色漆标, 如图3所示) 后, 按顺序执行下述编程相关操作:

(1) 在拆卸原车ECM之前, 对其进行“重设定”;

(2) 对新ECM进行“维修编程”;

(3) 对新ECM进行“安全链接”;

(4) 对新ECM进行检测及学习, 清除故障码。

2. 更换新PIM

更换全新PIM后, 车辆将出现发动机无法起动、仪表中有“SERVICE VEHICLE SOON”的故障提示等现象。在更换新PIM时, 需要按顺序执行下述编程相关操作:

(1) 拆卸前对原车PIM进行“重设定”;

(2) 对新PIM进行“安全链接”;

(3) 对新PIM进行“编程”;

(4) 检测/清除故障码。

3. 更换新BCM

更换新BCM后, 车辆将出现原有遥控钥匙失效、发动机无法起动、仪表中有“SERVICE VEHICLE SOON”的故障提示、收音机进入防盗激活状态、DVD不工作等现象。在更换新BCM时, 应注意图4所示的安全代码, 并按顺序执行下述编程相关操作:

(1) 在拆卸原车BCM之前, 学习原车BCM设定;

(2) 安装新BCM后, 必需使用新遥控钥匙并对其进行编程;

(3) 对新BCM进行编程已学习的BCM设定;

(4) 对新BCM进行“安全链接”;

(5) 对新BCM执行“车身控制模块重新读入程序”;

(6) 进行BCM和PIM间的“链接”;

(7) 将原车收音机P.I.N和机械钥匙号写入新BCM;

(8) 通过收音机控制面板输入收音机P.I.N, 解锁收音机;

(9) 检测并消除故障码。

三、总结

编程原理 篇5

摘要:从应用的角度出发,阐述系统级RF收发芯片nRF24E1的RADIO口控制方法和工作过程;分析nRF24E1的收发方式;详细介绍ShockBUrst技术、DuoCeiver技术和应用中器件的配置方法并通过代码说明实际应用中的编程方法。

关键词:nRF24E1 射频 无线通信 配置

引言

nRF24E1收发器是Nordic VLSI推出的系统级射频芯片,采用先进的0.18μm CMOS工艺、6mm×6mm的36引脚QFN封装,以nRF240 RF芯片结构为基础,将射频率、8051MCU、9输入10位ADC、125通道、UART、SPI、PWM、RTC、WDT全部集成到单芯片中,是目前世界首次推出的、全球2.4GHz通用的、完事的低成本射频系统级芯片。

由于nRF24E1片内集成了RADIO模块,在使用中,只需要一片nRF24E1和少数的外围元件就能完成射频收发功能,因此,大大减少了系统的体积。使用nRF24E1时,必须进行相应的配置工作。下面,详细讲述nRF24E1的收发原理和编程方法,以供读者设计时参考。有关nRF24E1的介绍请见第6期。

1 RADIO口

nRF24E1收发器的收发任务由RADIO口控制。RADIO口使用标准8051中的P2口地址。由于射频收发器是片内置的,并不是双向工作。为了满足射频收发子系统的需要,RADIO口的默认值与标准8051的P2默认值也不一样。

收发器由特殊功能豁口中的RADIO(0A0H)和SPI_CTRL(0B3H)控制。SPI_CTRL=00B时,SPI没用;SPI_CTRL=01B时,SPI连接到P1口;SPI_CTRL=10B时,SPI连到第一个nRF2401频道;SPI_CTRL=11B时,SPI连接到第二个nRF2401频道。RADIO豁口的各个位如图1所示。在nRF24E1头文件中,所定义的各个位的名字与图1中一样。

(1)用SPI口控制收发器

用芯片内嵌的SPI口控制收发器的操作非常方便。如RF配置和ShockBurst RX(接收)或TX(发送)。

(2)复位时RADIO口的状态

复位引脚为高电平时(无论是时钟是否有效),控制nRF2401收发子系统的RADIO输出位默认为RADIO.3(CS)=0,RADIO.6(CE)=0,RADIO.7(PWR_UP)=1。程序运行后,保持默认值,直到程序通过RADIO寄存器改变各位的值。

(本网网收集整理)

2 收发方式

通过PWR_UP、CE和CS三个控制引脚,可以设置nRF2401的工作方式。PWR_UP=1,CE=1,CS=0为收发方式;PWR_UP=1,CE=0,CS=1为配置方式;PWR_UP=1,CE=0,CS=0为空闲方式;PWPWR_UP=0时关机。

2.1 ShockBurst

nRF24E1的nRF2401收发子系统的收发方式只有ShockBurst。ShockBurst的.功能由配置字决定。ShockBurst技术使用了片内的FIFO(先入先出)堆栈。虽然数据低速进入,但能高速发送,使能耗减到最低限度。

(1)ShockBurst发送

CPU接口引脚为CE、CLK1、DATA,工作流程如下:

①CPU有数据要发送时,把CE置高,nRF2401开始工作。

②接收节点地址和有效数据按时序被送到nRF2401子系统,可通过应用协议或CPU设置,使这个速度小于1Mbps(如10kbps)。

③CPU把CE置低,激活ShockBurst发送。

④ShockBurst。

*给RF前端供电;

*完成RF包处理(加前缀,CRC校验);

*数据高速发送(250kbps或1Mbps,可由用户配置决定);

*发送完成,nRF2401返回空闲信号。

(2)ShockBurst接收

CPU的接口引脚为CE、DR1、CLK1、DATA,工作流程如下:

①校验接收到的RF包的地址和欲接收的RF包中有效数据的长度。

②把CE置高,激活RX。

③经过200μs处理,nRF2401子系统监视启动并等待信号的到来。

④当收到一个有效的数据包(正确的地址和CRC),nRF2401子系统移去前缀、地址和CRC位。

⑤nRF2401子系统通过把DR1置高来通知CPU。

⑥CPU把CE置低,把RF前端设为低功耗方式。

⑦CPU将按时序以适当的速度(如10kbps)把有效数据取出。

⑧当所有的有效数据都送完,nRF2401子系统再次把DR1置低。如果CE保持为高,准备接收下一个数据包;CE为低,重新开始新的接收。

2.2 DuoCeiver

ShockBurst收发方式使nRF24E1能够方便地同时接收两个不同频率的频道发送的数据,并且能够使接收速度达到最大值。这意味着:

*nRF24E1通过一个天线,能够接收两个频率相差8MHz(8个频率通道)的1Mbps发射器(如nRF24E1、nRF2401或nRF2402)发送的数据。

*这两个不同数据频道的数据被分别送到两套不同的接口――数据频道1为CLK1、DATA和DR1,数据频道2为CLK2、DOUT2和DR2。

DuoCeiver技术提供了两个独立、专用于接收的数据频道,而不是采用两个相互独立的接收器。使用第二个数据频道必须满足要求:第二数据频道的工作频率至少比第一个频道的工作频率高8MHz。使用ShockBurst技术,CPU先取出其中一个数据频道中的数据,另一数据频道中的数据等待CPU处理完。这样不至于丢失数据;同时,也降低了对CPU性能的要求。

3 器件配置

在配置方式下,配置字最高可达18字节。nRF2401子系统的配置字通过一个简单的三线接口(CS、CLK1和DATA)送给配置寄存器。

3.1 ShockBurst的配置

ShockBurst方式配置字的作用是使nRF2401子系统能够处理RF协议。在实际操作中,一旦完成协议并装入了nRF2401子系统,只有1字节(bit[7:0])的配置字需要更新。用于ShockBurst的配置字分为如下四块(详见表2):

*有效数据宽度(DATA2_W和DATA1_W),指明RF包中有效数据的位数,这使nRF2401子系统能够区分接收到数据包中的有效数据和CRC字节;

*地址宽度(ADDR2和ADDR1),设置RF数据包中地址字节所占用的位数,最高为40位,这使nRF2401字节系统能够区分地址和有效数据;

*接收频道地址(ADDR_W),即接收数据的目标地址;

*CRC配置(CRC_L和CRC_EN),CRC_L用于设置CRC为8位或16位校验,CRC_L=0为8位,CRC_L=1为16位,CRC_EN使能片内的CRC。

在发送方式,CPU必须产生与接收数据的nRF2401子系统配置相同的地址和有效数据块。当使用nRF240子系统片内的CRC特性时,注意CRC是否已经使能,并且注意在发送器和接收器上使用相同的长度。

3.2 配置字描述

配置字的读取在CLK1的正边沿时,从MSB(最高位)开始。新的配置从CS的下降沿开始。假如nRF2401子系统需要配置为ShockBurst方式,两个接收频道,则在VDD(芯片电源)上电后,只需120位的配置字。在协议、工作方式和接收频道都配置好后,只需要1位(RXEN)来切换是接收或发射。在配置字被读取的过程中,MSB(最高位)最先被读到寄存器中。默认配置字为:h8E08.1C20..0000.00E7.0000.E721.0F04,共18字节,可根据需要进行取舍。

ShockBurst数据包的总位数最多不能超过256位,可通过式(1)计算有效数据的最大位数。

DATAx_W(bits)=256-ADDR_W-CRC (1)

其中:ADDR_W为配置字中B[32:18]所设置的接收地址的长度,8位~40位;CRC为配置字B[17]所设置的校验字,8位或16位。4位或8位前缀是自动加进去的,不占用数据包的位数。由式(1)可知,要想在每个数据包中得到更长的有效数据,可减少地址和CRC校验位。

3.3 收发常用的配置

在两个接收频道的方式下,nRF24E1同时接收来自两个不同频率频道的数据。第一个频道的频率在配置字B[7-1]中设置,第二个频道通常比第一个频道的频率高8MHz。RX2_EN(B[15])为第二个频道的使能位:RX2_EN=0时,第二个频道不工作;RX2_EN=1时,第二个频道使能。RFDR_SB为收发速率设置位:RFDR_SB(B[13])=0时,收发速率为250kbps;RFDR_SB=1时,收发速率为1Mbps。16MHz晶振时,250kbps的收发灵敏度比1Mbps的高10dB。XO_F(B[12-10])为晶振选择位。RF_PWR(B[9-8])设置nRF24E1射频输出功率。

RF_CH#(B[7-1])设置nRF24E1的工作频率,可通过式(2)计算发射频率和频道1的接收频率,通过式(3)计算频道2的接收频率。RXEN为收发切换位。

ChannelRF=2400MHz+RF_CH#×1.0MHz (2)

ChannelRF=2400MHz+RF_CH#×1.0MHz+8MHz (3)

4 数据包描述

完整的射频数据包由四部分组成:前缀、地址、有效数据和CRC。前缀一般是8位,也要吧设置为4位,由地址的首位决定。如果地址的首位是0,前缀为01010101;如果地址的首位是1,前缀为10101010。ShockBurst方式,前缀、地址和CRC都是在接收器收到数据包后自动移去只留有效数据。

5 应用中的程序

下面所述的程序都是在Keil C51 V7.07下调试通过的。限于篇幅,只分析其中的主要函数代码。

(1)系统初始化函数

void Init(void){

//配置I/O口

P0_ALT=0x06;//P0_ALT=00000110B,P0.1为RXD,P0.2为TXD

P0_DIR=0x09;//P0_DIR=00001001B,P0.0和P0.3设为输入

P1_DIR=0x03;//P1_DIR=00000011B,P1.0和P1.1设为输入

…………//其它I/O口配置

PWR_UP=1;//开Radio,读时不用,写时为电源

SPICLK=0;//SPI时钟为XTAL/8

SPI_CTRL=0x02;//把SPI与第一收发通道(CH1)相连

…………//串口配置、A/D配置等,或自己系统相关的一些配置

}

(2)接收器配置函数

void Init_Receiver(void){

unsigned char b;

CS=1;//打开配置方式

for(b=0;b

SpiReadWrite(rconf.buf[b]); //发送接收器配置字

}

CS=0; //关配置方式

CE=1; //使能收发功能

}

(3)接收函数

void Receiver(void){

unsigned char b;

CS=1; //打开配置方式

for(b=0;b

SpiReadWrite(rconf.buf[b]); //发送接收器配置字

}

CS=0; //关配置方式

for(;;){

b=ReceivePacket; //接收数据包

…………//接收后的处理函数等,可自己扩展

}

}

(4)发送函数

void Transmitter(void){

unsigned char b;

CS=1; //开配置方式

for(b=0;b

SpiReadWrite(tconf.buf[b]);//发送发送器配置字

}

CS=0; //关配置方式

b=KeyByte; //读取数据

TransmitPacket(b); //发送数据

}

(5)其它

编程原理 篇6

SI-PROG编程器为PonyProg 2000[1]软件中使用的一种ISP编程器, 该编程器利用PC机串口电路的异步通信控制器UART实现AVR, PIC, AT89等单片机的ISP编程。虽然该编程器不为Atmel的AVR Studio所支持, 但是其硬件电路简单, 成本低, 便于制作, 适于初学者进行学习和简单开发。下面以AVR单片机为例, 介绍SI-PROG编程器的工作原理及其程序设计。

1 SI-PROG编程器的工作原理

1.1 电路组成

图1为SI-PROG串口编程器的工作原理图。电路分为PC机串口电路[2,3]、SI-PROG编程器[4]和目标机3部分。编程器通过9针D型连接器DB9与PC机串口连接, 通过10针连接器J1与目标机连接, 电路在文献[4]的基础上做了适当的简化。J1引脚定义与Atmel的STK200下载线相同。

1.1.1 PC机串口电路及SI-PROG编程器

PC机串口电路由U1~U4组成。8250 (U1) 为异步通信控制器UART, SN75150 (U2, U3) 为驱动器, SN75154为线接收器。U2, U3, U4实现8250引脚上TTL 电平与串口DB9上RS 232电平转换。SI-PROG编程器则完成DB9上RS 232电平与目标机上TTL电平的转换。

1.1.2 串行SPI接口

编程器通过目标机的SPI 接口[5,6]对其片内的FLASH程序存储器进行下载编程。SPI接口由SCK, MOSI和MISO等几条信号线组成。下载编程的过程实际上是PC机与AVR的通信过程。两者的关系是一种主从关系, PC机为主机, AVR为从机。主机经MOSI引脚将串行数据发给从机, 从机经MISO引脚将数据返回给主机。SCK为串行时钟脉冲, 由主机发往从机。主机通过SCK脉冲控制与从机的数据传输。图2为串行下载编程时序图。单片机在SCK上升沿读取MOSI上的数据位, 在SCK下降沿输出数据位到MISO。

1.2 信号的逻辑关系

由图1可见, 8250的11, 33, 32, 36四个引脚分别通过编程器与AVR的RESEΤ¯, MOSI, SCK, MISO相连进行通信。这4个引脚的电平可通过8250内部的3个寄存器进行设置或读取, 如图3所示。3个寄存器依次为线路控制寄存器 (LCR) 、Modem控制寄存器 (MCR) 和Modem状态寄存器 (MSR) 。对于串口1, 3个寄存器的端口地址一般为3FBH, 3FCH和3FEH。LCR的SB位、MCR的DTR位和RTS位分别控制11, 33, 32三脚的电平。MSR的CTS位则反映了36脚的电平。

下面分析8250与AVR通信信号间的逻辑关系。为了避免引起混乱, 这里全部采用正逻辑描述。

1.2.1 与SB位的逻辑关系

线路控制寄存器LCR的D6位SB决定了8250的11脚的电平。当SB=1时, 11脚被强制拉到低电平, DB9的3脚为高电平。当SB=0时, DB9的3脚为低电平。逻辑关系在Q1上又反相一次。因此, RESEΤ¯信号与SB位的逻辑关系为:

RESEΤ¯=SB¯ (1)

编程时只要通过OUT指令改变SB位的值, 就可以控制RESEΤ¯端的电平。当8250复位后, SB=0RESEΤ¯=SB¯=1RESEΤ¯引脚为高电平。

1.2.2 MOSI, SCK信号与DTR, RTS位的逻辑关系

MODEM控制寄存器MCR的D0位DTR控制

着33脚的电平。置DTR=1, 则33脚DΤR¯为低电平, 是逻辑非关系。U3相当于非门, 故MOSI信号与DTR位的逻辑关系为:

ΜΟSΙ=DΤR (2)

类似的, SCK信号与MCR的D1位RTS的逻辑关系为:

SCΚ=RΤS (3)

1.2.3 CTS位与MISO信号的逻辑关系

MODEM状态寄存器 (MSR) 的D4位CTS反映了8250的36脚的电平, 当CΤS¯端为高电平时, CTS=0;反之CTS=1。CTS位与CΤS¯端是逻辑非关系。因此, CTS位与MISO信号的的逻辑关系为:

CΤS=ΜΙSΟ (4)

根据式 (1) ~式 (4) , 下载编程时, 设置或读取AVR的RESEΤ¯, MOSI, SCK, MISO脚的电平问题就变成通过I/O指令设置或读取8250内部寄存器的SB, DTR, RTS, CTS位的问题。

1.3 SI-PROG编程器的电平转换

根据RS 232标准, 串口DB9上的两种电平分别为5~15 V和-5~-15 V。编程器电路采用分立元件实现DB9上的RS 232电平与AVR的TTL电平间的转换。

1.3.1 RS 232到TTL电平的转换

图1中, 用限流电阻R3和4.7 V的稳压二极管Z2完成DB9的4脚上RS 232电平到J1的1脚上TTL电平的转换。5~15 V与-5~-15 V高低两种电平通过R3后将分别变成4.7 V和0 V (实际为-0.7 V) , 符合TTL电平的要求。

类似的, 限流电阻R4和4.7 V的稳压二极管Z1完成DB9的7脚上RS 232电平到J1的7脚上的TTL电平的转换。

Q1, R1, R2接成反相器, DB9的3脚上的5~15 V与-5~-15 V两种电平分别使Q1处于饱和导通和截至状态, 实现了RESEΤ¯信号的电平转换。

1.3.2 TTL到RS 232电平的转换

TTL到RS 232电平的转换由SN75154线接收器实现。图4为SN75154的施密特电压传输特性曲线[7]。

当阈值电压控制端T3接VCC时, 它工作在图4中曲线a状态, 两个阈值电压分别为VIT-= -1.1 V和VIT+ =2.2 V;当T3悬空时, 它工作于图中曲线b状态, VIT-=1.4 V, VIT+ =2.2 V。显然, 对于后一状态, MISO引脚上的TTL电平信号可以通过U4到达8250, 而前一状态则无法通过U4。

根据文献[2], 长城0520 PC-XT机上SN75154的阈值电压控制端T3接到+5 V。这样, SI-PROG编程器就不能工作。计算机硬件发展到今天, UART一般均升级为16550, 它与打印机并口、键盘控制器等电路一起集成于LPC芯片[8,9,10]内, 16550仍与8250相兼容。驱动器和接收器也都集成到一个芯片内, 如75232[11,12], 75185[13]。这些芯片的接收器不再采用图4中曲线a那样的阈值电压, 而改为与曲线b相接近的情况。表1为3台PC机阈值电压的实验测量结果。表中, 典型值为芯片数据手册中的数据[11,12], 实验值为实验测量结果。显然, 3台PC机上, SI-PROG编程器都能正常工作。

2 下载程序设计

根据式 (1) , 用输出指令向3FBH端口写入40H, 将使RESEΤ¯端置低电平, 写入00H, 使RESEΤ¯端置高电平;根据式 (2) , 式 (3) , 向3FCH端口写入数据, 改变其D1位的数值, 就可改变SCK端的电平, 改变D0位的数值, 即改变MOSI的电平;根据式 (4) , 用输入指令读取3FEH端口, 读取字节的D4位为MISO返回的数据位。

根据AVR单片机的串行下载算法[5], 发送串行编程指令的操作步骤为:进入串行下载模式;发送编程使能指令;执行所需的读、写等操作指令, 可执行一条, 也可执行多条;退出串行编程模式。

(1) 进入串行下载模式。

保持SCK端为低电平, 给RESEΤ¯端发送一个大于两个时钟周期的正脉冲, AVR单片机便进入串行下载模式。

(2) 发送串行编程指令。

根据图2, 一个SCK时钟周期可分4个步骤:输出位数据到MOSI线, 延时;令SCK由0变1, 延时;读取MISO线上的数据位;令SCK由1变0, 延时。前两个步骤写一位数据到AVR, 后两个步骤则从AVR读取1位数据。8个SCK时钟周期写1个字节, 同时读一个字节。

AVR单片机每条编程指令均由4个字节组成。根据上述过程, 将4个字节的编程指令依次写入到AVR, 同时读取返回的4个字节数据。

(3) 退出串行编程模式。

RESEΤ¯端置高电平, AVR单片机退出编程模式。

3 结 语

根据上述分析, 采用VC++6.0编程成功地对ATtiny13和ATmega16两种芯片的FLASH进行了芯片擦除、读、写以及对熔丝位的读、写等操作。注意编程时需要解决Windows NT/2000/XP 操作系统下访问I/O端口的技术问题[14]。

使用SI-PROG编程器, 必须满足两个条件:

(1) 串口的UART芯片要与8250兼容;

(2) 电平转换芯片接收器的阈值电压要介于TTL高、低两种电平之间。

多数PC机所配置的串口都能满足上述两个条件。某些早期的PC机有可能与PC/XT机类似, 不满足条件 (1) 。目前, 家用笔记本电脑上一般不再配置串口。这样, SI-PROG编程器在某些PC机上不能使用。然而, SI-PROG编程器仍有一定的使用空间。毕竟USB接口的编程器价格较高, 而一些商用笔记本电脑中取消了并口但保留着串口, 并口编程器又不能用。而多数台式机上一般仍配置有串口。

摘要:介绍SI-PROG编程器的工作原理, 利用PC机串口UART芯片实现单片机的ISP下载。PC机串口8250芯片中SOUT, DTR, RTS, CTS四个引脚的电平可通过其内部的几个寄存器分别进行控制或读取, 利用引脚可实现单片机的ISP下载。介绍了8250与单片机之间通信信号的逻辑关系以及电平转换, 分析了接收器的阈值电压的特点, 给出了使用SI-PROG编程器的条件。最后, 以AVR单片机为例介绍了下载程序设计。结果表明, 利用PC机串口UART芯片可以实现对AVR单片机的ISP下载, 其硬件电路和软件设计都很简单。

编程原理 篇7

单片机具有体积小、功耗低、控制功能强和使用方便等优点,广泛应用于工业控制、计算机通信、仪器仪表等领域,很多智能化产品都是在单片机的基础上增加相应功能模块而实现。彻底掌握单片机串行口通信原理及程序的编写,是单片机开发工作中基础而重要的工作,是每个单片机开发人员必须掌握的技能。

2 单片机串行口结构

80C51单片机串行接口是一个可编程的全双工串行通信接口,该接口通过管脚RXD(P3.0,串行数据接收端)和管脚TXD(P3.1,串行数据发送端)与外界通信,这个接口可以工作在异步通信方式(UART),与串行传送信息的外部设备相连接,其内部结构如图1所示。

SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器,数据长度为一个字节。它们有相同名字和地址空间,但不会出现冲突,因为它们两个中一个只能被CPU读出数据,一个只能被CPU写入数据。在单片机编程实现上,只需要读写SBUF寄存器,就可以完成串口数据的读取和写入,从而实现单片机与外部设备间的通信,不过,在SBUF与串行口通信顺利工作起来之前,还必须初始化一系列的寄存器,以控制通信过程。

3 相关寄存器

80C51串行口通信的控制主要涉及SBUF、SCON、TH1、TL1、TCON、TMOD、IE共7个寄存器的操作,只要通过编程实现对这7个寄存器的操作,便可以控制单片机的串口通信,让单机要求与其他设备进行通信。

SCON是串行口控制寄存器,是一个具有位寻址能力的一字节(8位)长度的寄存器,用于设置串行口的工作模式,该寄存器同时包含了串行口发送和接收状态的控制位,SCON的格式和位定义如下:

SM0、SM1两个位共有4种组合,该4种组合分别定义了串行口的4种工作模式,4种模式与SM0、SM1的对应关系及功能说明如表1所示。

80C51单片机与外部功能模块的串行口通信,一般使用工作模式1,波特率的大小则根据单片机定时器1(T1)的计数溢出频率有关,T1的计数溢出同时跟单片机晶振频率和计数器的设置有关。

SM2是多机通信控制位。在模式0中,SM2必须设置0;在模式1中,若SM2=1,则只有收到有效停止位时才会激活RI。在模式2、3中,若SM2=1,当收到的第9位数据位(RB8)为1时,将收到的8位数据送入SBUF,RI置1,产生中断请求;若SM2=0,则不论RB8位为0还是1,都将收到的8位数据送入SBUF,并产生中断。

REN为串行口接收允许位,由软件置位则允许接收,由软件清0将禁止接收。TB8、RB8是模式2、3中发送、接收的第9位数据,既可用于奇偶校验又可用于多机通信。TI、RI是发送、接收中断标志位,提示发送、接收完成一帧数据,这两个位都需要软件清0。

TH1、TL1、TCON、TMOD四个寄存器是操作定时/计数器相关的寄存器,80C51单片机就是通过设置T1的溢出速率来确定串口通信的可变波特率。T1的工作方式有4种,可通过对TMOD寄存器的高4位编程设置T1工作参数(低4位用于设置T0),TMOD不能进行位寻址,其格式和定义如下:

GATE是门控制位,当GATE=0时,只要对应的控制位TR1置1,即可启动定时器1(T1)开始工作;当GATE=0时,除需要将TR1置1外,还需要使INT1引脚为高电平时,才能启动定时器1(T1)开始工作。C/T是功能选择位,当C/T=0时,为定时器方式,当C/T=1时,为计数器方式。M1和M0是定时器工作方式选择位,共有4种组合,分别用于设定4种工作方式,如表2所示。

TCON是定时/计数器控制寄存器,可以控制定T0、T1的启动、停止,以及标志溢出和中断,TCON与SCON一样,是一个具有位寻址能力的一字节(8位)长度的寄存器,其各位的名称如下:

TF1是定时器1溢出标志,当定时器1计数满溢出时,由硬件置1,并且申请中断,进入中断服务程序后,由硬件自动清0。TR1是定时器1运行控制位,当TR1=1时,启动定时器1工作,当TR1=0时,关闭定时器1。IE1是外部沿触发中断请求标志,IT1是外部中断1的类型控制,该两个位与串口通信无关。对应的TF0、TR0、IE0、IT0用于设置定时器0(T0),功能与定时器1(T1)相当。

串行口通信要求设置T1定时器工作在自动再装入8位计数器方式(方式3),此时,TL1用于计数器溢出,TH1用于保持初值,当TL1计数溢出时,硬件自动置位TF1,并将TH1中的值再装入TL1,继续计数,重复循环不止。这种工作方式可省去用户软件重装常数的程序,并可产生相当精确的定时时间,特别适用于作串行口波特率发生器。

在了解串口相关寄存器SBUF、SCON以及定时器寄存器TH1、TL1、TCON、TMOD后,已经可以使用查询方式,完成串行口通信程序,但使用中断技术可以让程序设计更合理、更高效,因此,还需要再了解一下中断允许控制寄存器IE,IE与SCON、TCON一样,同样是一个具有位寻址能力的一字节(8位)长度的寄存器,其各位的名称如下:

EA是中断允许总控制位,当EA=0,CPU屏蔽所有的中断要求,当EA=1时,CPU开放中断,但每个中断是否允许,分别由各自的允许位进行设置。其中ES位是串行口中断控制位,当ES=1时,允许串行口中断,当ES=0时,关闭串行口中断。

4 实现代码

在了解串口寄存器、定时器寄存器、中断寄存器的寄存器功能后,现在可以开始使用单片机C语言编写串行口通信程序。

以下程序段依次对串行口控制寄存器、定时/计数器1相关寄存器、中断寄存器进行初始化设置。

SM0=0;//设置串行口控制寄存器(SCON)的SM0、//SM1位

SM1=1;//使串行口工作在模式一,即8位UART

REN=1;//设置串行口控制寄存器(SCON)的REN//位,允许串行口接收数据

TMOD=0x20;//设置定时器1为工作方式2(自动再装//入8位计数器)

TH1=0x FD;//设置再装入值为0x FD,假设11.059M晶//振,波特率为9600

TL1=0x FD;//为TL1计数器设置初值

TR1=1;//设置定时/计数器控制寄存器(TCON)的TR1//位,以启动定时器1

EA=1;//开启CPU总中断

ES=1;//开启串行口中断

以下程序段是串行口中断函数,进入中断后,首先判断是不是接收中断,如果是先清0接收中断标志位,再将串口收到的一字节保存到全局变量a,同时设置接收标记。

摘要:介绍了80C51单片机串行口通信的原理及编程控制,详细解析了串行口通信所使用的串行口控制寄存器、定时器相关寄存器、中断控制寄存器,并以C语言为例,讲解了串行口通信程序的编写方法。

关键词:单片机,串行口,单片机编程

参考文献

[1]张迎新,等.单片机原理及应用.北京:电子工业出版社,2009.

本文来自 古文书网(www.gwbook.cn),转载请保留网址和出处

相关文章:

时间编程01-04

编程过程01-04

编程应用01-04

编程计算01-04

编程能力01-04

高级编程01-04

嵌入编程01-04

编程处理01-04

编程游戏01-04

编程论文题目01-04

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:时间编程 下一篇:高级编程