找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16475|回复: 15
打印 上一主题 下一主题
收起左侧

基于单片机+ADC0809的数字电流表Proteus仿真+源程序资料

  [复制链接]
跳转到指定楼层
楼主

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


下面是设计文档:
目录


摘 要2

关键词2

1 概述3

1.1设计意义

    1.2系统主要功能

2 硬件电路设计方案及描述3

2.1 设计方案

    2.2 主要元器件的介绍

    2. 3控制电路模块

    2.4 元件清单

3数字式电流表的软件设计16

3.1系统程序设计总方案

   3.2系统子程序设计

4数字式电流表的调试

4.1软件调试

    4.2显示结果及误差分析

5总结

附录1.电路原理图及仿真图

2. 程序代码

参考文献



基于单片机的简易数字电流表设计

摘要

数字电流表的诞生打破了传统电子测量仪器的模式和格局。它显示清晰直观、读数准确,采用了先进的数显技术,大大地减少了因人为因素所造成的测量误差事件。数字电流表是建立在数字电压表的基础上,让电压表与电阻串联,其显示的是电流,数字电压表是把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式,并加以显示的仪表。数字电流表把电子技术、计算技术、自动化技术的成果与精密电测量技术密切的结合在一起,成为仪器、仪表领域中独立而完整的一个分支,数字电流表标志着电子仪器领域的一场革命,也开创了现代电子测量技术的先河。本设计采用了以单片机为开发平台,控制系采用AT89C52单片机,A/D转换采用ADC0809。系统除能确保实现要求的功能外,还可以方便进行8路其它A/D转换量的测量、远程测量结果传送等扩展功能。简易数字电流测量电路由A/D转换、数据处理、显示控制等组成。

1 .概述

1.1设计意义

通过设计,掌握电子设计的一般步骤和方法,锻炼分析问题解决问题的能力,学会如何查找所需资料,同时复习以前所学知识并加深记忆,为设计打好基础,也为以后工作作准备。通过对选题的分析设计,学习数字电流表的工作原理、组成和特性;掌握数字电流表的校准方法和使用方法;

1.2系统主要功能

A利用AD转换芯片和精密电阻测量0~20mA电流

   B、系统工作符合一般数字电流表要求

2 硬件电路设计方案及描述

2.1 数字式电流表系统硬件设计   
硬件电路设计主要包括:AT89S51单片机系统,A/D转换电路,显示电路。测量最大电
20ma,显示最大值为20.00ma。本实验采用AT89S51单片机芯片配合ADC0809模/数转换芯片构成一个简易的数字电流表。

硬件电路设计由6个部分组成; A/D转换电路,AT89C51单片机系统,LED显示系统、时钟电路、复位电路以及测量电流输入电路。硬件电路设计框图如图2.1所示。

2.1数字式电流表系统硬件设计框图

2.2.2  ADC0809内部逻辑结构

            

ADC0809的内部逻辑结构图

图中多路模拟开关可选通8路模拟通道,允许8路模拟量分时输入,并共用一个A/D转换器进行转换。地址锁存与译码电路完成对A、B、C三个地址位进行锁存与译码,如表所示。


ADC0809通道选择表


C(ADDC)

B(ADDB)

A(ADDA)

选择的通道

0

0

0

IN0

0

0

1

IN1

0

1

0

IN2

0

1

1

IN3

1

0

0

IN4

1

0

1

IN5

1

1

0

IN6

1

1

1

IN7

2.2.3 ADC0809的引脚ADC0809芯片为28引脚双列直插式芯片,其主要功能:(1)IN0~IN7:8路模拟量输入通道。

(2)A、B、C:模拟通道地址线。这3根地址线用于对8路模拟通道的选择,其译码关系如表4.3所示。其中,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。

(3)ALE:地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。

(4)START:转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。本信号有时简写为ST。

(5)D7~D0:数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低位,D7为最高。

(6)OE:输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。

(7)CLK:时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号。

(8)EOC:转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。

(9)Vcc: +5V电源,GND:地。

(10)Vref:参考电压。参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V, Vref(-)=0V)。

  ADC0809的工作原理

首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。

(注意:ALE信号常与START信号连在一起,这样连接可以在信号的前沿写入地址信号,在其后沿启动A/D转换,图为ADC0809信号的时序配合图)。


              ADC0809信号的时序配合

2.2.3  4位一体7段LED数码管

本实验的显示模块主要由一个4位一体的7段LED数码管(SM410564)构成,用于显示测量到的电压值。它是一个共阳极的数码管,每一位数码管的原理图如图4.5所示。每一位数码管的a,b,c,d,e,f,g和dp端都各自连接在一起,用于接收AT89C52的P1口产生的显示段码。C1,C2,C3,C4引脚端为其位选端,用于接收AT89C52的P3口产生的位选码。


图4.5 一位数码管的原理图

  4位一体7段LED数码管图


2.3控制电路模块
2.3.1  总电路

本课题实验主要采用AT89S51芯片和ADC0809芯片来完成一个简易的数字电压表,能够对输入的0~20ma 的模拟直流电流进行测量,并通过一个4位一体的7段LED数码管进行显示,测量误差约为0.02 ma。该电流表的测量电路主要由三个模块组成:A/D转换模块、数据处理模块及显示控制模块。A/D转换主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。数据处理则由芯片AT89S51来完成,其负责把ADC0809传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着ADC0809芯片的工作。显示模块主要由7段数码管及相应的驱动组成,显示测量到的电流值。数字式电流表的设计的总电路图见附录一。


2.3.2AT89S51的复位电路和时钟电路

AT89S51的复位电路如图所示。当单片机一上电,立即复位;另外,如果在运行中,外界干扰等因素使单片机的程序陷入死循环状态或“跑飞”,就可以通过按键使其复位。复位也是使单片机退出低功耗工作方式而进入正常状态的一种操作。

  复位电路和时钟电路

电容C和电阻R1实现上电自动复位。增加按键开关S又可实现按键复位功能。一般取C=10uF,R1=1KΩ。

单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。

电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了33uF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。

2.3.3A/D转换电路

A/D转换由ADC0809完成。ADC0809具有8路模拟输入端口,地址线(23~25脚)可决定对哪一路模拟输入作A/D转换。22脚为地址控制,当输入为高电平时,对地址信号进行锁存。6脚为测试控制,当输入一个2μs宽高电平脉冲时,就开始A/D转换。7脚为A/D转换结束标志,当A/D转换结束时,7脚输出高电平。9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从该端口输出。10脚为ADC0809的时钟输入端,利用单片机AT89S51的30脚的六分频晶振频率再通过14024二分频得到1MHz时钟。AT89S51与ADC0809的连接电路原理图如图所示。

           AT89S51与ADC0809的连接电路原理图


AT89S51与ADC0809的连接必须注意处理好3个问题:

(1)在START端送一个100μs宽的启动正脉冲;

              (2)获取EOC端上的状态信息,因为它是A/D转换的结束标志;

  • 给“三态输出锁存器”分配一个端口地址,也就是给OE端送一个地址译码器的输出信号。
2.3.4显示电路

由于单片机的并行口不能直接驱动LED显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作[7]。如果驱动电路能力差,即负载能力不够时,显示器亮度就低,而且驱动电路长期在超负荷下运行容易损坏,因此,LED显示器的驱动电路设计是一个非常重要的问题。

为了简化数字式直流电流表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LED的A-G段显示引脚和DP小数点显示引脚并联到P0口与上拉电阻之间,这样,就可以加大P0口作为输出口德驱动能力,使得LED能按照正常的亮度显示出数字。

系统采用动态显示方式驱动4个数码管工作,显示电路与单片机的P1口相连来显示采集到的电流值。

显示电路原理图

2.4 元件清单

器件类型

器件名

数值

数量

单片机

AT89S51


1

A/D转换器

ADC0809


1

数码管

TSEG-MP*4-CA-BLUE


1

电容

C1、C2

33uF

2

电解电容

C3

10uF

1

电阻

R1

10K

2

排阻

RP1

200

1

电阻

R2

250

1

晶振

X1

12MHz

1

3数字式电流表的软件设计3.1系统程序设计总方案
   根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序。
数字式直流电流表主程序框图

3.2系统子程序设计3.2.2初始化程序

所谓初始化,是对将要用到的c51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。

3.2.3A/D转换子程序

A/D转换子程序用来控制对输入的模块电流信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图。

   A/D转换流程图


3.2.4显示子程序

显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms。

在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。其转换流程图如图5.3所示。

                       显示子程序流程图

4数字式电流表的调试

4.1软件调试

    软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的。Proteus软件可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。Proteus支持的微处理芯片包括8051系列、AVR系列、PIC系列、HC11系列及Z80等等。Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与u Visions3 IDE工具软件结合进行编程仿真调试。

本系统的调试主要以软件为主,其中,系统电路图的绘制和仿真我采用的是Proteus软件,而程序方面,采用的是C语言。
4.2显示结果及误差分析1.1.1        显示结果
  • 当IN0口输入电0ma时,显示结果如图所示,测量误差为0ma


2.当IN0口输入电流为10.50ma时,显示结果如图所示,测量误差为0ma。



3. 当IN0口输入电流为5ma时,显示结果如图所示,测量误差为0.01ma。

4. 当IN0口输入电压流为15ma时,显示结果如图所示,测量误差为0.02ma。

误差分析

通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表

简易数字电流表与“标准”数字电流表对比测试表


标准电流值/A

简易电流表测量值/A

绝对误差/A

0.00

0.00

0.00

2.00

2.01

0.01

4.00

4.00

0.00

6.00

6.02

0.02

8.00

8.01

0.01

10.00

10.01

0.01

12.00

11.98

0.02

14.00

14.00

0.00

16.00

15.98

0.02

20.00

20.00

0.00


  从上表可以看出,简易数字电流表测得的值基本上比标准电压值偏大0-0.02mA,这可以通过校正ADC0809的基准电压来解决。因为该电流表设计时直接用5A的供电电源作为电压,所以电压可能有偏差。当要测量电流大于5V所对应的电流时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。
5.总结

这次的单片机设计,是把硬件和软件结合起来的设计,,其硬件电路是比复杂的,需要足够的耐心加细心,同时也需要一定的硬件知识基础。只有这样才能保证电路的成功。而且在这次设计中硬件是基础,只有把基础打好才会有更高的设计。硬件工作完成了就是解决程序设计的问题,程序设计是一个很灵活的东西,它反映了我们解决问题的逻辑思维和创新能力,它是一个设计的灵魂所在。

要设计一个成功的电路,必须要有耐心,要有坚持的毅力。在整个电路的设计过程中,花费时间最多的是各个单元电路的连接及电路的细节设计上,如在多种方案的选择中,我们仔细比较分析其原理以及可行的原因。这就要求我们对硬件系统中各组件部分有充分透彻的理解和研究,并能对之灵活应用。通过这次实训,我在书本理论知识的基础上又有了更深层次的理解。

此次设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅。

附录1 总电路原理图及仿真图
电路原理图
                          仿真图

单片机源程序如下:
  1. #include<reg52.h>
  2. unsigned char code dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  3. unsigned char dispbuf[4];
  4. unsigned int i;
  5. unsigned int j;
  6. unsigned char getdata;
  7. unsigned int temp;
  8. unsigned int temp1;
  9. unsigned char count;
  10. unsigned char d;
  11. sbit ST=P3^0;
  12. sbit OE=P3^1;
  13. sbit EOC=P3^2;
  14. sbit CLK=P3^3;
  15. sbit P34=P3^4;
  16. sbit P35=P3^5;
  17. sbit P36=P3^6;
  18. sbit P20=P2^0;
  19. sbit P21=P2^1;
  20. sbit P22=P2^2;
  21. sbit P23=P2^3;
  22. sbit P17=P1^7;
  23. void TimeInitial();
  24. void Delay(unsigned int i);

  25. void TimeInitial()
  26. { TMOD=0x10;
  27. TH1=(65536-200)/256;
  28. TL1=(65536-200)%256;
  29. EA=1;
  30. ET1=1;
  31. TR1=1;
  32. }
  33. void Delay(unsigned int i)
  34. {
  35.   unsigned int j;
  36.   for(;i>0;i--)
  37.   {
  38.   for(j=0;j<125;j++)
  39.   {;}
  40.   }
  41. }

  42. void Display()

  43. {
  44. P1=~dispbitcode[dispbuf[3]];
  45. P20=1;
  46. P21=0;
  47. P22=0;
  48. P23=0;
  49. Delay(10);
  50. P1=0xFF;
  51. P1=~dispbitcode[dispbuf[2]];
  52. P17=0;
  53. P20=0;
  54. P21=1;
  55. P22=0;
  56. P23=0;
  57. Delay(10);
  58. P1=0xFF;
  59. P1=~dispbitcode[dispbuf[1]];
  60. P20=0;
  61. P21=0;
  62. P22=1;
  63. P23=0;
  64. Delay(10);
  65. P1=0xFF;
  66. P1=~dispbitcode[dispbuf[0]];
  67. P20=0;
  68. P21=0;
  69. P22=0;
  70. P23=1;
  71. Delay(10);
  72. P1=0xFF;
  73. }
  74. void main()
  75. {
  76. TimeInitial();
  77. while(1)
  78. {
  79. ST=0;
  80. OE=0;
  81. ST=1;
  82. ST=0;

  83. while(EOC==0);
  84. OE=1;
  85. getdata=P0;
  86. OE=0;
  87. temp=getdata*1.0/255*2000;
  88. dispbuf[0]=temp%10;
  89. dispbuf[1]=temp/10%10;
  90. dispbuf[2]=temp/100%10;
  91. dispbuf[3]=temp/1000;
  92. Display();

  93. }
  94. }

  95. void t1(void) interrupt 3 using 0
  96. {
  97.   TH1=(65536-200)/256;
  98.   TL1=(65536-200)%256;
  99.   CLK=~CLK;
  100.   }
复制代码


所有资料51hei提供下载,仿真是Proteus7.5版本的dsn文件:
单片机设计—简易数字电流表.7z (236.84 KB, 下载次数: 503)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:69408 发表于 2018-9-9 21:57 | 只看该作者
下载学习学习,谢谢楼主分享!仿真要Proteus7.5才能打开
回复

使用道具 举报

板凳
ID:459831 发表于 2019-1-2 10:49 | 只看该作者
楼主大大请问怎么把量程改成4-20ma?
回复

使用道具 举报

地板
ID:442952 发表于 2019-4-10 07:45 来自手机 | 只看该作者
楼楼主大大,怎么把量程改成0~20A
回复

使用道具 举报

5#
ID:518574 发表于 2019-4-30 17:27 | 只看该作者
楼主   你这个代码。。。。。。   心就不疼吗
回复

使用道具 举报

6#
ID:693122 发表于 2020-2-14 12:03 | 只看该作者
这代码有点厉害啊。。
回复

使用道具 举报

7#
ID:696049 发表于 2020-2-22 10:53 | 只看该作者
想知道想改量程为A该怎么改呀
回复

使用道具 举报

8#
ID:696049 发表于 2020-2-22 14:24 | 只看该作者
请问怎么改量程呢
回复

使用道具 举报

9#
ID:530343 发表于 2020-3-14 17:21 | 只看该作者
改取样电阻
回复

使用道具 举报

10#
ID:754077 发表于 2020-5-22 14:22 | 只看该作者
谢谢分享,用Proteus7.5打开

51hei.gif (298.06 KB, 下载次数: 49)

51hei.gif
回复

使用道具 举报

11#
ID:597316 发表于 2020-6-9 16:36 | 只看该作者
太好了,解决了我目前遇到的问题,非常感谢
回复

使用道具 举报

12#
ID:744425 发表于 2020-6-10 11:26 | 只看该作者
请问如果不用定时器制造时钟信号,而直接用脉冲发生器应该怎么改啊?
回复

使用道具 举报

13#
ID:797821 发表于 2020-7-6 13:47 | 只看该作者
这个资料能做成硬板PCB吗?我想试一下
回复

使用道具 举报

14#
ID:234560 发表于 2020-7-10 16:42 | 只看该作者
这个坛子里的人是不是多数都是在校大学生啊,电压表不做过压保护,电流表不做过流保护,做着玩玩还行,完全没有实用性。
回复

使用道具 举报

15#
ID:859497 发表于 2020-12-17 13:52 | 只看该作者
[SPICE] I1: unknown controlling source (null)
Real Time Simulation failed to start.
这是怎么回事呢
回复

使用道具 举报

16#
ID:968948 发表于 2021-9-28 21:42 来自手机 | 只看该作者
我这么运行不出来啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表