简易数字电压表+ADC0832+串行SPI方式实现1路数据转换

发布者:PeacefulOasis最新更新时间:2024-07-26 来源: cnblogs关键字:数字电压表  ADC0832  数据转换 手机看文章 扫描二维码
随时随地手机看文章

1 实物与模型

(1)为什么DO和DI引脚连在一个引脚上?

由于ADC0832在通信时并不是会同时使用DO和DI端口,并且DO和DI端口与单片机的接口是双向的,所以在设计电路中可以用一根线将DO端和DI端连接到一起。

(2)ADC0832的外部连接采用SPI总线结构,这样便把它的连接方式与其他设备统一起来了。ADC0832采用同步串行传输,同步是通过时钟线进行数据同步;串行传输通过DO 数据口一位一位传输数据。


2 实验原理

3 系统设计

传统的51单片机没有配置SPI,但是可以利用其并行接口线模拟SPI串行总线时序,以实现与SPI的器件连接。


4 软件设计


1 ADC0832模数转换函数(结合ADC时序图)


#ifndef __ADC0832_H__

#define __ADC0832_H__


#include

#include


sbit ADC0832_CS_N = P1^0;

sbit ADC0832_CLK  = P1^1;

sbit ADC0832_DI   = P1^2;

sbit ADC0832_DO   = P1^2;


void ADC0832_Init(void);

unsigned char ADC0832_Conv(void);


#endif


#include 'ADC0832.h'


//ADC0832初始化

void ADC0832_Init(void)

{

    ADC0832_CS_N = 1;

    ADC0832_CLK  = 0;

    ADC0832_DI   = 1;

}


unsigned char ADC0832_Conv(void)

{

    unsigned char adc_result1 = 0;        //用来接收第一组数据

    unsigned char adc_result2 = 0;        //用来接收第二组数据

    

    unsigned char i;

    

    //时序1,先将CS使能端置于低电平并且保持低电平直到转换完全结束

    ADC0832_CS_N = 0;    

    ADC0832_CLK  = 0;

    

    //时序2,由MCU向ADC0832时钟输入端CLK输入时钟脉冲,DO/DI端使用DI端输入通道功能选择的数据信号

    

    //在第1个时钟脉冲的下降沿之前DI端必须是高电平,表示启动信号

    ADC0832_DI   = 1;    //START BIT,启动信号

    _nop_();

    ADC0832_CLK  = 1;    //第一个脉冲

    _nop_();            

    ADC0832_CLK  = 0;

    

    //在第2、3个脉冲下降沿之前DI应输入2位数据用于选择通道功能

    ADC0832_DI   = 1;    //单通道输入

    _nop_();

    ADC0832_CLK  = 1;    //第二个脉冲

    _nop_();            

    ADC0832_CLK  = 0;

    

    ADC0832_DI   = 0;    //选择CH0作为模拟信号输入端

    _nop_();

    ADC0832_CLK  = 1;    //第三个脉冲

    _nop_();            

    ADC0832_CLK  = 0;

    

    /*时序3,从第4个脉冲开始由DO输出转换数据最高位,

    随后每个脉冲下降沿DO输出下一位数据,

    直到第11个脉冲时发出最低位数据,一个字节的数据输出完成*/

    

    ADC0832_DI   = 1;    //数据线拉高,主机准备读数据,高位在前

    for(i=0;i<8;i++)

    {

        ADC0832_CLK  = 1;

        _nop_();

        ADC0832_CLK  = 0;    //CLK下降沿

        adc_result1 = adc_result1 << 1;      //左移,0000_0001

        if(ADC0832_DO==1)

            adc_result1 = adc_result1 | 0x01;

    }

    

    /*时序4,随后输出8个位数,与前面数据顺序相反,

    同时第11个脉冲的下降沿输出DATA0,到第19个脉冲时输出完成DATA7*/

    for(i=0;i<8;i++)

    {

        adc_result2 = adc_result2 >> 1;      //右移,1000_000

        if(ADC0832_DO==1)

            adc_result2 = adc_result2 | 0x80;

        ADC0832_CLK  = 1;

        _nop_();

        ADC0832_CLK  = 0;    

    }

    

    //时序5 一次AD转换结束

    ADC0832_CS_N = 1;    

    ADC0832_CLK  = 1;

    ADC0832_DI   = 0;

    

    return (adc_result1 == adc_result2)? adc_result1:0;

}


2 数码管动态显示函数


#ifndef __DisplaySmg_H__

#define __DisplaySmg_H__


#include


#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];

[1] [2]
关键字:数字电压表  ADC0832  数据转换 引用地址:简易数字电压表+ADC0832+串行SPI方式实现1路数据转换

上一篇:【51单片机】I/O口
下一篇:简易数字电压表+ADC0809+程序查询方式实现8路数据转换

推荐阅读最新更新时间:2024-11-03 10:55

stc89c51单片机定时浇水,使用了adc0832+土壤湿度传感
制作出来的定时浇水实物图如下: 单片机源程序如下: /* K1 用于设置选择高位还是低位 左数第四个 K2 用于高/低位减 左数第三个 K3 用于高/低位加 左数第二个 K4用于 设置模式 初始设置其他3按键按下无用 显示at 按下一次之后启动3个按键 显示 mt 左数第一个 当测量值超过设置值或者低于设定值 小灯亮 反之不亮 显示内容 hun :数值% H:数值 mode:模式 L:数值
[单片机]
stc89c51单片机定时浇水,使用了adc0832+土壤湿度传感
基于FPGA的ISA总线/MMи总线数据转换电路设计
    摘要:某型导弹测试设备控制总线为通用的ISA总线,而通信接口总线为非标准的MMи总线。在此以FPGA为核心设计了一种ISA总线/MMи总线转换电路,该电路可以完成2种制式的数据和控制指令转换。给出了转换电路原理框图、FPGA配置电路和地址比较电路原理图。实验结果表明该电路具有转换数据准确,工作可靠等优点。实际应用表明,该电路完全能达到测试设备的要求。 关键词:FPGA;ISA总线;MMи总线;数据转换     总线广泛应用于计算机、工业生产及各种测试设备。ISA总线为IBM公司推出的基于80286CPU的PC/AT微型计算机用扩展总线标准,MMи总线是俄罗斯国内自行设计的专用测试总线,主要用于程控单元模块与MMи总线之间数
[嵌入式]
基于串行外设接口(SPI)的CAN总线隔离扩展设计
一、引言 CAN总线是一种有效支持分布式控制和实时控制的串行数据通信协议 , 它是一种多主总线,网络上任意一个节点均可以在任意时刻主动地向网络上的其它节点发送信息,而不分主从,节点之间有优先级之分,因而通信方式灵活;CAN可以点对点、一点对多点(成组)及全局广播等几种方式传送和接收数据 ;CAN采用非破坏性位仲裁技术,优先级发送,可以大大节省总线冲突仲裁时间,在重负荷下表现出良好的性能。 CAN上的节点数实际可达110个,通信介质可以是双绞线、同轴电缆或光导纤维,直接通信距离最远可达10km(传输速率为5kbps);最高通信速率可达1Mbps(传输距离为40m)。CAN协议的一个最大特点是废除了传统的站地址编码,而
[单片机]
基于<font color='red'>串行</font>外设接口(<font color='red'>SPI</font>)的CAN总线隔离扩展设计
SPI UART TWI 三种串行总线协议的区别
1.SPI(Serial Peripheral Interface:串行外设接口)   管脚:SS/SCK/MOSI(SDO)/MISO(SDI)   结构:一个始终发生器、两个移位寄存器(主从各一个);     使用:初始化(完成对两器件器件SPI使能、主从设置、SCK设置、IO方向、采样沿);              编写数据读/写函数(只要发生一次数据传送,两器件的SPIF位就会置位,从而读写);               必要时加入中断程序;   注意:两个寄存器是互通的,其工作过程见网硬盘,从百度文库搜集。因此主机读从机数据必须发送两个字节,第一个是命令字节,告诉从机要准备数据于从机SPD
[嵌入式]
使用STC12C5204AD单片机的数字电压表
这是一块使用STC12C5204AD数字电压表的制作程序,P0.0-P0.3 共阴数码管位驱动端,P2口为共阴数码管段a-g及dp的段驱动端口,P0、P2口设置为推挽输出方式,段输出加470欧限流电阻,AD为8位,转换电压分度5/256=0.0195312V,分流电阻为实测阻值,AD值*0.0195312v/对地分流电阻,算出分流电流,然后用分流电流*分流电阻与限流电阻之和即为要显示的输入电压值。业余使用,精度已经够用了,比那个小的指针的要准确多了。其中涉及到端口设置的地方大家对照芯片手册更正。 #include STC12C52.H //STC12C5204AD头文件 (6 K) 下载次数:15 #include in
[单片机]
【STM32CubeMX】12,STM32之SPI串行FLASH
1,野火的自带版本讲的还不错,综合多方的资料看比较好 (1) SS ( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从
[单片机]
【STM32CubeMX】12,STM32之<font color='red'>SPI</font><font color='red'>串行</font>FLASH
全新数字世界中模拟IC的ABC
   我们生活在这个世界,依靠视觉、听觉、感觉、嗅觉等感官功能感知一切,而自然界还有光、音、温度、压力等等现象,这一切都是模拟的。而随着电子技术的进步,带来了一个全新的数字世界。我们感知的是模拟信号,电子产品处理的是数字信号,一个完整的信号链,就是来来回回的在数/模之间转换。任何一个信号链系统,都需要传感器来探测来自模拟世界的电压、电流、温度、压力等信号。这些信号被送到放大器中进行放大,然后通过ADC把模拟信号转化为数字信号,经过处理器、DSP或FPGA信号处理后,再经由DAC还原为模拟信号(图1)。在模拟IC中,除了少量的混合信号(约占14%)处理,其余都是标准线性模拟IC。包括电源管理芯片、放大器、数据转换器和接口电路。 图1
[焦点新闻]
最新ADI数据转换器基础知识精华集锦一
电子发烧友网核心提示 :10月24日下午,电子发烧友网参加了亚德诺半导体技术公司(Analog Device Inc.,以下简称ADI)在深圳国际商会中心举办了媒体培训交流会(第二季)。为给电子发烧友网工程师读者全面回顾这次技术研讨会,特别是关于ADI数据转换器的全面介绍,电子发烧友网编辑故整理成文,以飨读者。文章后面还提供了全文PPT下载资料。 本文是关于ADI数据转换器基础知识精华集锦,其中阐述了逐次逼近模数转换器的基本原理、算法及优缺点;ADC和DAC的直流规格和交流规格分析;DAC数模转换器详解及应用举例。 ADI深圳媒体培训交流会留影    一、逐次逼近型模数转换器    1.基本逐次逼近模数转换器
[模拟电子]
最新ADI<font color='red'>数据转换</font>器基础知识精华集锦一
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved