51单片机-ADC模数转换实验-电压值

一 主要知识点及分析:

        1.这里是用到的XPT2046芯片,芯片详细说明自行查阅;

        2.这里有两种模式,一般外设的转换用的是单端模式,在使用触摸屏的时候我们选择差分模式;

        3.这张图有就是时序图,读写都需要在这上面进行编写代码,

        3.1 写8位代码:主要是将传入的控制命令进行写入;

        3.2 读12位代码;将模拟数据读出来;

        3.3 AD数据转换代码:

二 源代码:

        2.1 代码的格式:

2.2 main.c文件:

#include "public.h"
#include "smg.h"
#include "xpt2046.h"

//主函数
int main()
{
    u8 acd_buf[3];
    u16 acd_vloue = 0;
    float acd_vol; //ACD电压值

    while(1)
    {
         acd_vloue = xpt2046_read_adc_value(0x94); // 测量电位器    
        acd_vol =5.0 * acd_vloue / 4096; //将读取的 AD 值转换为电压
        acd_vloue = acd_vol*10; //放大10倍,即保留小数点一位
        acd_buf[0] = smg_Buf[acd_vloue/10]|0x80;
        acd_buf[1] = smg_Buf[acd_vloue%10];
        acd_buf[2] = 0x3e;//显示99单位 V
        smg_display(acd_buf,6);
    }
    return 0;
}

2.3 public.c文件:

#include "public.h"

void delay_10us(u16 time_num_us) //延时函数定义, time_num_us=1;延时10us;
{
    while(time_num_us--);
}

void delay_ms(u16 time_num_us) //延时函数定义, time_num_us=1;延时1ms;
{    
    int i = 0;
    int j = 0;
    for(i = 0; i < time_num_us; i++)
        for(j = 101; j > 0; j--);
}

2.4 public.h文件:

#ifndef _public_H
#define _public_H

#include "reg52.h"

typedef unsigned char u8; //将系统默认的数据类型进行重定义
typedef unsigned int u16;
typedef unsigned int u32;

void delay_10us(u16 time_num_us); //10us延时函数声明
void delay_ms(u16 time_num_us);   //1ms延时函数声明

#endif

2.5 smg.c文件:

#include "smg.h"


//定义动态数码管显示0-F数组
u8 smg_Buf[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//动态数码管显示函数定义
void smg_display(u8 dat[], u8 pos)
{
    u8 i = 0;

    u8 pos_temp = pos-1; //将输入的数码管第几位然后减1

    for(i = 0; i < 8; i++)
    {
        switch(i)//位选
        {
            case 0: LSC = 1; LSB = 1; LSA = 1; break;
            case 1: LSC = 1; LSB = 1; LSA = 0; break;
            case 2: LSC = 1; LSB = 0; LSA = 1; break;
            case 3: LSC = 1; LSB = 0; LSA = 0; break;
            case 4: LSC = 0; LSB = 1; LSA = 1; break;
            case 5: LSC = 0; LSB = 1; LSA = 0; break;
            case 6: LSC = 0; LSB = 0; LSA = 1; break;
            case 7: LSC = 0; LSB = 0; LSA = 0; break;
        }

        Nixie_Tube_Port = dat[i-pos_temp];//传送段选数据
        delay_10us(100);//延时一段时间,等待显示稳定
        Nixie_Tube_Port = 0x00;
    
    }    
}
 

2.6 smg.h文件:

#ifndef _smg_H
#define _smg_H

#include "public.h"

#define Nixie_Tube_Port P0//通过宏定义数码管的P0端口

sbit LSA = P2^2; //定义74HC138驱动端口
sbit LSB = P2^3;
sbit LSC = P2^4;

//动态数码管显示函数声明
void smg_display(u8 dat[], u8 pos);

//定义动态数码管显示0-F数组声明
extern u8 smg_Buf[17];
           
#endif 

2.7 xpt2046.c文件:

#include "xpt2046.h"
#include "intrins.h"

//adc写8位函数定义
void xpt2046_adc_write(u8 dat)
{
    u8 i = 0;
    DCLK = 0;
    _nop_();

    for(i = 0; i < 8; i++) //循环 8 次,每次传输一位,共一个字节
    {
        DIN=dat>>7; //先传高位再传低位
        dat <<= 1;  //将低位移到高位

        DCLK = 1;   //CLK 由低到高产生一个上升沿,从而写入数据
        _nop_();
        DCLK = 0;
        _nop_();
            
    }        
}
//adc读12位函数定义
u16 xpt2046_adc_read(void)
{
    u8 i = 0;
    u16 dat = 0;

    DCLK = 0;
    _nop_();
    
    for(i = 0; i < 12; i++) //循环 12 次,每次读取一位,大于一个字节数,所以返回值类型是 u16
    {
        dat <<= 1;
        DCLK = 1;
        _nop_();
        DCLK = 0; //CLK 由高到低产生一个下降沿,从而读取数据
        _nop_();
        dat |= DOUT; //先读取高位,再读取低位。
            
    }
    return dat;
                
}
//XPT2046读AD数据函数定义
u16 xpt2046_read_adc_value(u8 cmd) //u8 cmd这里是传入命令字节
{
    u8 i = 0;
    u16 acd_vloue = 0;

    CS = 0; //先拉低时钟
    xpt2046_adc_write(cmd); //发送命令字节
    for(i = 6; i > 0; i--); //延时等待转换结果
    DCLK = 1;
    _nop_();
    DCLK = 0; //发送一个时钟,清除BUSY
    _nop_();
    acd_vloue = xpt2046_adc_read();
    CS = 1; //关闭xpt2046
    return acd_vloue;        
}

2.8 xpt2046.h文件

#ifndef _xpt2046_H
#define _xpt2046_H

#include "public.h"

sbit DOUT = P3^7;//定义ET20465端口
sbit DIN = P3^4;
sbit CS = P3^5;
sbit DCLK = P3^6;

u16 xpt2046_read_adc_value(u8 cmd);//XPT2046读AD数据函数声明

#endif

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ADC0832是一种8位的模数转换器,通常与51单片机结合使用来实现模拟信号的转换为数字信号。通过将模拟信号输入到ADC0832的引脚上,ADC0832会将这个模拟信号转换为相应的8位数字量,并输出给51单片机进行处理和显示。这样可以将模拟信号用数字方式进行处理,例如进行数计算、存储等操作。 这个转换过程需要通过程序来控制,使用C语言编写的程序可以实现ADC0832的控制和数据读取。通过配置相应的引脚连接和读取程序,可以实现将模拟信号转换为数字信号并在51单片机上进行处理和显示。有关如何使用51单片机ADC0832进行AD模数转换的详细信息可以参考引用中提供的工程和仿真示例。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [51单片机控制ADC0808芯片进行AD数模转换.zip](https://download.csdn.net/download/qq_51500064/66913405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C语言实现51单片机ADC0832芯片的AD模数转换实验(含proteus仿真+keil项目)](https://download.csdn.net/download/qq_41488943/12478131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值