找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+ADC0809数字欧姆表(测电阻)仿真+程序设计

  [复制链接]
跳转到指定楼层
楼主
本文是以简易数字欧姆表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。其中,AD转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电阻值信号。
附件包含原理图,完整程序,PCB布局。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


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


1  引言
2  方案论证
3  系统设计
3.1 系统要求
3.2 总体设计
4  硬件设计
4.1 主控模块
4.1.1 时钟电路
4.1.2 复位电路
4.1.3 单片机电路
4.2 从控模块
4.2.1 被测电阻电压测量电路
4.2.2 模数ADC转换电路
4.2.3 数码管显示电路
5  软件设计
5.1 软件开发语言
5.2 系统开发工具的选择
5.3 主控单片机软件设计
5.3.1 主控单片机整体流程图
5.3.2 单片机模块流程图
5.3.3 ADC0809模数转换模块流程图
6  系统组装调试
6.1 调试仪器
6.2 调试方法
6.3 调试步骤
7  数据测试及分析
7.1 仿真软件下调试
7.2 实际欧姆表调试
8  结论

引言
数字欧姆表,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度欧姆表功能单一,精度低,容易引起视差和视觉疲劳,而采用单片机的数字欧姆表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字欧姆表是以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和AD转换器构成的数字欧姆表作全面深入的了解是很有必要的。
近年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字欧姆表的快速发展,并不断出现新的类型。
目前,数字欧姆表的内部核心部件是AD转换器,转换的精度很大程度上影响着数字欧姆表表的准确度,因而,以后数字欧姆表的发展就着眼在高精度和低成本这两个方面
本文是以简易数字欧姆表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。其中,AD转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电阻值信号
2  方案论证
为了用数字的办法测量电阻,首先需要将被测电阻值以某种方式输入AD转换器。根据测量原理的不同,其输入方法有很多,如直接法、电桥法和充放电法。通过网上查找资料,得到以下几种具体方案:
方案一 电压比例输入法
电压经过基准电阻R1和被测电阻Rx接到地,通过OUT输出被测电阻Rx上的电压,经过ADC0809的转换,最后运用单片机根据电压比例计算得出被测电阻,最后通过数码管显示出来。
方案二 通过555单稳态触发器转换
利用单稳或电容充放电规律等,可以把被测电阻量的大小转换成脉冲的宽窄,即脉冲的宽度Tx与Rx成正比。只要把此脉冲和频率固定不变的方波相与,便可以得到计数脉冲,将它送给数字显示器。如果时钟脉冲的频率等参数合适,便可实现测量电阻。
方案三 恒流源电路输入法
运用TL431ACLPR提供恒定电压,用恒定电压除以标准电阻可以使ADOP07AH得到想要的恒定电流,因为被测电阻和标准电阻串联,电流相等,固只需要测出待测电阻得电压,用电压除以电流即可得到被测电阻。
方案比较
方案一 本方案原理较易理解,实现也很方便简单,成本低,测量精确,而且利用标准电阻得更换让测量更具有灵活性。
方案二 用555构成的单稳态电路在正常工作条件下输出脉冲的宽度Tx与Rx的函数关系是:Tx=R*Cx*ln3,所产生的时间误差可能达到百分之五,再加上其他原因产生的误差,测量是的时间延迟太大。
方案三 运用恒流源电路测量电阻,测量精确,但实现比方案一难,成本高。
所以本实验选取第一种方案。
3  系统设计3.1 系统要求
运用C51单片机设计一个测量电阻的欧姆表,测量电阻范围在10K~100K之间,测量误差不超过5%,尽可能的提高精确度。
3.2 总体设计

时钟电路和复位电路提供89C51单片机工作,ADC0809测得待测电阻的电压之后发送给单片机,单片机经过数据处理得到被测电阻阻值,经I/O口输出给数码管显示。
4  硬件设计
4.1 主控模块
4.1.1 时钟电路
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。因为一个机器周期含有6个状态周期,而每个状态周期为2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器的振荡频率为12MHZ,一个振荡周期为1/12us,故而一个机器周期为1us。

如图4-1所示为时钟电路。
图4-1-1
4.1.2复位电路
复位方法一般有上电自动复位和外部按键手动复位,单片机在时钟电路工作以后,在RESET端持续给出2个机器周期的高电平时就可以完成复位操作。例如使用晶振频率为12MHz时,则复位信号持续时间应不小于2us。本设计采用的是外部手动按键复位电路。
如图4-2所示为复位电路

图4-1-2
4.1.3 单片机电路
STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含4K Bytes的可反复擦写1000次的Flash只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路



如图4-1-3所示
图4-1-3
4.2 从控模块
4.
2.1 被测电阻电压测量电路

如图4-1-4所示为被测电阻电压测量。电压经过已知电阻和被测电阻Rx接到地。通过OUT输出被测电阻Rx上的电压。送到ADC0809的IN0口。
图4-1-4
4.2.2 模数ADC转换电路
本设计采用ADC0809作为模数转换芯片,ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
主要特性:
(1)8路输入通道,8位A/D转换器,即分辨率为8位。
(2)具有转换起停控制端。
(3)转换时间为100μs(时钟为640KHz时),130μs(时钟为500KHz时)。
(4)单个+5V电源供电。
(5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
(6)工作温度范围为-40~+85摄氏度。
(7)低功耗,约15mW。
内部结构:
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
外部结构:

ADC0809芯片有28条引脚,采用双列直插式封装,如图4-1-5所示。
图4-1-5-1
下面说明各引脚功能:
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
ALE:地址锁存允许信号,输入端,产生一个正脉冲以锁存地址。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
电路如图4-1-5-2所示


图4-1-5-2
4.2.3 数码管显示电路
  四位数码管是一种半导体发光器件,其基本单元是发光二极管。能显示4个数码管叫四位数码管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。

本设计采用四位一体共阴极数码管,管脚图如图4-1-6所示
图4-1-6
5  软件设计5.1 软件开发语言
本此设计运用C语言进行编程。
5.2 系统开发工具的选择
此次设计采用的软件有:Keil5、ISIS仿真软件、stc-isp单片机烧录软件。

5.3.2 单片机模块流程图


6  系统组装调试6.1 调试仪器
(1)5V直流电源1台。
(2)万用表一台。
(3)100k电位器一个。
(4)keil5。
(5)stc-isp。
(6)ISIS仿真软件。
6.2 调试方法
本设计应用ISIS和keil5软件,首先根据自己设计的电路图用ISIS软件画出电路模型,然后用keil5软件编写程序并进行编译,在根据错误提示修改错误直至编译通过,再生成hex文件,将此文件加到电路图中的单片机里面进行仿真测试,
(1)不断尝试换用不同的标准电阻,找到误差最小时的标准电阻。
(2)修改数据处理的程序,提高测量电阻的精确度。
6.3 调试步骤
(1)根据分压原理,在测量10K~100K电阻时,选用50K标准电阻最合适。
(2)用万用表测量,将电位器调节至10k
(3)用本课程设计的欧姆表测量其电阻。若与10K相差较大,则修改数据处理部分的程序,如:或者扩大0809的电压测量的精确度(将测得的电压扩大100倍)来达到扩大电阻的精确度。直至误差在5%之内,接着在调节电位器到20k,测量其电阻,若误差在5%之内,则继续调节电阻,否则修改程序。电阻的取值为10K,20K,30K…100K,直至所有的误差都在5%之内即可。
(4)在达到5%的精确误差后,可以通过在单片机中int型最大不超过65536,适当的扩大标准电阻的倍数再缩小,从而提高精确度。
7  数据测试及分析
欧姆表原理是基于电压测电阻,所以最终测得的电压的精度决定了电阻的精度。由于采用了ADC0809为8位处理器,当输入电压为5.00V时,输出数据值为255(FFH),因此ADC0809最大的数值分辨率为0.0196V(5/255)。这就决定了电压表的最大分辨率(精度)只能达到0.0196V,从而欧姆表的精度也有了限制。测试时电压数值的变化一般以0.02V的电压幅度变化,如果要获得更高的精度要求,应采用12位、13位的A/D转换器。
7.1 仿真软件下调试
在ISIS仿真软件下,用50K的标准电阻下,分别将待测电阻取10K,20K,30K~100K时,得到的数据如表1:
表1
从表中可看出,在ISIS仿真软件下,试验所得的电阻值与标准值之间的误差没有超过2%,符合设计所要求的误差不超过5%。而产生误差的原因,最主要就是电压的精确度,电压的精确度越高,测得的电阻阻值越接近标准值。
7.2 实际欧姆表调试
实际用本次设计的欧姆表测量表阻值,用50K的标准电阻下,分别将待测电阻取10K,20K,30K~100K时,得到的数据如下表2:
表2
从表中可以看出,实际测得的值和仿真值有所出入,原因是电阻的实际阻值与标称值会有所偏差,会在标称值的附近。还有电路也会产生一定的电阻,故会引起误差,不过误差并没有超过3%。

8结论
为期两周设计就此结束,我深切的体会到电路理论与实际相结合的重要。以及用电脑仿真与电脑理论及电路实际的不同。起初刚刚拿到题目时一直在纠结这电阻应该怎么测才能使电阻数值更精确,当时想到了比例法和恒流源的方法,经过网上的查阅资料和与同学得到讨论,最终选定了比例法测电阻。经过两周的努力终于成功地设计出了误差低于5%的欧姆表,最终在4位一体数码管上显示的结果和直接用万用表测试的结果几乎一致,误差完全在合理的范围。由于仪器而引起的误差也在误差范围内,达到预期设计的目的,设计成功。

本设计参考了单片机原理与接口技术教材中的89C51与ADC0809转换的接口连线,设计出电路图的连线,并从中理解了许多基本的知识和接线的方法,在程序的设计与欧姆表调试的过程中遇到了很多的问题,刚开始调试时4位一体的数码管完全不亮,检查发现是数码管引脚接反了,改正后测试数码管有所显示,但是只有第一位显示较亮,其余3位很暗,经过在程序中加长延时的时间,四位数码管全部点亮。在测试50K的电阻时问题又出现了,显示的电阻值仅仅只有几千欧,经过检查发现实ADC0809的8位输出接反了,在改正了电路后数码管显示正确,最终在测试了多个不同的电阻,数值均正确且在误差允许的范围内,本次设计最终调试成功。

单片机程序
  1. #include<reg51.h>
  2. sbit CLK=P3^4;
  3. sbit OE=P3^6;
  4. sbit ST=P3^0;
  5. sbit EOC=P3^7;
  6. unsigned int dian;
  7. unsigned int diann;
  8. unsigned int dianya;
  9. unsigned char code table[]={
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f};

  13. void delay(unsigned int z)
  14. {
  15.     while(z--);
  16. }

  17. void init()
  18. {
  19.               EA = 1;
  20.               TMOD = 0x02;
  21.               TH0=216;
  22.               TL0=216;
  23.               TR0=1;
  24.               ET0=1;
  25.               ST=0;
  26.               OE=0;
  27. }

  28. void t0(void) interrupt 1 using 0
  29. {
  30.               CLK=~CLK;
  31. }

  32. void ADC_0809()
  33. {
  34.     unsigned char temp;
  35.     ST=0;
  36.     OE=0;
  37.     ST=1;
  38.     ST=0;
  39.     CLK=1;
  40.     CLK=0;
  41.     CLK=1;
  42.     CLK=0;
  43.     while(0==EOC)
  44.     {
  45.     };
  46.     OE=1;
  47.     temp=P2;
  48.                             dian=temp*1.0/255*500;
  49.                 diann=(150*dian)/(500-dian);
  50.                             dianya=diann*100/3;
  51.     OE=0;
  52. }

  53. void Vpp_Show()
  54. {
  55.     unsigned char qian,bai,shi,ge;
  56.     qian=(dianya/1000)%10;
  57.     bai=(dianya/100)%10;
  58.     shi=(dianya/10)%10;
  59.     ge=dianya%10;
  60.             
  61.     P1=0xfe;
  62.     P0=table[qian];
  63.     delay(500);

  64.     P1=0xfd;
  65.     P0=table[bai]|0x80;;
  66.                   delay(500);
  67.                                          
  68.     P1=0xfb;
  69.     P0=table[shi];
  70.                                 delay(500);
  71.                                                       
  72.     P1=0xf7;
  73.     P0=table[ge];
  74.                             delay(500);
  75. }
  76. void main()
  77. {init();
  78.     while(1)
  79.     {
  80.                                          
  81.        ADC_0809();
  82.        Vpp_Show();

  83.     }
  84. }
复制代码






全部资料51hei下载地址:
电压表程序.zip (198.56 KB, 下载次数: 286)
15008.zip (71.96 KB, 下载次数: 188)
电压表原理.zip (192.77 KB, 下载次数: 165)
电压表设计报告.docx (406.96 KB, 下载次数: 140)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:404942 发表于 2019-5-29 16:39 | 只看该作者
15008那个下载之后怎么里面那个.DSN文件怎么打不开了呢
回复

使用道具 举报

板凳
ID:382683 发表于 2019-6-30 17:09 | 只看该作者
我怎么弄,显示的结果不对
回复

使用道具 举报

地板
ID:548282 发表于 2019-11-13 16:23 来自手机 | 只看该作者
感谢楼主的分享。但是我有些问题还是不太清楚。
回复

使用道具 举报

5#
ID:641841 发表于 2019-11-14 12:53 来自手机 | 只看该作者
这个量程可以变成0-1000的吗
回复

使用道具 举报

6#
ID:675892 发表于 2019-12-28 10:32 | 只看该作者
非常感谢!值得参考。
回复

使用道具 举报

7#
ID:673450 发表于 2019-12-28 22:20 | 只看该作者
想问一下,单片机里该放那个.hex文件
回复

使用道具 举报

8#
ID:487698 发表于 2020-6-16 23:24 | 只看该作者
感谢分享
回复

使用道具 举报

9#
ID:784260 发表于 2020-6-19 16:31 | 只看该作者
感谢分享,很厉害
回复

使用道具 举报

10#
ID:978751 发表于 2022-4-10 17:47 | 只看该作者
dian=temp*1.0/255*500;           diann=(150*dian)/(500-dian);                 dianya=diann*100/3;
回复

使用道具 举报

11#
ID:978751 发表于 2022-4-10 17:48 | 只看该作者
dian=temp*1.0/255*500;           diann=(150*dian)/(500-dian);                 dianya=diann*100/3;你好,请教一下,这个公式是的参数分别代表什么,能解译一下吗?
回复

使用道具 举报

12#
ID:1032960 发表于 2022-6-7 18:06 | 只看该作者
谁有代码的解释啊

回复

使用道具 举报

13#
ID:910913 发表于 2022-12-15 12:44 | 只看该作者
够详细啊
回复

使用道具 举报

14#
ID:1064915 发表于 2024-1-9 15:20 | 只看该作者
89c51是1t单片机,有些错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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