基于8051+ADC0809
数字电压表的汇编实现
作者:HeChaoyang 日期:2007年5月17日
说明:本文仅讨论“基于8051+ADC0809设计的数字电压表”的软件实现部分,硬件连接较简单,可参阅单片机基础
或实验指导教材。对51单片机初学者的学习有一定的参考价值和指导意义。
题目如下:
用ADC0809,LED数码管等器件,自行设计一数字电压表(精确到 1/100),电压值在LED上显示效果如下图:
即为用8位AD采样0-5V电压(AD的参考电压为5V),并要在51单片机中直接显示相应的电压值,显示值为十进制,两位小数。
经过各方面资料的搜集,和与Lammy同学的讨论,我整理出了两套实现
。
方案一:将5扩大100倍即500,这样要两个字节存储这个参考电压值,再用得到的采样值(一字节)乘以500得到一个3字节的值(调用一个2字节乘1字节的子程序实现),再除以阶数值即得到实际信号电压扩大100倍后的整数值,再转换成BCD码形式,显示时将其第一位显示小数点即可。小数点问题的解决办法:(1)做两张表,一张带小数点,一张不带小数点。(2)只有一张不带小数点的表,第一位显示小数点之前,将字型的值补上与带小数点的差值(减去80H),再送显示。
源代码编写中,需要调用到“三字节二进制无符号数除以单字节二进制数”和“调用2字节乘1字节的子程序”的子程序,我自己试着编写这两个程序,其中乘法子程序我比较熟悉,老师上课也有讲到。但除法一点思路也没有,上网搜索了下,发现了这样一份相当实用的资料《,,,,,,单片机实用子程序库(,,年版)》周航慈,其中包括非常多的工程实践中需要用到的汇编子程序,工程实践中可以直接调用。
方案二:根据要显示的电压值计算式V=A/255*5,扩大100倍后,直接计算出500/255的数值为0.0196,首先要考虑是选择0.019还是0.02还是0.0196与A相乘。如果以0.019与A相乘,当A为255时,0.019×A=4.845,与5.00相差太远,误差较大;如果选择0.02,0.02×255=5.10,同样有太大误差,为了避免太大的误差,可以考虑选择0.0196作为参数(0.0196×255=4.9980)。以196与A相乘,最大的结果为196×255=49980可以用两个字节表示结果,故需要调用“一个字节与一个字节相乘结果为两个字节的程序”,然后根据得到的两个字节的结果进行十进制转换。双字节16进制转换为BCD码可以参考资料《,,,,,,单片机实用子程序库(,,年版)》周航慈。最后根据BCD数的倒数第二位以四舍五入的原则去掉后两位数据,将前三位送显示。
以上两个方案是我对这个问题的分析,可能有更好的实现方案,欢迎有着丰富单片机编程经验的牛人指导。
源代码会在实验调试成功后附上。