APP下载

一种基于89C51控制的数字电压系统的设计

2020-05-12梁建华

商丘师范学院学报 2020年6期
关键词:电压表单片机电路

梁建华

(临汾职业技术学院,山西 临汾 041000)

随着电子技术的发展,各类高精度测量仪表随之诞生.在电子产品运用与维修时,电压的测量是一项常规性操作,通常使用电压表或万用表来进行测量,而它们均为指针式仪表,测量时因档位选择不当、摆放位置不同及读数姿势等因素都会造成读数不准确,测量精确度不高,不能满足数字智能化时代的要求.文中提出的数字电压系统以单片机AT89C51为主控器,通过A/D转换电路将模拟量转换为数字量,由LCD显示电路显示测量结果,具有操作方便,精度高,抗干扰能力强,可扩展性强及集成方便等优点,在智能化测量领域具有良好应用前景.

1 系统总体设计

该系统采用模块化设计方法,以单片机为主控器,LCD显示电路及A/D转换电路组成数字电压表控制系统,通过可调电位器调节电压表来模拟电压的输入,经AT89C51单片机控制电路完成对外围硬件控制及运算,然后进行A/D转换[1]出数字量,即为输出电压值,最后由LCD显示.

2 系统硬件设计

数字电压系统电路有主控模块电路、LCD显示模块电路及A/D转换模块电路组成,其接口电路原理图如下:

图1 数字电压系统接口电路原理

2.1 主控模块电路

该主控模块电路由AT89C51控制器、电源电路、复位电路及时钟电路组成单片机的最小系统,采用电源电压为5 V,选用振荡器频率为11.0592 MHz的石英晶体,通过按键电平复位方式进行复位操作.

2.2 LCD显示模块电路

显示模块电路选用LCD1602[2]字符型模块,内部控制器为日立公司生产的HD44780,可用来显示数字及字符.其外部引脚一般有16条,8条数据线 D0-D7与单片机P0口相连,3条控制线RS、RW、E分别与单片机P2.0、P2.1和P2.2相连.

2.3 A/D转换模块电路

A/D转换模块由A/D芯片和可调电位器组成,A/D芯片选用TLC549芯片,共有8个引脚(4、8引脚为接地和电源输入,2脚AIN连接可调电位器RP2的滑动端,1脚REF(+)、3脚REF(-)为参考电压输入分别接+5 V电源及地端,5脚CS为片选信号与单片机的RD引脚相连,7脚I/O CLK为时钟信号与单片机的T1引脚相连,6脚DOUT为转换后的串行数据输出与单片机的WR引脚相连),其具有8位转换结果、用CMOS技术、差分基准电压输入、低功耗及5 V供电范围等特点.

3 系统软件设计

3.1 算法设计思路

通过可调电位器RP2改变电压输出值在0~5 V内连续变化,从而可以模拟模拟量的变化.依据A/D转换芯片工作时序,利用定时器0定时5 ms,设置计数器累计4次,定时器0产生中断,也就是20 ms进行一次A/D采样转换,然后调用A/D转换值函数将值转换为对应的ASCII值,最后通过LCD显示A/D转换值函数把转换的数字量显示在LCD1602上,显示范围为0~255.

3.2 数据结构[3]设计

数字电压表系统的数据结构设计如表1所示:

表1 数字电压表系统的数据结构

3.3 程序设计过程

3.3.1 主函数设计

主函数模块主要完成硬件初始化、定时器[4]初值计算、定时器设置及函数调用等功能,其程序如下:

void main()

{

keytime=4;

InitLcd();

SendCommandByte(0x80);

Delay(2);

SendDataByte(‘A’);

SendDataByte(‘B’);

SendDataByte(‘C’);

SendDataByte(‘:’);

TH0=0Xee;

TL0=0X00;

TMOD=0X01;

TR0=1;

IE=0X82;

while(1);

}

3.3.2 定时器0中断服务函数设计

设置软计数变量keytime为4,定时器T0定时5 ms后,进入定时器T0中断服务函数,软计数量keytime减1,当keytime值为0时则表明20 ms时间已到并进行采样一次;否则T0中断函数返回主函数,继续计时.实现程序如下:

Void time0(void) interrupt 1

{

TH0=0xee;

TL0=0x00;

keytime--;

If(keytime==0)

{

read_549();

jsdpbl();

dispdpbl();

}

}

3.3.3 A/D采样转换函数设计

2)由于钻井垂直度是顺利下人套管柱的重要条件之一,所以为了保证井眼的垂直度,在钻进过程中采取了以下措施:

根据A/D转换芯片TLC549的工作时序,要求片选信号CS置低电平,内部电路在测得CS下降沿后,再等待两个时内部时钟上升沿和一个下降沿后,才能进行A/D转换.其程序编码如下:

void read_549(viod)

{

unsigned char i;

AD_CS=0;

adbl=0x00;

for(i=0;i<8;i++)

{

AD_CK=1;

adbl=adbl<<1;

if(AD_OUT==1)

adbl++;

AD_CK=0;

}

AD_CS=1;

}

3.3.4 A/D值转换ASCII码函数设计

若要在LCD上显示A/D转换值adbl,则需要把它转换成对应的ASCII码,其实现函数如下:

void jsdpbl(void)

{

ledbai=(adbl/100)|0x30;

ledshi=((adbl%100)/10)|0x30;

ledge=(adbl%10)|0x30;

}

3.3.5 LCD1602显示函数设计

LCD显示函数模块包括LCD初始化函数、写入指令数据到LCD函数、写入显示数据到LCD函数、LCD显示A/D转换值函数及延时函数.

void InitLcd() //LCD初始化函数

{

SendCommandByte(0x30);

SendCommandByte(0x30);

SendCommandByte(0x30);

SendCommandByte(0x38);

SendCommandByte(0x08);

SendCommandByte(0x01);

SendCommandByte(0x06);

SendCommandByte(0x0c);

}

void SendCommandByte(unsigned char ch) //写入指令数据到LCD函数

{

RS=0;

RW=0;

P0=ch;

E=1;

Delay(1);

E=0;

Delay(100);

}

void SendDataByte(unsigned char ch) //写入显示数据到LCD函数

{

RS=1;

RW=0;

P0=ch;

E=1;

Delay(1);

E=0;

Delay(100);

}

void dispbpbl(void) // LCD显示A/D转换值函数

{

SendCommandByte(0x85);

SendDataByte(ledbai);

SendDataByte(ledshi);

SendDataByte(ledge);

}

void Delay(unsigned int t) //延时函数40 μs

{for(;t!=0;t--);}

4 结束语

该控制数字电压系统总体设计采用模块化方法,分析各硬件电路,列出数据结构表,设计出相应的算法,并编写出各模块程序代码,进行统一调试,然后对比系统在不同模拟输入量时,通过LCD显示输出电压值的情况,可达到预期效果.且它采用单片机控制,具有电路简单,精度高,可扩展性强及集成方便等优点,它将在智能化测量领域发挥更大作用.

猜你喜欢

电压表单片机电路
电路的保护
如何判断电压表的测量对象
判断电压表测量对象有妙招
基于单片机的SPWM控制逆变器的设计与实现
解读电路
基于单片机的层次渐变暖灯的研究
基于单片机的多功能智能插排
基于单片机的便捷式LCF测量仪
巧用立创EDA软件和Altium Designer软件设计电路
基于MATLAB模拟混沌电路