1 实验现象(每间隔1s自动切换模拟信号采集通道,通过数码管显示测量的电压值)

2 硬件设计

3 程序设计

3.1 主函数

#include <REG52.H>
#include "DisplaySmg.h"
#include "ADC0809.h"
#include "Timer0.h" unsigned char adc_result = 0; //ADC转换后直接采集的数据
int adc_result_show = 0; //线性标度变化
unsigned char adc_flag = 1; //1s时间的标志信号,用来自动切换通道
unsigned char channel = 0; //通道号0~7 void disp_num(void) //显示四位十进制数
{
LedBuf[0]= channel; //通道号
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)
{
if(adc_flag==1) //1S时间标志信号
{
adc_flag = 0; //清零,使用Timer0计时
adc_result = ADC_Conv(channel); //通过ADC采集通道channel输入端数据
adc_result_show = adc_result*1.0*100*5/255; //数据变换处理(线性标度变换)
disp_num(); //显示数据
channel++; //切换下一个通道
if(channel>7) channel = 0;
}
}
} //1ms定时,动态刷新数码管,同时每隔1000ms刷新adc_flag=1
void Timer0_ISR(void) interrupt 1
{
static unsigned int timer0cnt; TR0=0; //关闭定时器
timer0cnt++;
if(timer0cnt>=1000)
{
timer0cnt = 0;
adc_flag = 1;
}
DisplaySmg(); //每过1ms,刷新一次数码管显示函数
TL0 = 0x66; //设置定时初始值,定时1ms
TH0 = 0xFC; //设置定时初始值,定时1ms
TR0=1; //打开定时器
}

3.2 ADC0809模数转换函数

#ifndef __ADC0809_H__
#define __ADC0809_H__ #include <reg52.h> #define ADC_DATA P3 sbit ADDR_A = P1^0;
sbit ADDR_B = P1^1;
sbit ADDR_C = P1^2;
sbit START = P1^4;
sbit EOC = P1^5;
sbit OE = P1^6; unsigned char ADC_Conv(unsigned char channel); #endif
#include "ADC0809.h"

void ADC_SetChannel(channel)
{
switch(channel)
{
case 0: ADDR_A = 0; ADDR_B = 0; ADDR_C = 0; break;
case 1: ADDR_A = 1; ADDR_B = 0; ADDR_C = 0; break;
case 2: ADDR_A = 0; ADDR_B = 1; ADDR_C = 0; break;
case 3: ADDR_A = 1; ADDR_B = 1; ADDR_C = 0; break;
case 4: ADDR_A = 0; ADDR_B = 0; ADDR_C = 1; break;
case 5: ADDR_A = 1; ADDR_B = 0; ADDR_C = 1; break;
case 6: ADDR_A = 0; ADDR_B = 1; ADDR_C = 1; break;
case 7: ADDR_A = 1; ADDR_B = 1; ADDR_C = 1; break;
default: break;
}
} unsigned char ADC_Conv(unsigned char channel)
{
unsigned char adc_result; OE = 0; //数据输出允许信号,高电平有效
START = 0; //ADC转换启动信号,高电平有效, 电路中与ALE(地址锁存允许信号)连在一起 ADC_SetChannel(channel); //选通道 START = 1; //上升沿,同时将ADC内部的寄存器清零
START = 0; //产生一定的脉冲,Typ=100ns,下降沿启动AD转换 while(EOC==0); //查询方式,ADC转换结束信号,EOC=1,转换结束
// DelayXms(1); //延时等待方式
OE = 1; //数据更新到输出端口
adc_result = ADC_DATA; //单片机读取数据
OE = 0; //本次过程结束
return adc_result;
}

3.3 数码管动态显示函数

#ifndef __DisplaySmg_H__
#define __DisplaySmg_H__ #include <REG52.H> #define GPIO_SEG P0 //段选端
#define GPIO_SEL P2 //位选端 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 code LedAddr[]={0xfe,0xfd,0xfb,0xf7}; //数码管位选
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; //段码
GPIO_SEL = LedAddr[0]; //位选
i++;
break;
} case 1:
GPIO_SEG = 0x00;
if(DotDig1==1) //小数点
{
temp = LedData[LedBuf[1]] | 0x80;
}
else
{
temp = LedData[LedBuf[1]];
}
GPIO_SEG = temp;
GPIO_SEL = LedAddr[1];
i++;
break;
case 2:
GPIO_SEG = 0x00;
if(DotDig2==1) //小数点
{
temp = LedData[LedBuf[2]] | 0x80;
}
else
{
temp = LedData[LedBuf[2]];
}
GPIO_SEG = temp;
GPIO_SEL = LedAddr[2];
i++;
break;
case 3:
GPIO_SEG = 0x00;
if(DotDig3==1) //小数点
{
temp = LedData[LedBuf[3]] | 0x80;
}
else
{
temp = LedData[LedBuf[3]];
}
GPIO_SEG = temp;
GPIO_SEL = LedAddr[3];
i=0;
break;
default:break;
}
}

3.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; //中断总开关
}

4 参考来源

(1)单片机应用——ADC0809查询方式实现8路模拟信号的AD转换_哔哩哔哩_bilibili

简易数字电压表+ADC0809+程序查询方式实现8路数据转换的更多相关文章

  1. [SAM4N学习笔记]按键程序(查询方式)

    一.准备工作:      将上一节搭建的工程复制一份,命名为"5.key scanf".这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入. 二.程序编写:      ...

  2. zigbee学习之路(六):Time3(查询方式)

    一.前言 通过上次的学习,相信大家对cc2530单片机的定时器的使用有了一定的了解,今天我们来介绍定时器3的使用,为什么介绍定时器3呢,因为它和定时器4功能是差不多的,所以学会定时器3,就基本掌握了c ...

  3. zigbee学习之路(五):定时器1(查询方式)

    一.前言 今天,我们来学习几乎所有单片机都有的功能,定时器的使用,定时器对单片机来说是相当重要的,有了它,单片机就可以进行一些复杂的工作. 二.原理与分析 谈到定时器的控制,我们最先想到的是要给它赋初 ...

  4. hibernate 查询方式汇总

    主要摘自  http://blog.sina.com.cn/s/blog_7ffb8dd501014a6o.html ,http://blog.csdn.net/xingtianyiyun/artic ...

  5. mybatis mapper xml文件的导入方式和查询方式

    mybatis mapper xml文件的导入方式和查询方式 ssm框架 Mybatis  mapper与SQLSession的关系 每个基于MyBatis的应用都是以一个SqlSessionFact ...

  6. Redis查询&JDBC查询&Hibernate查询方式的效率比较...

    比较三种查询方式查询效率对比...我是用的JavaWeb的方式通过通过JSP页面查询的填写查询的参数...给予反馈.... 整个demo的下载地址:http://files.cnblogs.com/f ...

  7. Hibernate学习笔记(五)—— Hibernate查询方式

    一.对象图导航查询 对象图导航查询方式是根据已经加载的对象,导航到他的关联对象.它利用类与类之间的关系来查询对象.比如要查找一个联系人对应的客户,就可以由联系人对象自动导航找到联系人所属的客户对象.当 ...

  8. Hibernate查询方式汇总

    Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种.但是细分可以有如下几种: 一.HQL查询方式    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的 ...

  9. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  10. Hibernate 查询方式(HQL/QBC/QBE)汇总

    作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...

随机推荐

  1. 禁止后退Js 兼容各个浏览器

    <script src="${ctxPath}/media/lib/jquery.history.js"></script> <script> ...

  2. YOLOv5报错:AttributeError: ‘Upsample‘ object has no attribute ‘recompute_scale_factor‘ 的解决方案

    YOLOv5报错:AttributeError: 'Upsample' object has no attribute 'recompute_scale_factor' 的解决方案 错误代码: Fil ...

  3. 分布式事务-2PC

    目录 1. 2PC是什么 2. 2PC流程 3. 2PC的使用场景 4. 2PC的问题 5. 2PC的实现 5.1. XA 5.2. Seata的XA模式 6. 参考 1. 2PC是什么 保证强一致性 ...

  4. Windows Server ServerManager.exe 应用程序错误 0xc0000135 ServerManager.exe 无法启用

    将 Windows Server  .NET Framework移除. IIS卸载后, Server Manager.exe.事件查看器等都无法正常开启. 解决方案: 在运行中,输入CMD,打开命令控 ...

  5. Flink初体验-批处理与流处理

    一.环境准备 本机环境:jdk11.scala2.12.maven3.6 新建一个maven项目,pom如下 <?xml version="1.0" encoding=&qu ...

  6. Docker永远在“docker desktop starting .”Settings 一直在转圈

    一些用户抱怨Docker 需要很长时间才能启动.这是一个众所周知的问题,用户多年来一直报告.因此,如果您是遇到此问题的用户之一,请不要担心.您可以通过在计算机上执行这些简单的步骤轻松解决问题. 有些用 ...

  7. ARIMA 模型简单介绍

    简介 中文名字叫做 差分(I) 自相关回归(AR) 移动平均(MA) 模型 总而言之 根据以前的数据预测新数据 比较常用的模型 比较好的视频资料 https://www.bilibili.com/vi ...

  8. SciTech-Mathmatics - Advanced Linear Algebra(高等线性代数): Vector、Vectors、Vector Space 和 Matrix 的奇妙联系

    SciTech-Mathmatics - Advanced Linear Algebra(高等线性代数): Vector.Vectors.Vector Space和 Matrix 的奇妙联系 \(\l ...

  9. SciTech-EECS-Circuits-Power Electrics(功率器件): 等离子体(电弧:大功率)效应(正负极+数控脉冲放电时间 实现 等离子切割机(逆变式 + 高压引弧式)电解/电镀/电子显微、显像/电火花线切割/特斯拉线圈 ) + WEDM(电火花线切割数控加工)

    SciTech-EECS-Circuits-Power Electrics(功率器件): 特斯拉线圈 : 电(弧)离效应(正负极+数控脉冲放电时间 实现 电解/电镀/电子显微.显像/电火花线切割) + ...

  10. linux操作系统中rpm离线包的下载和安装--九五小庞

    前言 在Linux操作系统中当需要安装相关程序包时,如果有网络的情况下,可以直接通过yum源命令直接进行下载安装,比较简单方便.但是在没有互联网的情况下,需要下载对应的rpm包,进行离线安装. 1.下 ...