第
11
卷 第
2009
年
11
期
11
月
Electronic Component & Device Applications
Vol.11 No.11
Nov. 2009
doi:10.3969/j.issn.1563-4795.2009.11.005
基于STC89C51单片机的数字电压表设计
胡卓敏, 王丽娟
(中北大学信息与通信工程学院, 山西 太原 030051)
摘 要: 介绍了一种基于STC89C51单片机的数字电压表的设计方法。 该方案根据数据采集的
工作原理来实现数字电压的测量, 然后完成单片机与PC的通信, 以将所测量的电压值通过串
口传送给PC, 并在PC上进行显示。
关键词: 数字电压表; ATC89C51; 单片机; AD0809
0 引言
,
,
数字电压表的设计和开发已有很多类型和款
传统的数字电压表有自己的特点
它们适合
而要完成远程测量并对测量
运用传统的数字电压表是
通信的数
又
这种类型
都具有
这使得它的开
式
在现场做手工测量
,
的数据做进一步处理
无法完成的
字电压表
可借助
,
的数字电压表无论在功能和实际应用上
传统数字电压表无法比拟的优点
发和应用都具有良好的前景
。
该表既可以完成测量数据的传递
,
进行测量数据的处理
,
本文设计了基于
所以
为此
PC
PC
,
,
。
,
,
。
1 系统构成
,
。
8
,
图
片内有
即没有用任何附加逻辑器件做接口电路
现单片机对
是
ADC0809
位的模数转化芯片
转换芯片的操作
ADC0809
选通开关以及相应的通道锁存译码电路
间大约为
定
后
的 数 据 通 道
信 号 由 高 到 低
便可实
中 的
1
路模拟
转化时
,
首先要指
当 外 部 电 压 进 入 芯 片
在 脉 冲 的 下 降 沿
表
,
的电
电平变低
管脚
,
转化完成之后
,
同时管脚
在电路应用中
开始转换
, STATR
ADC0809
100 μs
左右
EOC
8
。
,
,
ADC0809
示转化正在进行
平变高
,
,
表示一次转化结束
。
,
EOC
本系统主要由硬件和软件两部分构成
,
,
硬件
单片机最小数据采集系
软件主要有单
单片机与上位机通信程序
。
机的接口电路等
,
单片机与
主要包括数据采集电路
统
片机数据采集程序
以及上位机数据处理程序
PC
,
。
2 数据采集电路原理
该新型数字电压表测量的电压类型为直流
,
下 位 机 采 用 的 单 片 机 为
测 量 范 围 为
0 ~5 V,
转化采用的是最常见的
STC89C51, AD
串行口与
可通过
测量的直流电压数据
的数据采集电路
ADC0809,
以传送所
所示是该数字电压表
电路的设计已做到了最小化
机进行通信
PC
图
RS232
1
,
。
。
收稿日期:2009-06-05
14
2009.11 www.ecda.cn
,
,
图1 数字电压表的数据采集电路
3 软件编程
上位机可视化界面程序
本系统的软件程序主要包括下位机数据采集
机的
上位机操
在串
工
,
串口调试助手
单片机与
编程
进行可视化编程
单片机可采用
就可以借助
,
这样
VC++6.0
C51
PC
、
,
“
并有效利用这个工具提高
,
”
整个系统效率
。
、
程序
串口通信等
作可采用
口调试的时候
具
,
,
。
3.1 单片机编程
单 片 机 在 这 个 系 统 中 所 起 的 作 用是 控 制
并将转化的数据通过串
进行数据转化
ADC0809
,
第
11
卷 第
2009
年
11
期
11
月
新特器件应用
Vol.11 No.11
Nov. 2009
口发送到上位机上
力不是很强
所以
,
。
,
机上
PC
行处理
,
再利用
最后得出想要的结果
PC
,
需要外接时钟信号
因为单片机做数据处理的能
将所采集的数据转化量送到
机强大的数据处 理 能 力 来 进
的
这
也
为了设计的
,
口来提供时钟
500 kHz),
ADC0809
一般接
因为
T0
。
,
(
CLOCK
个时钟信号频率可以用标准的振荡电路产生
可以用单片机自带的
最小化
信号
本设计采用的是自带的
,
其程序如下
口产生
或
T1
T0
。
:
#include
#include
#define uchar unsigned char
sbit clk=P3^4;
sbit start=P3^6;
sbit eoc=P3^3;
sbit oe=P3^7;
uchar temp;
void send (uchar ch)
{
}
SBUF=ch;
while (! TI) ;
TI=0;
void inituart ( )
{
}
TMOD=0x21;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
void main ()
{
inituart ( ) ;
EA=1;
ET0=1;
TH0= (65536-1) /256;
TL0= (65536-1) %256;
TR0=1;
start=0;
while (1)
{
start=1;
start=0;
while (! eoc) ;
oe=1;
P1=0xff;
temp=P1;
if (RI==1)
{
RI=0;
If (SBUF=0xfd)
send (temp) ;
}
}
}
void inter_T0 ()
interrupt 1
{
TH0= (65536-2) /256;
TL0= (65536-2) %256;
clk=~clk;
}
3.2 上位机编程
上位机采用
位机的通信功能
的编程语言工具
下位机的通信
设置
所以
。 VC++
VC++6.0
实现可视化界面及与下
操作系统
是基于
函数来直接实现与
,
但是这种方法要涉及到很多低层
Windows
可采用
API
,
本文采用 的 是
,
技术来实现串口通信
,
Microsoft
Ac-
即应用程序直接使用
推 出 的
tiveX
ActiveX
控件提供的接口来访问
,
ActiveX
控件
以 下 简 称
。
Microsoft Communications Control (
是
公 司 提 供 的 可 在 简 化
。
,
,
控件
ActiveX
Microsoft
MSComm)
(Event2driven)
下串行通信编程的
Win-
它为应用
dows
程序提供了通过串行接口收发数据的简便方法
它提供了两种处理通信问题的方法
具体来说
:
二是查询方
一是事件驱动
这种方法适合于
法
较小的应用程序
每当应用程序
执行完某一串行口操作后
控件的
属性
,
检查某一事件是否发生
是自成一体
MSComm
,
以便检查执行结果或者
如果应用程序较小而且
故对本设计
本设计采用的是查询方法
,
在这种情况下
这种方法可能更可取
将不断检查
CommEvent
方法
,
。
。
。
,
,
。
www.ecda.cn 2009.11
15
第
11
卷 第
2009
年
11
期
11
月
Electronic Component & Device Applications
Vol.11 No.11
Nov. 2009
更为可取
中首要的几个如表
。 MSComm
控件有许多重要的属性
所列
1
。
其
,
{ VARIANT variant_inp;
COleSafeArray safearray_inp;
表1 MSComm控件的属性
说明
设置
设置
打开
/
/
/
获取控件对应的串行口
获取波特率
、
关闭通信口
校验方式
、
、
读取数据
发送数据
数据位
、
停止位
属性
CommPort
Settings
PortOpen
Input
Output
LONG len, k;
BYTE rxdata [1024] ; //
CString strtemp;
设置字节数组
if (m_mscomm.GetCommEvent () ==2) //
表示接收到数据
2
{ variant_inp=m_mscomm.GetInput () ;//
读缓冲区
事件值为
为文本
, 1
为二进制
safearray_inp=variant_inp;
InputMode
接受数据类型
: 0
在对上位机编程时
话框的应用程序
对 话 框 资 源 上 放 一 个 编 辑 框
然后插入
,
,
应首先创建一个基于对
可在
控件
MSComm
,
显示电压值
再放两个 按 钮 控 件
,
IDC_TEST)
CEIVE)
测量
做对话框模板
,
增加成员变量
m_mscomm
和停止测量
鼠标点击右键
将
设 定 为
,
IDC_MSCOMM1
(ID_STOP)。
选择
,
CMSComm
关联成员变量
( IDC_EDIT_RE-
开 始
然后再
[
控 件 类 型
Classwizard,
关联成员变量
但
,
不是
之后分别对两个
这可在
m_receive
,
(float)。
控件添加消息响应函数
WM_TIMER
上 添 加
消 息
。
可 在
OnTimer
( UINT nIDEvent)
CByteArray bytoutArr;
bytoutArr.Add (0xfd) ;m_mscomm.SetOutput (COle-
采用二进制方式发送数据
下 位 机 只 有 在 接 收 到
这也相当于一
Variant (bytoutArr)) ; (
发 送 一 次
后才会将转化的数据传回来
0xfd, 500 ms
,
,
0xfd
个简单的通信协议
。
数据的接收处理
可通过
控件的消息响应函数中采用查询方式
也是本文的重点
(
)
MSComm
在
检查接收事件是否发生来完成
具体代码如下
:
。
void CCTestVotDlg::OnOnCommMscomm1 ()
16
2009.11 www.ecda.cn
IDC_EDIT_RECEIVE
控件类型
按钮和
是数值类型
,
MSComm
下自动添加
。
,
Classwizard
添加代码时
这可以在
口
性
,
的是
位数据位
COM1
OnInitDialog
波特率为
,
位停止位
, 1
,
在开始测量按钮的
Timer (1, 500, NULL)
发一次定时器事件
函数下添加
器事件
,
KillTimer (1) ;
。
接 着 是 添 加
要首先设置
MSComm
函数中添加
。
控件的属
本文采用
无奇偶校验位
9600,
用二进制方式收发数据
, 8
。
Set-
触
函数下添加
OnTest ()
开 启 定 时 器 每
并在停止测量按钮
;
500 ms
OnStop ()
按钮的作用是停止定时
len=safearray_inp.GetOneDimSize ()
的数据长度
for (k=0;k