最新新闻:

数字电压表课程设计程序「数字时钟程序设计」

时间:2023-04-02 16:13:04来源:搜狐

今天带来数字电压表课程设计程序「数字时钟程序设计」,关于数字电压表课程设计程序「数字时钟程序设计」很多人还不知道,现在让我们一起来看看吧!

5.6.4程序设计

硬件电路搭建完成后,需要程序配合才能实现电路的功能。本例中的单片机程序主要完成三个任务:(1)读取ADC0809的转换结果;(2)把采集到的数据转换为数码管的显示数值和格式;(3)控制LED数码管以动态扫描方式显示测量结果。下面围绕这三大功能直接给出完整的例程,读者须结合硬件电路、程序结构和注释加以理解。

图5.27 端口和变量定义

这里需要指出的是,数码管的字形编码并不是唯一的,从本质上看,需要根据硬件电路连接来决定,有时为了电路布局和布线方便不一定按字节的高位到低位与数码管的h、g、f、e、d、c、b、a顺序对应排列,如本例中P0.7~P0.0字节在硬件电路上对应数码管的g、c、g、d、e、b、f、a顺序,因此,字形编码要按这个对应关系来设计。举例来说,数字“2”在共阴数码管上各管脚的电平为:h=0,g=1,f=0,e=1,d=1,c=0,b=1,a=1,若按此顺序排列的编码为01011011(0x5B),但在这里代入P0.7~P0.0字节顺序为g=1,c=0,h=0,d=1,e=1,b=1,f=0,a=1,即P0字节编码为10011101(0x9D),可见不同的电路连接方式编码结果也有所不同,需要根据实际情况灵活运用。同理可得出数字0~9的编码分别为0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,而末尾的电压单位“U”的字形编码为0x5E。相应地,若要获得共阳数码管的编码,只要对上述共阴数码管的编码取反即可。

图5.28 A/D转换子程序

A/D转换的执行过程如下:单片机读取了上一次转换结果后,发出OE=0指令挂起数据线,避免接下来转换过程中产生的数据扰乱LED的显示;START引脚发送一个上升沿读取选择输入通道地址,这里虽然输入通道固定为IN0,但每次执行转换前必须明确告知内部转换器当前要使用的通道是哪一条,然后START引脚发送一个下降沿即启动A/D转换,此时,ADC0809内部的转换器开始对输入电压进行逐次逼近比较,在未完成转换之前,ADC0809的EOC引脚为低电平,while(EOC==0)控制单片机等待直到转换结束,EOC被置1后退出等待状态,接下来执行OE=1指令,读出转换结果,返回主程序,就可以执行更新显示了。

图5.29 延时子程序和数据处理子程序

延时子程序主要用于在后面的动态扫描显示过程中调节扫描速度。单片机从ADC0809读得的数据是一个8位的二进制数(一个字节),需要把它转换为实际要显示的电压值,由于最大检测电压为5.00V,对应的ADC0809输出的结果为255(二进制数11111111),转换比为

(5-6)

假设实际电压值为VA,ADC0809输出的转换结果为VD,则有

(5-7)

在动态扫描显示的控制过程中,每一位数字和末尾的单位“U”都是分时显示的,因此需要把上述要显示的电压值VA每一位的数字分离出来,这里由于小数点的位置是固定的(因为只有一位整数位,小数点固定在其后),因此,为了方便处理,暂且忽略小数点,即把VA扩大100倍(程序中用表示),然后用除法取整、求余运算把要显示的个位、十分位和百分位的数字分离出来,保存到显示缓冲区(dis[]数组)中备用。

图5.30 数码管动态扫描显示子程序

动态扫描显示子程序从数码管左边第一位起依次从缓冲区中要显示的数字放到LED数码管的数据线上,并使能该位置上的数码管,如此不断循环即可实现动态显示。这里有几点要注意:(1)每一位的显示间隔之间必须加入一个消隐指令,避免显示内容混叠;(2)加入延时调节扫描速度达到稳定显示的效果;(3)显示内容随A/D转换结果变化;(4)小数点固定不变。

图5.31 主程序

由于A/D转换速度很快,这里使用STC89C51的ALE/PROM引脚输出作为转换过程的控制时钟,其频率为系统频率的1/6,即2MHz,因此完成一次转换的时间只有数十微秒左右,而输入电压或多或少会有一点轻微的波动,为了减小显示结果的变化过于频繁,这里人为地降低敏感度,即每转换20次取一次平均值作为最后显示的结果,实际上这也是一种利用软件(程序)实现滤波的方法。

5.6.5测试结果与分析

程序编写、编译成功后,通过STC的USB下载器下载到单片机,就可以上电测试,实物测试效果如图5.32所示。

图5.32 测试效果

1. 测试结果

使用5V输出的USB手机充电器作为供电电源,对连续变化的直流输入电压进行测试,结果如下:

本方案设计的数字电压表显示结果稳定,测试中百分位偶有0.01V的波动,这是因为A/D转换数字化过程中有效数字的舍入造成的正常现象,但假如出现波动范围很大的情况则表明被测电压不稳定,可以通过强化ADC0809输入端的滤波(包括硬件和软件滤波)加以改善。

通过微调被测电压实测分辨率小于等于0.02V,达到设计指标的要求。百分位有时出现奇数,有时出现偶数,属于正常现象,这是因为量程为5.00V,8位A/D转换时被分为255等份(每一份约为0.0196V),而不是256等份(每一份为0.02V),故数字化时按0.0196V的倍数变化,4舍5入后百分位就有可能是奇数或偶数。

使用手持式数字万用表进行对照测试,测试结果一致。

2. 改进和优化建议

(1) ADC0809是多通道的ADC器件,功能未被充分利用,为节省成本和减小体积,可选用ADC0832(8位串行输出的ADC芯片),这样还可以大大减少对单片机的端口数量的需求。

(2) 可以选择内置ADC功能单片机,从而省去外部ADC芯片,简化外围电路,节约硬件成本。有的单片机还提供10位ADC的功能,这样更可以进一步提高测量精度。

(3) 实测中发现LED数码管的亮度偏高,通过三极管基极电阻调节效果不明显(三极管具有很大的放大倍数,容易饱和),因此可在集电极串联电阻直接调节数码管的电流。

(4) 参考电压范围不一定取为5.00V,选择适当的参考电压可以提高测量精度。例如:对于8位ADC而言,当参考电压范围为2.55V时,划分255级则每一级电压精确到0.01V;而对于10位ADC而言,若参考电压范围为10.24V,划分1024级则每一级也精确到0.01V。由此可见,分辨率不仅取决于ADC芯片的位数,还跟参考电压有关。此外,为了扩大测量范围,可以对输入的被测电压进行比例采样,例如,如果对输入被测电压进行1/2分压,则量程可扩大2倍,但要注意此时分辨率也相应降低了一半。

声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。

图文推荐

热点排行

精彩文章