文档介绍:722005110KeilC51对同一端口的连续读取方法■北京理工大学李大国张庆明C语言是当前举世公认的高效简洁而又非常贴近硬件的编程语言之一。将C语言向单片机MCS51上的移植始于20世纪80年代的中后期,经过近10年的发展,C语言克服了产生代码过长、运行速度较慢的缺点,并且由于C语言在开发速度、软件质量、结构化、可维护性等方面有着汇编语言无法比拟的优势,从而得到日益广泛的应用。KeilC51是德国Keil公司开发的单片机C语言编译系统,该软件功能完备,是目前国内技术开发人员使用最为广泛的语言之一。图1简单示意图在实际工作中发现,用C语言编写的对同一端口进行连续读取的程序,经KeilC51编译后执行结果往往会出错,现以8051单片机读取12位A/DMAX197为例,如图1所示。图1中,,。现假定A/D的地址为8000H,启动CH0端口工作字为40H。为得到相应的高、低位转换数据,用C语言编程如下。#include<>unsignedcharxdataMAX197_at_0x8000;sbitMAXINT=P1^1;sbitMAXHBEN=P1^0;??voidmain(){unsignedcharup4,down8;//设置接收数据的2个变量??MAX197=0X40;//启动A/DCH0口进行转换While(MAXINT)//等待转换完成{};=0;//读取低8位down8=MAX197;=1;//读取高4位up4=MAX197;??}上述的程序并没有如所希望的那样分别得到高、低位数据,实际上在down8和up4中得到的都是低8位的数据。下面是上段C语言经编译后的部分代码。41://取低8位42:MAXHBEN=0;C:290CLRMAXHBEN()43:down8=MAX197;C:0x000E908000MOVDPTR,#MAX197(0x8000)C:0x0011E0MOVXA,***@DPTR2005110Microcontrollers&EmbeddedSystems73C:0x0012F509MOV0x09,A44://取高4位45:MAXHBEN=1;C:0x0014D290SETBMAXHBEN()46:up4=MAX197;47:48:C:0x0016F508MOV0x08,A//0x08为up449:}通过分析上面的程序会发现,,而只是直接将上次读来的结果直接送给高4位变量。如果先读高位后读低位,结果会得到两个高4位数据。为证实这一点,将4条连续重复读取一个外部端口的C语言语句放在一起,编译后发现只有第一条语句被编译执行。也就是说,KeilC51对于连续重复读取同一个端口地址,在编译时进行了“特殊”处理,这一点是十分值得注意的。那么对于确实需要对同一端口进行连续读取的情况应该如何处理呢?下面介绍两种方法以供参考。第一种方法:加延时。延时不宜太长,特别是在对转换速度要求较高时。首先写一个延时函数:voiddelay(){unsignedchari;for(i=0,i<=1;i++);}然后将延时程序放在上面两次读取的中间位置。=0;/