一种基于89C51控制的数字电压系统的设计
2020-05-12梁建华
梁建华
(临汾职业技术学院,山西 临汾 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显示输出电压值的情况,可达到预期效果.且它采用单片机控制,具有电路简单,精度高,可扩展性强及集成方便等优点,它将在智能化测量领域发挥更大作用.