普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5924|回复: 1

[已解决] 51单片机中的AD模数转换程序中的问题

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2020-2-29 23:11:43 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 cityzhao 于 2020-2-29 23:32 编辑

教程中的程序,下面红色的字体我标出来了:temp = Read_AD_Data(0x94),temp为什么是一个4位的十进制数? 而不是12位的接收数据?

12位的接收数据和4位十进制数,在程序中什么地方进行转换的?

我看到Read_AD_Data()函数,其中AD_Value=SPI_Read()而SPI_Read()里是dat |= DOUT,这里的dat返回的值是4位十进制数吗?



/*******************************************************************************
* 函数名         :datapros()
* 函数功能                 :数据处理函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void datapros()
{
        u16 temp;
        static u8 i;
        if(i==50)
        {
                i=0;
                temp = Read_AD_Data(0x94);                //   AIN0 电位器
        }
        i++;
        disp[0]=smgduan[temp/1000];//千位
        disp[1]=smgduan[temp%1000/100];//百位
        disp[2]=smgduan[temp%1000%100/10];//个位
        disp[3]=smgduan[temp%1000%100%10];               



/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
        uchar i;
        uint AD_Value;
        CLK = 0;
        CS  = 0;
        SPI_Write(cmd);
        for(i=6; i>0; i--);         //延时等待转换结果
        CLK = 1;          //发送一个时钟周期,清除BUSY
        _nop_();
        _nop_();
        CLK = 0;
        _nop_();
        _nop_();
        AD_Value=SPI_Read();
        CS = 1;
        return AD_Value;        
}


/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/

uint SPI_Read(void)
{
        uint i, dat=0;
        CLK = 0;
        for(i=0; i<12; i++)                //接收12位数据
        {
                dat <<= 1;

                CLK = 1;
                CLK = 0;

                dat |= DOUT;

        }
        return dat;        
}







最佳答案

首先要搞清楚,12位二进制最大范围是多少,最大是4096,如果从0开始,那么就是4095,所以用一个u16类型的整型变量来保存该值

回复

使用道具 举报

27

主题

337

帖子

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
发表于 2020-3-2 11:11:33 | 显示全部楼层
首先要搞清楚,12位二进制最大范围是多少,最大是4096,如果从0开始,那么就是4095,所以用一个u16类型的整型变量来保存该值
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-3 04:13 , Processed in 0.089389 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表