根据电路,我们要设计一个程序,从串行A-D转换芯片读取电压值,在P0口的8个发光二极管显示出来。请看以下程序:
为了简化变量定义,在一开始将uchar定义为unsigned char。下面有一个新的变量类型bdata,它可以按位处理,如按位赋值、移位等。并将某一位与另一变量联系起来,即sbit ADbit=ADCdata^0,这样,ADbit就等于ADCdata的第一位,给ADbit赋值就是给ADCdata的第一位赋值。
然后,分别定义了单片机与串行A-D转换芯片连接的3个引脚SDO(DAT)、SCLK(CLK)和CS(CS)。
A-D转换子程序就是将串行模式转换的值读出来,这里就是要把8个串行的值变成并行的8位数。在读取的时候,要用时钟信号和片选信号控制串行模式转换芯片工作。在一开始时钟和片选信号均为0,结束后均为1。在每次循环中时钟信号要从1到0变化一次。
串行变成并行的方法是:每次把信号读入到变量的第1位,然后左移一位,共循环8次,就把8个串行值变成一个8位数了。
主程序中循环体很简单:读取A-D转换值、求反后送P0口显示、延时。为什么要求反后再显示呢?因为发光二极管0发光,1关闭,它是倒着显示的,求反后正好符合我们的要求。(www.xing528.com)
可以把发光二极管改成数码管,只要将数码管的显示程序加进来就行了。
这个程序将发个二极管显示改为数码管显示,更加直观。程序中将8位的A-D转换值在转换成电压值,其公式为out=AD_DATA∗5∗1000/256,8位A-D转换的分辨率是2n即256,这里电压最大值是5V,因此,转换的电压是AD_DATA∗5/256,再乘上1000是为了在4位数码管显示,需要扩大1000倍。这样,千位显示的是0~5V,其他是小数位。需要注意的是,我们将AD_DATA定义为浮点数float,是因为运算以后有小数产生,若定义为整数,则小数部分将不能取出而发生错误。数码管的接线采用总线连接的方法,读者若不清楚如何连接总线,可参考第4讲内容。图12-3所示为仿真运行的结果。
图12-3 用数码管代替发光二极管显示电压
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。