1 实验现象

2 实验原理(略)

3 系统设计(略)

4 硬件设计

5 软件设计

5.1 主函数

#include "DisplaySmg.h"
#include "ADC0809.h"
#include "Timer0.h" unsigned char adc_result = 0;
int adc_result_show = 0;
unsigned char adc_flag = 1; //启动ADC转换的标志信号 void disp_num() //将待显示数据放入缓存区
{
LedBuf[0]= 23; //千位,不显示
LedBuf[1]= adc_result_show/100; //百位
LedBuf[2]= adc_result_show/10%10; //十位
LedBuf[3]= adc_result_show%10; //个位
} void main()
{
Timer0_Init(); //定时计数器T0初始化
EA=1; //中断总开关
DotDig1=1; //点亮第二个数码管的小数点
while(1)
{ adc_result = ADC0809_Conv(); //滤波处理,不能只采样一次,应该进行多次采样数字滤波
adc_result_show = adc_result*1.0*100*5/255; //数据变换处理(线性标度变换)
disp_num(); //显示数据
}
} void Timer0_ISR(void) interrupt 1
{
static unsigned int timer0cnt=0;
TR0=0; //关闭定时器
timer0cnt++;
if(timer0cnt>=500)
{
timer0cnt = 0;
adc_flag = 1; //500ms的标志信号
}
DisplaySmg(); //每过1ms,刷新一次数码管显示函数
TL0 = 0x66; //设置定时初始值,定时1ms
TH0 = 0xFC; //设置定时初始值,定时1ms
TR0=1; //打开定时器
}

5.2 ADC0809转换函数(片外RAM,总线方式连接)

#ifndef __ADC0809_H__
#define __ADC0809_H__ #include <reg52.h>
#include <absacc.h> //含有宏定义的包含语句 #define ADC0809_IN0 XBYTE[0x7ff8] //地址定义语句 sbit EOC = P3^5; unsigned char ADC0809_Conv(); #endif
#include "ADC0809.h"

unsigned char ADC0809_Conv()
{
unsigned char adc_result=0; //选通道,启动ADC转换
ADC0809_IN0 = 0x0; //借助对端口地址执行写操作时序,来满足AD的操作时序
while(EOC==0); //等待ADC转换结束,EOC变为高电平
adc_result = ADC0809_IN0; ////借助对端口地址执行读操作时序,来满足AD的操作时序
return adc_result;
}

5.3 数码管动态显示函数(定时器刷新)

#ifndef __DisplaySmg_H__
#define __DisplaySmg_H__ #include <REG52.H> #define GPIO_SEG P1 //段选端
sbit SEL0 = P3^0;
sbit SEL1 = P3^1;
sbit SEL2 = P3^2;
sbit SEL3 = P3^3; extern unsigned char LedBuf[]; //外部变量声明
extern unsigned char DotDig0,DotDig1,DotDig2,DotDig3; void DisplaySmg(void); #endif
#include "DisplaySmg.h"

unsigned char code LedData[]={    //共阴型数码管的段码表,字符,序号
0x3F, //"0",0
0x06, //"1",1
0x5B, //"2",2
0x4F, //"3",3
0x66, //"4",4
0x6D, //"5",5
0x7D, //"6",6
0x07, //"7",7
0x7F, //"8",8
0x6F, //"9",9
0x77, //"A",10
0x7C, //"B",11
0x39, //"C",12
0x5E, //"D",13
0x79, //"E",14
0x71, //"F",15
0x76, //"H",16
0x38, //"L",17
0x37, //"n",18
0x3E, //"u",19
0x73, //"P",20
0x5C, //"o",21
0x40, //"-",22
0x00, //熄灭 23
};
unsigned char DotDig0=0,DotDig1=0,DotDig2=0,DotDig3=0; //小数点控制位
unsigned char LedBuf[]={22,22,22,22}; //显示缓存区 void DisplaySmg() //四位数码管,考虑小数点
{
unsigned char i; //等价于 "static unsigned char i = 0;"
unsigned char temp;
switch(i)
{
case 0:
{
GPIO_SEG = 0x00; //消影
if(DotDig0==1) //小数点
{
temp = LedData[LedBuf[0]] | 0x80; //点亮小数点
}
else
{
temp = LedData[LedBuf[0]];
}
GPIO_SEG = temp; //段码
SEL0=0; SEL1=1; SEL2=1; SEL3=1; //位选
i++;
break;
} case 1:
GPIO_SEG = 0x00;
if(DotDig1==1) //小数点
{
temp = LedData[LedBuf[1]] | 0x80;
}
else
{
temp = LedData[LedBuf[1]];
}
GPIO_SEG = temp;
SEL0=1; SEL1=0; SEL2=1; SEL3=1;
i++;
break;
case 2:
GPIO_SEG = 0x00;
if(DotDig2==1) //小数点
{
temp = LedData[LedBuf[2]] | 0x80;
}
else
{
temp = LedData[LedBuf[2]];
}
GPIO_SEG = temp;
SEL0=1; SEL1=1; SEL2=0; SEL3=1;
i++;
break;
case 3:
GPIO_SEG = 0x00;
if(DotDig3==1) //小数点
{
temp = LedData[LedBuf[3]] | 0x80;
}
else
{
temp = LedData[LedBuf[3]];
}
GPIO_SEG = temp;
SEL0=1; SEL1=1; SEL2=1; SEL3=0;
i=0;
break;
default:break;
}
}

5.4 定时器T0模块

#ifndef __Timer0_H__
#define __Timer0_H__ #include <reg52.h> void Timer0_Init(void); #endif
#include "Timer0.h"

void Timer0_Init(void)        //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时 ET0 = 1; //定时器0中断开关
// EA = 1; //中断总开关
} //中断服务函数一定是一个没有返回值的函数
//中断服务函数一定是没有参数的函数
//中断服务函数函数名后跟着关键字interrupt
//interrupt n 0~4 5个中断源,8*n+0003H
// 0003H INT0, 00BH T0, 0013H INT1, 001BH T1, 0023H ES
//中断服务函数不能被主程序或者其他程序所调用
//n后面跟着using m(0~3)工作寄存器组 //void Timer0_ISR(void) interrupt 1
//{
// TL0 = 0x66; //设置定时初始值
// TH0 = 0xFC; //设置定时初始值
//}

6 参考来源

(1)单片机应用——ADC0809总线连接方式实现一路模拟信号AD转换_哔哩哔哩_bilibili

简易数字电压表+ADC0809+总线方式实现一路数据转换的更多相关文章

  1. KOA的简易模板引擎实现方式

    上上一期链接--也就是本文的基础,参考KOA,5步手写一款粗糙的web框架 上一期链接--有关Router的实现思路,这份Koa的简易Router手敲指南请收下 本文参考仓库:点我 上一期科普了Rou ...

  2. .NET core实现一个简易的事件协调器(saga)

    在领域驱动设计中,由于领域边界的存在,以往的分层设计中业务会按照其固有的领域知识被切分到不同的限界中,并且引入了领域事件这一概念来降低单个业务的复杂度,通过非耦合的事件驱动来完成复杂的业务.但是事件驱 ...

  3. CAN总线系列讲座第五讲——CAN总线硬件电路设计

    CAN总线系列讲座第五讲--CAN总线硬件电路设计一  实战学习背景 CAN总线节点的硬件构成方案有两种,其中的方案:(1).MCU控制器+独立CAN控制器+CAN收发器.独立CAN控制器如SJA10 ...

  4. 简易版自定义BaseServlet

    这几天在学Java Web,一直在思考Servlet重用的问题,就用java的反射机制实现自定义的简易版BaseServlet; 该方式有点像struts2 利用映射获取前端的参数.有兴趣的同学可以自 ...

  5. Asp.net的post提交方式

    //建立WebRequest对象,url目标地址HttpWebRequest req =(HttpWebRequest)WebRequest.Create(url); //将LoginInfo转换为b ...

  6. 四种常见的 POST 提交数据方式--good

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  7. openrisc 之 Wishbone总线学习笔记——总线互联

    一,总线命名规范 1,wishbone总线接口信号都是高电平有限 2,wishbone接口信号都是以 _i ,或者是 _o 结束.i表示输入, o表示输出. ()表示该信号为总线信号,总线位宽可以大于 ...

  8. Android简易记事本

    此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下: 具体操作就是长按可以删除操作,点击可以进行修改, ...

  9. 第1章 PCI总线的基本知识

    PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器.但是PCI总线.系统总线和处理器体系结构之间依然存在着紧密的联系. PCI总线作为系 ...

  10. POST不同提交方式对应的Content-Type,及java服务器接收参数方式

    POST不同提交方式对应的Content-Type,及java服务器接收参数方式 注:本博客参考了网上的文章结合自己工作总结后所写,主要用于记录自己工作所得,如有错误请批评指正. 简介: Conten ...

随机推荐

  1. [2024.10.27鲜花/csp后记?/rain] 夢をみせて

    [2024.10.27鲜花/csp后记?] 夢をみせて \(csp\)这周非常涨\(rp\)的,牙龈肿了,可能是牙周炎,总之又去了趟医院,自高中后,12.2,刚刚被月轮踩出的数字,很有趣,也许什么时候 ...

  2. ET5 MailBoxComponent 简单介绍

    根据ET5文档介绍,MailBoxComponent组件一般与Actor搭配使用,挂载该组件后,就可以通过Actor发送消息. 官方demo主要有两种使用方式: session.AddComponen ...

  3. 用termius或者cmd等都能够连接上服务器,但是用vscode连接不上???

    最近实验室的服务器进行重装更新了,开始使用wsl,现在直接装Linux系统的Ubantu.服务器的ip.端口.个人名字都没有变.也就相当于之前在termius等远程连接的软件上都能够连上. 我习惯用v ...

  4. Java异常记录(持续记录)

    1.java.lang.IllegalStateException 项目可能停止,不能重新加载.只需重新部署即可.debug过程中遇到的问题. 2.java.lang.IndexOutOfBounds ...

  5. Let’s Encrypt申请证书

    前提 安装好ngixn,并配置解析好你的域名,仅仅留下证书配置处不填写即可. 安装certbot certbot 官方推荐的自动化脚本, 用来申请免费SSL证书的. (certbot中文翻译是 证书机 ...

  6. ble设备的第一次成功例子

    http://www.cnblogs.com/vamei/p/6753531.html#undefined 参考博客 树莓派作为BLE外设 下一步,我们尝试用树莓派进行BLE通信.我们先把一个树莓派改 ...

  7. ETLCloud搭配MySQL | 让关系型数据库更智能

    在现代数据处理领域,ETL技术和云服务正迅速成为数据管理的核心.本文将探讨如何将 ETLCloud 与 MySQL 配合使用,将不同来源的表转移到另一张表中,以最大限度地提升关系型数据库的价值和性能. ...

  8. Skill Discovery | METRA:让策略探索 state 的紧凑 embedding space

    论文标题:METRA: Scalable Unsupervised RL with Metric-Aware Abstraction ICLR 2024 Oral. arxiv:https://arx ...

  9. 国内所说的PACS系统都包含哪些内容-九五小庞

  10. 给 DBA 的七个成长建议-九五小庞

    在采访的最后,谈及一名优秀的DBA应该具备哪些素质或能力时,李建明根据自己十多年的职场经验,分享了他的看法并给出了七个建议: 1. 具备扎实的数据库理论功底. 比如数据库系统的概论.数据库的核心概念. ...