• 51单片机学习:ADC模数转换实验--电位器电压采集


    实验名称:ADC模数转换实验--电位器电压采集
    接线说明:    
    实验现象:下载程序后,数码管上显示AD模块采集电位器的电压值
    注意事项:                                                                                  
    ***************************************************************************************/
    #include "public.h"
    #include "smg.h"
    #include "xpt2046.h"


    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能         : 主函数
    * 输    入       : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {    
        u16 adc_value=0;
        float adc_vol;//ADC电压值
        u8 adc_buf[3];

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

    #include "smg.h"

    //共阴极数码管显示0~F的段码数据
    u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

    /*******************************************************************************
    * 函 数 名       : smg_display
    * 函数功能         : 动态数码管显示
    * 输    入       : dat:要显示的数据
                       pos:从左开始第几个位置开始显示,范围1-8
    * 输    出         : 无
    *******************************************************************************/
    void smg_display(u8 dat[],u8 pos)
    {
        u8 i=0;
        u8 pos_temp=pos-1;

        for(i=pos_temp;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;
            }
            SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据
            delay_10us(100);//延时一段时间,等待显示稳定
            SMG_A_DP_PORT=0x00;//消音
        }
    }
     

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

    /*******************************************************************************
    * 函 数 名       : xpt2046_wirte_data
    * 函数功能         : XPT2046写数据
    * 输    入       : dat:写入的数据
    * 输    出         : 无
    *******************************************************************************/
    void xpt2046_wirte_data(u8 dat)
    {
        u8 i;

        CLK = 0;
        _nop_();
        for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节
        {
            DIN = dat >> 7;//先传高位再传低位
            dat <<= 1;//将低位移到高位
            CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据
            _nop_();    
            CLK = 1;
            _nop_();
        }
    }

    /*******************************************************************************
    * 函 数 名       : xpt2046_read_data
    * 函数功能         : XPT2046读数据
    * 输    入       : 无
    * 输    出         : XPT2046返回12位数据
    *******************************************************************************/
    u16    xpt2046_read_data(void)
    {
        u8 i;
        u16 dat=0;

        CLK = 0;
        _nop_();
        for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16
        {
            dat <<= 1;
            CLK = 1;
            _nop_();
            CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据
            _nop_();
            dat |= DOUT;//先读取高位,再读取低位。    
        }
        return dat;    
    }

    /*******************************************************************************
    * 函 数 名       : xpt2046_read_adc_value
    * 函数功能         : XPT2046读AD数据
    * 输    入       : cmd:指令
    * 输    出         : XPT2046返回AD值
    *******************************************************************************/
    u16 xpt2046_read_adc_value(u8 cmd)
    {
        u8 i;
        u16 adc_value=0;

        CLK = 0;//先拉低时钟
        CS  = 0;//使能XPT2046
        xpt2046_wirte_data(cmd);//发送命令字
        for(i=6; i>0; i--);//延时等待转换结果
        CLK = 1;
        _nop_();
        CLK = 0;//发送一个时钟,清除BUSY
        _nop_();
        adc_value=xpt2046_read_data();
        CS = 1;//关闭XPT2046
        return adc_value;
    }
     

    #include "public.h"

    /*******************************************************************************
    * 函 数 名       : delay_10us
    * 函数功能         : 延时函数,ten_us=1时,大约延时10us
    * 输    入       : ten_us
    * 输    出         : 无
    *******************************************************************************/
    void delay_10us(u16 ten_us)
    {
        while(ten_us--);    
    }

    /*******************************************************************************
    * 函 数 名       : delay_ms
    * 函数功能         : ms延时函数,ms=1时,大约延时1ms
    * 输    入       : ms:ms延时时间
    * 输    出         : 无
    *******************************************************************************/
    void delay_ms(u16 ms)
    {
        u16 i,j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
    }

    纷传单片机学习资料放在纷传小程序里了,需要的可以加入圈子有资料百度网盘下载地址及提取码。

  • 相关阅读:
    怎么缓存当前的组件?缓存后怎么更新?
    非对称加密——网络安全
    xml类型字段内容解析到表
    拿到已开发好的Vue前端代码如何在本地运行?
    【第一部分 | HTML】1:揭露HTML的神秘面纱
    AI在医疗保健领域:突破界限,救治生命
    外包干了3个月,技术倒退2年。。。
    表单提交,页面滚动到必填项位置
    数据分析是什么?
    A2DP连接总结
  • 原文地址:https://blog.csdn.net/qq_63964231/article/details/126917129