基于单片机的简易数字电流表设计.docx
- 文档编号:11531554
- 上传时间:2023-03-18
- 格式:DOCX
- 页数:15
- 大小:191.85KB
基于单片机的简易数字电流表设计.docx
《基于单片机的简易数字电流表设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的简易数字电流表设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于单片机的简易数字电流表设计
课程设计
题目简易数字电流表
二级学院电子信息与自动化学院
专业自动化
班级109070101、109070102
学生姓名
学号指导教师万文略
考核项目
设计50分
平时成绩20分
答辩30分
设计质量20分
创新设计15分
报告质量15分
熟练程度20分
个人素质10分
得分
总分
考核等级
教师签名
3.电路工作原理5
4.电路图6
5元件清单8
6.程序流程图9
7.源程序代码10
8.调试14
9.总结15
参考文献15
基于单片机的简易数字电流表设计
摘要
所谓数字电流表就是能将测得的模拟电流量经过A/D转换转变为数字量,并在液晶显示屏上直接显示电流读数的电流表,相比针式电流表有着测量数据准确明了,读数精度高的特点,类似数字式万用表,有着相当的实用性。
本次电流表设计主要由电流信号采样电路、A/D(ADC0804)转换电路以及LCD显示电路组成,其中采样电路包括0.1欧姆的采样电阻和100倍的差分放大电路,以及由芯片MC34063组成的反向电路(给运算放放大器提供-5V电压)。
本次设计的电流表可直接检测带有负载的回路中的电流0-200Ma,超过200Ma时电路上的红色报警灯会亮,且在实际电路中示数与标准电流值基本相等,有时略有偏差。
关键词:
数字电流表,电流采样,ADC0804,单片机
1.概述
1.1设计意义
通过课程设计,掌握电子设计的一般步骤和方法,锻炼分析问题解决问题的能力,学会如何查找所需资料,同时复习以前所学知识并加深记忆,为毕业设计打好基础,也为以后工作作准备。
通过对选题的分析设计,学习数字电流表的工作原理、组成和特性;掌握数字电流表的校准方法和使用方法;学会分流电路的连接和计算;了解过压过流保护电路的功用。
1.2系统主要功能
A、利用AD转换芯片和精密电阻测量0~200mA电流
B、系统工作符合一般数字电流表要求
2.硬件电路设计方案及描述
2.1设计方案
本次电流表设计主要由电流信号采样电路、A/D(ADC0804)转换电路以及LCD显示电路组成,其中采样电路包括0.1欧姆的采样电阻和100倍的差分放大电路,以及由芯片MC34063组成的反向电路(给运算放放大器提供-5V电压)。
如下图;
→→→→
↓
←→
2.2硬件电路描述
先从题目本生分析,首先想到要求所用到的单片机,出于合理选取及实例分解,根据单片机的特点,选取了AT89S52作为设计用单片机。
主要考虑到AT89S52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
其次,电流测量中,电流是模拟量,而单片机只负责处理数字信号,所以要用到A/D转换芯片,通过筛选,选取了ADC0804作为设计用A/D转换芯片。
A/D转换概念:
即模数转换(AnalogtoDigitalConversion),输入模拟量(比如电压信号),输出一个与模拟量相对应的数字量(常为二进制形式)。
例如参考电压VREF为5V,采用8位的模数转换器时,当输入电压为0V时,输出的数字量为00000000,当输入的电压为5V时,输出的数字量为11111111。
当输入的电压从从0V到5V变化时,输出的数字量从00000000到11111111变化。
这样每个输入电压值对应一个输出数字量,即实现了模数转换。
ADC0804引脚功能:
CS:
芯片片选信号,低电平有效。
即=0时,该芯片才能正常工作,高电平时芯片不工作。
在外接多个ADC0804芯片时,该信号可以作为选择地址使用,通过不同的地址信号使能不同的ADC0804芯片,从而可以实现多个ADC通道的分时复用。
WR:
启动ADC0804进行ADC采样,该信号低电平有效,即信号由低电平变成高电平时,触发一次ADC转换。
RD:
低电平有效,即=0时,DAC0804把转换完成的数据加载到DB口,可以通过数据端口DB0~DB7读出本次的采样结果。
VIN(+)和VIN(-):
模拟电压输入端,单边输入时模拟电压输入接VIN(+)端,VIN(-)端接地。
双边输入时VIN(+)、VIN(-)分别接模拟电压信号的正端和负端。
当输入的模拟电压信号存在“零点漂移电压”时,可在VIN(-)接一等值的零点补偿电压,变换时将自动从VIN(+)中减去这一电压。
VREF/2:
参考电压接入引脚,本次设计运用了TL431稳压管构成的一个稳压电路,为的是给该端口提供稳定的直流电压,提高转换精度。
CLKIN和CLKR:
外接RC振荡电路产生模数转换器所需的时钟信号,时钟频率CLK=1/1.1RC,一般要求频率范围100KHz~1460KHz。
AGND和DGND:
分别接模拟地和数字地。
INTR:
转换结束输出信号,低电平有效,当一次A/D转换完成后,将引起=0,实际应用时,该引脚应与微处理器的外部中断输入引脚相连(如51单片机的,脚),当产生信号有效时,还需等待=0才能正确读出A/D转换结果,若ADC0804单独使用,则可以将引脚悬空。
DB0~DB7:
输出A/D转换后的8位二进制结果。
另外ADC0804片内有时钟电路,只要在外部“CLKIN(引脚4)”和“CLKR(引脚19)”两端外接一对电阻电容即可产生A/D转换所要求的时钟,其振荡频率为fCLK≈1/1.1RC。
其典型应用参数为:
R=10KΩ,C=150PF,fCLK≈640KHz,转换速度为100μs。
另外就是采样电流信号的采样电路,参考了相关的资料,设计的电路主要由两个OP07运算放大器组成的差分放大电路,放大倍数约为一百倍,为了减少运放的失真,还专门设计了有MC34063构成的一个反向电路,用来给运放提供-5V电压,然后就是利用的一个0.1欧姆的水泥采样电阻来把电流信号转换成电压信号,输入到运放中,因为ADC0804只能输入电压信号。
最后电路显示部分采用的LCD1602液晶显示。
3.电路工作原理
整个电路正常工作时,电流信号首先流过采样电阻,转换成电压信号经过100倍差分放大电路放大后,进入ADC0804芯片,经过A/D转换后,单片机P2端口接收到0804转换出来的数字信号,经过单片机内部的处理后再将电压值在LCD上显示出来,因为前面电压信号进过了放大,所以程序中需要除以相关的值(本次为10)还原电流值,才能送到lcd显示出来。
其中须判断电流值是否超过200毫安,若超过应该亮红灯,正常时亮红灯。
由于是8位ADC,当单端输出时,数字输出D的范围是0-255,这时的公式应为:
D=V/VREF*256,参考电压VREF设置的是2.56V,假设采样的电流为bA,实际显示应该为1000b毫安经过采样电阻后转换成0.1bV,,经过100倍放大后变成10bV,再根据ADC0804的量化公式D=V/VREF*256,D的值便为1000bV,刚好与要显示的毫安级别的电流值相等,就不需要在程序中再次进行数值处理和还原了。
4.电路图
A/D转换和显示电路
反向电压产生电路
采样电路
AD转换器参考电压稳压电路
5.元器件清单
元件清单
名称
型号
封装形式
数量
单片机
AT89S52
DIP-40
1个
A/D转换器
ADC0804
DIP-20
1个
液晶显示器
LCD1602
DIP-16
1个
晶振
12M
XTAL-1
1个
电阻排
10kX8
SIP-9
1个
滑动变阻器
1K
VR-5
1个
电阻
100K
AXIAL-0.4
2个
按键
SW
ANJIAN
1个
电阻
1K
AXIAL-0.4
1个
采样电阻
0.1欧姆
AXIAL-0.4
1个
电解电容
470uf
RAD-0.2
2个
电容
470pF
RAD-0.2
1个
电阻
10K
AXIAL-0.4
4个
运算放大器
0P07CP
DIP-8
2个
电阻
330欧姆
AXIAL-0.4
2个
反向电路芯片
MC34063
DIP-20
1个
限流电阻
0.22欧姆
AXIAL-0.4
1个
电感线圈
33uh
XIAL0.3
1个
稳压管
TL431
SIP3
1个
发光二极管
led
SIP2
2个
电阻
220欧姆
AXIAL-0.4
1个
电容
150pf
RAD-0.2
1个
电解电容
10uf
RAD-0.2
3个
电容
30pf
RAD-0.2
2个
6.程序流程图
NO
YES
YES
NO
7.源程序代码
主程序:
#include
#include
#include"LCD1602.h"
sbit_RD=P3^7;
sbit_WR=P3^6;
sbit_INTR=P3^3;
sbitLED1=P1^3;
sbitLED2=P1^4;
unsignedcharADC_Datshow[16]={"current:
000Ma"};
unsignedcharADC_Dat=0;
unsignedcharGet_Adc0804(void)//A/D转换函数,内部自动量化
{
unsignedchardat=0;//定义一个字符变量
_WR=0;//拉低写端口
_nop_();//延时两个机器周期
_nop_();
_WR=1;//在拉高写端口,启动A/D转换
while(_INTR==1);//等待A/D转换完成
_RD=0;
dat=P2;
_RD=1;
returndat;
}
voidmain(void)
{
LCD_Int();
LCD_WriteStr(0,1,"DigitalAmmeter");//第一行显示数字电流表
LCD_WriteStr(0,2,ADC_Datshow);//显示初始电流值
while
(1){
ADC_Dat=Get_Adc0804();
LCD_WriteCom(0xc0+9);
LCD_WriteDat((ADC_Dat/100)+0x30);//显示电流值第一位
LCD_WriteDat((ADC_Dat%100/10)+0x30);//显示电流值第二位
LCD_WriteDat((ADC_Dat%10)+0x30);//显示电流值第三位
if(ADC_Dat>200){
LED1=0;
LED2=1;
}
else{
LED1=1;
LED2=0;
}
delay_ms(100);
}
}
LCD驱动程序:
#include
#include"LCD1602.h"
#include
voiddelay_us(unsignedintz)
{
while(z--)
{
_nop_();
}
}
voiddelay_ms(unsignedintz)
{
unsignedchari=0;
while(z--){
for(i=112;i>0;i--);
}
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidLCD_WriteCom(unsignedchardictate)
{
Rs=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
delay_us(5);
Rw=0;
delay_us(5);
En=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
delay_us(5);
//就是让E从0到1发生正跳变,所以应先置"0"
LCD_Dat=dictate;//将数据送入P0口,即写入指令或地址
delay_ms
(2);
En=1;;//E置高电平
delay_ms
(2);
En=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
指定字符显示的实际地址
入口参数:
x
***************************************************/
voidLCD_WriteAdr(unsignedcharx,unsignedchary)
{
switch(y){
case1:
LCD_WriteCom(x|0x80);break;//显示位置的确定方法规定为"80H+地址码x"
case2:
LCD_WriteCom(x|0xc0);break;//显示位置的确定方法规定为"80H+地址码x"
default:
break;
}
}
/*****************************************************
函数功能:
将数据(字符的标准ASCII码)写入液晶模块
入口参数:
y(为字符常量)
***************************************************/
voidLCD_WriteDat(unsignedchardat)
{
Rs=1;;//RS为高电平,RW为低电平时,可以写入数据
delay_us(5);
Rw=0;
delay_us(5);
En=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
delay_us(5);
//就是让E从0到1发生正跳变,所以应先置"0"
LCD_Dat=dat;//将数据送入P0口,即将数据写入液晶模块
delay_ms
(2);
En=1;//E置高电平
delay_ms
(2);
En=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidLCD_WriteStr(unsignedcharx,unsignedchary,unsignedchar*s)
{
switch(y){
case1:
LCD_WriteCom(x|0x80);break;//显示位置的确定方法规定为"80H+地址码x"
case2:
LCD_WriteCom(x|0xc0);break;//显示位置的确定方法规定为"40H+地址码x"
default:
break;
}
while(*s!
='\0')
{
LCD_WriteDat(*s);
s++;
}
}
/*****************************************************
函数功能:
对LCD的显示模式进行初始化设置
***************************************************/
voidLCD_Int(void)
{
delay_ms(5);//延时15ms,首次写指令时应给LCD一段较长的反应时间
LCD_WriteCom(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delay_ms(5);//延时5ms
LCD_WriteCom(0x38);
delay_ms(5);
LCD_WriteCom(0x38);//3次写设置模式
delay_ms(5);
LCD_WriteCom(0x0c);//显示模式设置:
显示开,有光标,光标闪烁
delay_ms(5);
LCD_WriteCom(0x06);//显示模式设置:
光标右移,字符不移
delay_ms(5);
LCD_WriteCom(0x01);//清屏幕指令,将以前的显示内容清除
delay_ms(5);
}
8.调试
利用实验室的直流稳压源电压输出端和一个36欧姆的电阻以及设计的电流表连成一个回路,电流表的其它元件单独供电,调节稳压源输出电压,观察液晶显示的电流值与稳压源上的电流值相比较,并调节参考电压的滑动变阻器,这时电流显示值发生变化,调节到与稳压源上电流值一样,但是始终有一定的误差。
改变稳压源输出电压,观察液晶显示的电流值,变化基本正常。
9.总结
这次的单片机设计,是把硬件和软件结合起来的设计,这也是我们第一次做这样的硬软件结合的设计。
在这次设计中,其硬件电路是比复杂的,需要足够的耐心加细心,同时也需要一定的硬件知识基础。
只有这样才能保证电路的成功。
而且在这次设计中硬件是基础,只有把基础打好才会有更高的设计。
硬件工作完成了就是解决程序设计的问题,程序设计是一个很灵活的东西,它反映了我们解决问题的逻辑思维和创新能力,它是一个设计的灵魂所在。
要设计一个成功的电路,必须要有耐心,要有坚持的毅力。
在整个电路的设计过程中,花费时间最多的是各个单元电路的连接及电路的细节设计上,如在多种方案的选择中,我们仔细比较分析其原理以及可行的原因。
这就要求我们对硬件系统中各组件部分有充分透彻的理解和研究,并能对之灵活应用。
通过这次实训,我在书本理论知识的基础上又有了更深层次的理解。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅。
参考文献
[1]康华光主编.数字电子技术基础(第五版).高等教育出版社,2006年
[2]万文略主编.单片机原理及应用技术.重庆大学出版社,2004年
[3]康华光主编.模拟电子技术基础(第五版).高等教育出版社,2006年
[4]实用电子电路手册(数字电路分册)
[5]XX搜索:
简易数字电压表设计
[6]纪纲主编.C程序设计实用教程.中国铁道出版社,2009年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 简易 数字 电流表 设计