• 51单片机学习:ADC模数转换实验--光敏电阻AD采集


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


    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能         : 主函数
    * 输    入       : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {    
        u16 adc_value=0;
        u8 adc_buf[4];

        while(1)
        {                
            adc_value=xpt2046_read_adc_value(0xA4);//测量光敏电阻
            adc_buf[0]=gsmg_code[adc_value/1000];
            adc_buf[1]=gsmg_code[adc_value%1000/100];
            adc_buf[2]=gsmg_code[adc_value%1000%100/10];
            adc_buf[3]=gsmg_code[adc_value%1000%100%10];
            smg_display(adc_buf,5);        
        }        
    }

    #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--);
    }

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

  • 相关阅读:
    重装系统后电脑耳机插前面没有声音输出怎么办?
    我的pip python库-20220815
    Java SE 22 新增特性
    大龄程序员三战考研变身考研战神
    MyBatis Generator自动生成MyBatis的mapper接口、XML映射文件以及实体类的代码生成工具
    数据仓库与数据挖掘(实验一2024.4.24)
    CentOS下安装MongoDB
    二分查找处理不当引起的堆栈溢出异常
    设计模式-适配器模式(Adapter)
    Gartner发布中国人工智能软件市场指南,激烈竞争下走向差异化
  • 原文地址:https://blog.csdn.net/qq_63964231/article/details/126917161