



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机C语言环境延时程序设计 东北电力学院(132012) 盛文利摘 要:讨论运用C语言的单片机开发中,对于时序要求苛刻的延时的开发过程。实例说明在高级语言中,严格控制时序的可能性和注意事项。关键词:单片机 C语言 编译器 现在单片机的开发中,C语言以其方便、灵活、逻辑性强、易于维护和可移植性好等强大优势,占据了单片机开发的主要地位。过去,由于单片机C语言本身存在的缺陷,加之单片机工程本身都不大,C语言在单片机中的应用没有被重视。在C语言环境下,我们只需关心程序的逻辑关系,实现细节由编译器完成,这给我们快速开发提供了条件,也大大减小了开发工作量。但同时实现细节就不被控制了,这个问题对于经常重视实现细节的单片机,就必须得到解决。好在一般的C语言编译器都提供嵌入汇编、与汇编互调用和汇编级的代码察看等功能。现以KEIL C511下的一线总线器件程序开发为例,说明我的解决方法。1 一线总线协议器件一线总线协议(1 wire bus protocol)也叫做单总线协议,是单总线器件数据传输协议。因为数据(也可以包括电源)都由一条线来传输,没有辅助的数据同步信号,这时就只能由时序来解析协议内容。这样就只有依靠对时序的严格要求,来保障数据传输的准确性。单总线协议的信号主要有:初始化时序,包括复位脉冲和在线脉冲,是主机与器件的联络信号。然后是读、写时序。单总线器件完全依靠对线上的时序来做出响应,这些有效的时序称作时隙,也有称作时间片的,是同一词汇的不同翻译2。初始化时序时间裕度大,容易实现。读写脉冲对时序要求相对严格,尤其在慢速的MCS-51下,指令的运行在微妙级,而读写时序在15微秒的后小部分,大约4微秒,不同批次的芯片会有少许差距。有的会允许你的时序有少许误差,有的则非常严格。2 C语言编译器 在用汇编语言编写的程序时,很容易控制时间,因为我们知道每条语句的执行时间,每段宏的执行时间,每段子程序加调用语句所消耗的时间。在单片机的C语言开发中,C语言编译器都对标准C作了针对单片机特点的扩展。但对于不同的单片机,不同的C语言编译器在将源程序翻译成目标机器语言时,会有不同的编译方法,在生成目标代码时,会有所不同。开发人员必须研究它生成的汇编语言代码,来保证时间的准确性。这也许是除了使用嵌入汇编或直接编写汇编函数的唯一方法。其实在单片机的C编译器中,已经有足够的底层操作方面的扩展,所以这里只考虑纯C语言的方法。3. 延时程序设计我们以德国Keil公司的MCS-51C语言编译器为例,目前它已被公认为业界的标准。以下讨论均假设单片机时钟晶振为6兆的51芯片,以小模式下编译,这时MCS-51程序指令执行的最小单位是2微秒。如果使用非英特尔且内核优化过的单片机,应切换回普通模式,或仔细研究它的时序。以DS18B20为例,我们临时在程序中需要延时2微秒,那末可以用以下程序#include void somefunc(void) ;_nop_();如果要延时64微秒甚至640微妙,我们不可能在程序中重复上述_nop_(),虽然这并不会出错。可以利用它来构建延时程序,精确定时的问题就变为延时程序的精度问题。我们先讨论以上的空 操作延时。3.1 空操作延时及延时函数注意到DS18B20最小时隙除大于一微秒的外,最小的就是15微秒。而数据的读或写也包含在这15微秒中。由于定时器的延时要对定时器进行初始化,不易得到小的延时。只能用于复位脉冲,即在480至960微秒之间的延时,程序实现接近960微秒的延时;TH0 = -950/256;TL0 = -950%256;TMOD= TMOD|0x01TR0 = 1;定时器启后,单片机可以作其他事情,如复位看门狗,或LED扫描。而调用的短延时函数必需精确的受到控制,先作一个几微秒的延时实验程序,以观察它实际的延时时间,又因为我们在汇编时代常用的延时指令为MOV R7, DDLYDJNZ R7,$以便产生最小4微秒的延时,仿造的C程序如下void delay1(ndly)for(;ndly0;ndly-) ;生成的汇编代码却与DJNZ无关,是如下形式,其中无关的编译注释已删除RSEG ?PR?_delay1?DLY2_delay1:USING0?C0006:MOV A,R7 ;2usSETB C ;2usSUBB A,#00H ;2usJC ?C0009 ;2usDEC R7 ;2usSJMP ?C0006 ;4us?C0009:RET ;4us; END OF _delay1延时至少18微秒,无法用于读写时隙。改用如下程序void delay2(unsigned char vd) for (vd=0; vd10;vd+) ;生成的汇编代码如下RSEG ?PR?_delay2?DLY2_delay2:USING0CLR A ;2usMOV R7,A ;2us?C0002:INC R7 ;2usCJNE R7,#0AH,?C0002 ;4us?C0005:RET ;4us; END OF _delay2以上代码调用一次也有14微秒之多,还是无法使用。也就是说采用for形式的语句,生成的汇编代码都是先减,再比较,还是与DJNZ无关,也就不能产生短延时。3.2短延时程序编写首先想到的是用汇编语言函数,或嵌入汇编的方法,例如汇编语言函数实现NAMEDLY?PR?_delay3?DLY SEGMENT CODEPUBLIC_delay3RSEG ?PR?_delay3?DLY_delay3: DJNZ R7, $ ;4us RET ;4usEND或嵌入汇编的方法,void delay4(unsigned char vd)#pragma asm djnz R7, $ ; #pragma endasm编译后的形式?PR?_delay4?DLY SEGMENT CODE ?DT?_delay4?DLY SEGMENT DATA OVERLAYABLE PUBLIC_delay4RSEG ?DT?_delay4?DLY2?_delay4?BYTE:vd?040: DS 1RSEG ?PR?_delay4?DLY2_delay4:MOV vd?040,R7 ;2us djnz R7, $ ;RET ; END OF _delay4注意这里用于参数传递的R7,被复制保存起来了,这样在调用时,比汇编书写的函数多出2微秒。 除此之外,我们还是可以编出全C的类似函数void delay5(unsigned char vd) do vd-; while(vd);编译后RSEG ?PR?_delay5?DLY3_delay5:USING0?C0003:DJNZ R7,?C0003RET 看来DO_WHILE是和DJNZ相对应编译的。4 调用时间和某些细节除了直接插入_nop_()语句的短时间延时,在稍长的时间多变的延时程序中,往往需要调用上节讨论的延时函数来完成延时,其中以汇编语言函数和DO_WHILE最易控制,以为他们只有一条延时指令 DJNZ R7, $这时,一定注意在函数传递的参数(通过R7付值)要2微秒,调用函数时执行的LCALL语句的4微秒,在函数返回时,RET指令的4微秒,还要至少执行DJNZ指令(R7为0,djnz后R7=256)4微秒,所以至少为14微秒,这应该是函数调用延时的极限状态。另外还要注意对于连续调用的函数例如:; void delay 1(void); void delay2 (void); ;生成的汇编语言代码不是lcall delay1;lcall delay2;他被编译器优化,在调用delay1进入并执行该函数,返回前直接跳入delay2执行,类似于delay1:ljmp delay 2;由delay 2执行RET返回,这样连续调用两个函数时,就变成一次调用加跳转,结果会省去2微秒。解决了延时问题,再根据参考文献2,可写出读字节程序unsigned char read_byte(void) unsigned char i; unsigned char value = 0; for (i=0;i=1; /2us D0 = 0;/ pull DQ low to start timeslot _nop_(); /2us _nop_(); /2us _nop_(); /2usD0 = 1; / then return high _nop_(); /2us _nop_(); /2us if(D0) value|=0x80; _nop_(); /2us delay(10);/ wait for rest of timeslot return(value);写一字节的程序void write_byte(unsigned char val) unsigned char i; for (i=0; i1; delay(10) ; /because the write time must just fit for, D0 = 1; delay(2); 完整的18B20数据采集程序,再附件中,(可放在网上),其中包含了CRC校验。5 结论在现代竞争激烈的商品经济环境下,高级语言的运用大大提高了开发效率。在C等高级语言编写这类时间要求严格的程序时,分析最终的目标汇编代码是无法避免的。在现代带有集成开发环境的编译器中,有软件仿真,或是有硬件调试功能,都给精确定时程序的开发带来方便。充分发挥软件工具的潜力,才能真正在各种环境下发
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高级财务会计面试模拟题及实战策略解析
- 2025年食品工业仓储管理员招聘考试题库
- 2025年汽车维修工中级实操技能模拟题及答案
- 2025年初中美术特岗教师招聘考试重点难点解析与模拟题集
- 2025年建筑装饰设计师应聘模拟题和答案
- 【教案版】小学三班级上册 小篮球5
- 写字上下结构教学课件
- 2025年炼钢行业技术标准解读与高级考试重点解析
- 2025年物资储备仓库安全知识测试题库及答案
- 2025年游戏开发技术面试题及解析教程
- 第三课第三框法国大革命和拿破仑帝国课件
- JJF 2256-2025体重秤校准规范
- 2025至2030超高压电缆行业产业运行态势及投资规划深度研究报告
- (沪科版)八年级物理全一册《第一章运动的世界》单元测试卷含答案
- 2025保密标准培训
- ICU保护性约束护理
- 花园景观设计课件
- 破碎岗位安全管理制度
- 2025电气设计强条
- 2025年中国城市礼物发展白皮书
- 土方消纳处置合同协议书
评论
0/150
提交评论