首页 > 编程语言 >基于AT89C52多量程电压表的设计(含文档、源码与proteus仿真,以及系统详细介绍)

基于AT89C52多量程电压表的设计(含文档、源码与proteus仿真,以及系统详细介绍)

时间:2024-07-09 20:26:28浏览次数:20  
标签:量程 proteus 引脚 CLK 数码管 源码 单片机 ADC0832 AT89C52

本篇文章论述的是基于AT89C52多量程电压表的设计的详情介绍,如果对您有帮助的话,还请点赞、收藏、转发,关注一下哦,如果有资源方面的需要可以联系我。

目录

课程设计目的

课程设计要求

原理图

仿真图

代码实现(部分)

系统论文

资源下载


一、课程设计目的

1.1巩固和加深对微处理器原理和接口技术知识的理解;

1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;

1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;

1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;

1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。

二、课程设计要求

2.1 使用ADC0832进行模数转换;

2.2 通过串口读取测量到的电压值;

2.3 数码管显示测量到的电压值;

2.4 可测多个量程的电压。

原理图


仿真图


代码实现(部分)


#include <reg52.h> //52 系列单片机头文件定义
#include <stdio.h> //C 语言头文件定义
//***************************
//*******引脚定义************
//***************************
//ADC0832 控制口定义
sbit CS =P2^0; //CS:片选使能信号输出端
sbit CLK=P2^1; //CLK:时钟信号输出端
sbit DIO=P2^2; //DI/DO 信号输出端(由于 D0 与 D1 在通信时不会同时有效,
所以共用一个 IO 口)
//数码管控制引脚定义(数据引脚共 8 个,使用 P0)
sbit S_1=P1^0; //第一个数码管阳极控制端
sbit S_2=P1^1; //第二个数码管阳极控制端
sbit S_3=P1^2; //第三个数码管阳极控制端
sbit S_4=P1^3; //第四个数码管阳极控制端
//量程与继电器控制引脚定义
sbit KEY=P1^4; //用于量程的选择以及继电器的控制
//***************************
//*******常量定义************
//***************************
unsigned int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
 //0~9 在共阳数码管中所对应的十六进制值
//***************************
//*******延时 1000us**********
//***************************
void delay_1000us() //简单延时函数,约延时 1000us
{
unsigned char i=1000;
while(i--);
}
//***************************
//*******ADC0832 读取程序*****
//***************************
unsigned int ADC0832() //此处编程参考 ADC0832 英文手册
{ 
 unsigned int i,buff; //缓存数据定义
 //一个读取周期开始
 CS=1; //CS 置一,转换开始
 CLK=0; //为第一个时钟信号做准备
 CS=0; //芯片使能
 DIO=1; //给发送 DI 发送起始电平
 CLK=1; //第一个时钟开始
 CLK=0; //第一个时钟结束
 DIO=1; //给 DI 发送高电平,选择单通道模式
 CLK=1; //第二个时钟开始
 CLK=0; //第二个时钟结束
 DIO=0; //给 DI 发送低电平,选择通道 0
 CLK=1; //第三个时钟开始
 CLK=0; //第三个时钟结束
 DIO=1; //DO 置一,准备读取数据
 for(i=0;i<8;i++) //读取八位数据,由高到低读取
 {
 CLK=1; //时钟信号拉高
 CLK=0; //下降沿有效,进行读取数据
 buff<<=1; //将下面储存的低位数据向右移
 buff|=DIO; //将输出数据 DIO 通过或运算储存在 buff 最低位
 }
 CS=1; //测量完毕,将 CS 拉高,片选无效
 return buff; 
}
//***************************
//*******串口初始化程序******
//***************************
//***************************
//*******主程序**************
//***************************
void main()
{
 unsigned int buff,ge,shi,bai; //缓存数据定义
 UartInit(); //串口初始化 
 while(1) //死循环
 { //主函数程序开始
 buff=ADC0832()*100; //读取 AD 的值,并进行修正
 buff=buff/51; //精度修正,转换为 000~500 范围
 bai=buff/100; //保存 buff 的百位
 shi=(buff%100)/10; //保存 buff 的十位
 ge=buff%10; //保存 buff 的个位
 //数码管显示程序
 if(KEY==1) //如果 KEY 为 1,量程设为 0~5V
 {
 S_1=0; //选通第一位数码管,显示第一位数
 P0=table[0]; //P0 口输出 8 位数据
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_1=1; //关闭第一位数码管
 S_2=0; //选通第二位数码管,显示第二位数
 P0=table[bai]&0x7f; //P0 口输出 8 位数据,因为量程为为 0~5V,所以第一位后显
示小数点
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_2=1; //关闭第二位数码管
 S_3=0; //选通第三位数码管,显示第三位数
 P0=table[shi]; //P0 口输出 8 位数据
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_3=1; //关闭第三位数码管
 S_4=0; //选通第四位数码管,显示第四位数
 P0=table[ge]; //P0 口输出 8 位数据
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_4=1; //关闭第四位数码管
 //串口发送程序
 TI=1; //TI 置一,开始发送数据 
 printf("%d.%d%d\n",bai,shi,ge); 
 //将 buff/100 后发出
 while(!TI); //直到数据发送完毕
 TI=0; //数据发送完毕后,TI 置〇
 }
 else //如果 KEY 为 1,量程设为 0~50V
 {
 S_1=0; //选通第一位数码管,显示第一位数
 P0=table[0]; //P0 口输出 8 位数据
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_1=1; //关闭第一位数码管
 S_2=0; //选通第二位数码管,显示第二位数
 P0=table[bai]; //P0 口输出 8 位数据
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_2=1; //关闭第二位数码管
 S_3=0; //选通第三位数码管,显示第三位数
 P0=table[shi]&0x7f; //P0 口输出 8 位数据,因为量程为为 0~50V,所以第二位后
显示小数点
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_3=1; //关闭第三位数码管
 S_4=0; //选通第四位数码管,显示第四位数
 P0=table[ge]; //P0 口输出 8 位数据
 delay_1000us(); //短暂延时
 P0=0xff; //数码管消隐
 S_4=1; //关闭第四位数码管
 //串口发送程序
 TI=1; //TI 置一,开始发送数据 
 printf("%d%d.%d\n",bai,shi,ge); 
 //将 buff/100 后发出
 while(!TI); //直到数据发送完毕
 TI=0; //数据发送完毕后,TI 置〇
 }
 }
}

系统论文


三、硬件设计

3.1 设计思想

该系统的硬件设计思路如下:首先,通过ADC0832对外部电压进行模数转换,然后通过时钟线、数据线和控制使能线与单片机相连。而后,单片机通过八根数据线与四个控制线与四位数码管进行连接,用于显示测量到的电压。另外,单片机通过TX给外部发送数据,PC端可以通过USB-TTL模块直接接收到电压值。最后,关于多量程设计,量程方面我采用了电阻分压方式,这样就可以实现大量程的测量,量程选择方面我使用了开关与继电器实现。

3.2主要元器件介绍

3.2.1 ADC0832

ADC0832 是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。芯片引脚图如图1所示。其引脚分别为CS(片选使能)、CH0(模拟输入通道0)、CH0(模拟输入通道1)、GND(供电及参考电压低电位)、DI(数据信号输入)、DO(数据信号输出)、CLK(时钟信号输入)以及VCC/VREF(电源及参考电压输入)其时序逻辑图如图2所示。由图2可知一般情况下ADC0832与单片机连接应使用四根控制信号线,分别为CS、DO、DI和CLK。但由图2可知DO与DI其中一个作用时,另一个则不作用,因此在进行硬件电路设计时可以将DO和DI连接在同一个I/O口上。

ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量(低精度)转换要求。

图1

图2

3.3.2 STC89C52RC

STC89C52RC 单片机是宏晶科技推出的超强抗干扰、高速、低功耗单片机,指令代码完全兼容传统8051单片机。其最高频率时钟为80 MHz, Flash 存储器为8KB, RAM为512 bit,E2PROM为2KB,可反复擦写编程。工作温度为-40℃~+85℃, 内置看门狗电路,内部电源供电系统、时钟电路和复位电路都经过特殊处理。“6 时钟/机器周期”和“12 时钟/机器周期”可在ISP编程时反复设置。其DPIP封装引脚图如图3所示。实物图如图4所示。

 图3

 图4

3.2.3 四位共阳极数码管

图5所示即为该系统所采用的共阳极数码管。该数码管共有12个引脚,其中8个为数据引脚,4个为控制引脚。数据引脚作用为向数码管输入要显示的数据,控制引脚作用为分别控制四个数码的亮和灭。图6所示及为其内部电路图。

图5

图6

3.3 原理图及功能电路介绍

整体原理图如图7所示。该电路可以分为三个部分,分别为:模数转换部分、显示部分和数据处理部分。

图7

3.3.1 显示部分

图8

图8所示即为显示部分电路图。该部分实现的功能是显示测量到的树值。数码管的八个的数据引脚引出接到单片机的P0上,用于接受显示数据。四个控制引脚分别接在四个PNP管的集电极上,然后PNP管的基极连接单片机的四个I/O口,发射极接VCC。这里控制引脚不直接接单片机上的原因是:单片机I/O无法提供大电流,不能作为共阳极数码管的控制信号,因此需要接三极管方大电流。

3.2.2模数转换部分

图9

图9所示即为模数转换部分电路图。该部分的主要作用是测量电压值并以数字量传输到单片机中。该部分可以分为两个子部分,分别为测量部分和量程控制部分。测量部分由ADC0832组成,它通过三根线将CS、CLK、DO与DI与单片机相连。另外,其CH0接到量程控制部分读取电压。量程控制部分主要由继电器、开关和电阻组成。开关连接一个I/O口和继电器。继电器选择接入CH0的信号,当为导通时,量程为0~5V,外部无其他电路,当为不导通时,量程为0~50V,外部接一个电阻分压电路。

3.2.3 数据处理部分

中央数据处理部分由89C52RC构成。该部分将上述两部分整合并控制。MCU的P0口接数码管的数据线;P1.0~P1.3接数码管控制部分(三极管的基极);P1.4接量程控制部分的开关,作用是读取当前量程选择情况;P2.0~P2.2分别接ADC0832的CS、CLK和DO/DI;TX接外部通信设备,接受当前的电压测量值。

4. 软件设计

4.1 设计思想

单片机启动后,先初始化串口,并定义缓存变量,然后进行while死循环。在死循环中,先调用AD转换函数读一次“电压值”,但这时得到的并不是真正的电压值,所以需要进行精度修正,将范围0~255的范围修正为0~500。再判断当前量程选择情况,根据它来判断显示与串口数据的小数点位置,最后将数据显示并通过串口发送。

4.2软件流程图

图10

5. 调试运行

5.1 小量程测量结果

图11为小量程电压的仿真测量结果。左下方电压表为ADC0832输入的电压,为4.32V。而图中数码管读到的值为4.33V,串口发送的数据也为4.33V。因此,可以得出结论,在小量程的仿真测试中,电压测量误差非常小,可忽略不计。

图11

参考书目

[1] 肖金球. 单片机原理与接口技术.[M].北京:清华大学出版社,2004.12

[2] 郭天祥. 新概念51单片机C语言教程: 入门、提高、开发、拓展全攻略[M]. 电子工业出版社, 2009.

[3] 康华光. 电子技术基础. 模拟部分[M]. 高等教育出版社, 1999.


资源下载

如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~

标签:量程,proteus,引脚,CLK,数码管,源码,单片机,ADC0832,AT89C52
From: https://blog.csdn.net/m0_56379011/article/details/140305603

相关文章

  • 源码编译安装 LAMP
    源码编译安装LAMPApache网站服务基础Apache简介安装httpd服务器httpd服务器的基本配置Web站点的部署过程httpd.conf配置文件构建虚拟Web主机基于域名的虚拟主机基于IP地址、基于端口的虚拟主机MySQL的编译安装构建PHP运行环境安装PHP软件包设置LAMP组......
  • 基于Spring Boot的旅游信息推荐信息系统设计与实现(源码+lw+部署+讲解)
    技术指标 开发语言:Java框架:SpringBoot+JSPJDK版本:JDK1.8数据库:MySQL5.7数据库工具:Navicat16开发软件:IDEAMaven包:Maven3.6.3浏览器:IE浏览器 功能描述旅游信息推荐信息系统设计与实现的功能主要分为俩部分:前台界面管理和后台数据库管理。它的主要功能包括:对旅游新闻......
  • 【一文带你了解RAG(检索增强生成) | 概念理论介绍+ 代码实操(含源码)】
    文末有福利!引言针对大型语言模型效果不好的问题,之前人们主要关注大模型再训练、大模型微调、大模型的Prompt增强,但对于专有、快速更新的数据却并没有较好的解决方法,为此检索增强生成(RAG)的出现,弥合了LLM常识和专有数据之间的差距。今天给大家分享的这篇文章,将介绍RAG的概......
  • 【全开源】2024最新版在线客服系统PHP源码(全新UI+终身使用+安装教程)
    PHP在线客服系统主要功能:1.用户信息用户提交:新用户可以通过表单留言输入相关信息,如用户名、密码、邮箱等,完成后获得唯一的用户ID和密码。2.客服管理客服信息管理:管理客服人员的基本信息,如姓名、工号、权限等。客服工作状态:实时显示客服人员的在线/离线状态,方便客户选择合......
  • springboot智慧医疗数据共享和个性化推荐系统-计算机毕业设计源码05875
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 智慧医疗数据共享和个性化推荐系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程2.2.3数据删除流程2.3 系统功能分析2.3.1功能性分析2.4 系......
  • springboot煤炉网站代切系统-计算机毕业设计源码06656
    目  录摘要1绪论1.1课题目的与意义1.2国内外研究现状1.3论文结构与章节安排1.4Springboot框架介绍2 Springboot煤炉网站代切系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2 系统功能分析2.2.1......
  • NodeJS蔬菜自产零售混合销售平台-计算机毕业设计源码10149
    摘 要随着移动互联网的快速发展,购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一,在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序,用户可以通过它方便地浏览、选择和购买蔬菜。本文介绍了一个......
  • springboot非物质文化遗产管理系统-计算机毕业设计源码16087
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5修改信息流程2.2.6删除信息流程2.3 系统......
  • Dubbo源码学习
    学习Dubbo框架与手写模拟相关内容一、存在的意义Dubbo:解决分布式系统的复杂性,实现服务治理(使服务之间的调用变的简单)和自动注册与发现,简化服务调用。二、调用过程Dubbo的使用接口代表一种服务,对应不同的实现,使服务之间的依赖变的简单。服务消费者通过ClassPassXmlApplicati......
  • 【TWVRP】蚁群算法求解带时间窗的车辆路径规划(目标函数:最短距离)【含Matlab源码 4969期
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......