单片机
返回首页

51单片机day7——AD模数转换控制LED

2025-09-28 来源:bilibili

/***

*AD模数转换控制LED

*顺序:

*   1.数值到517以上第一个LED点亮(12位ADC最大值4095/8余7)

*   2.每增加511点亮一个LED(12位ADC最大值是4095分成8份)

*接口:

*   1.P3^4接XPT2046芯片DIN引脚(输入芯片控制数据)

*   1.P3^5接XPT2046芯片CS引脚(片选)

*   1.P3^6接XPT2046芯片DCLK引脚(时钟)

*   1.P3^7接XPT2046芯片DOUT引脚(数据输出)

*   1.电位器接XPT2046芯片AIN0引脚(模拟端输入)

*原理:

*   1.模拟量输入后和输出电压(VREF/2)对比,若大于则置1否则置0

*   2.对比次数是AD模块的位数

*思路:

*   1.VCC接电位器后经过电位器处理的电流输入到XPT2046芯片的AIN0引脚(模拟端输入)

*   2.由数据手册可知XPT2046芯片想进行数模转换应先将片选拉然后在输入芯片控制数据(控制芯片工作方式)经过延时后将转换后的数值读走(串行输出)

*    2.1 时序:写芯片控制数据是串行输入在时钟的上升沿XPT2046芯片读走数据(串行,8位)在延时一个时钟后XPT2046芯片已串行的方式在低时钟时放入转换后的数值

*   3.读出的数据以最大值(4095)/8(8个LED)进行显示

*   4.调节电位器可控制LED亮起的数量

**/

#include "reg52.h"

#include <intrins.h>  //位移的头文件


void fssj(int);     //发送数据

int jssj(void);     //接收的数据

int kzgc(int);     //对发送和接受数据进行控制

void led(int);     //返回数据后对LED进行控制


sbit DIN=P3^4;     //输入芯片控制数据

sbit CS=P3^5;      //片选

sbit DCLK=P3^6;     //时钟

sbit DOUT=P3^7;     //芯片输出的数据



void main()

{

 while(1)

 {

  led(kzgc(0X94));  //AD模块最后返回的数值输入到led控制函数内

 }

}


int kzgc(int fs)  

{

 int js;   //定义一个接收返回数据的变量

 CS=0;    //拉低片选

 fssj(fs);  //向芯片发送数据

 DCLK=0;   //根据时序发送数据后拉低时钟

 DCLK=1;   //延时一个时钟周期(高)

 DCLK=0;   //延时一个时钟周期(低)

 js=sjjs(); //把数据接收函数内返回的值放到js内

 CS=1;    //AD转换结束,拉高片选

 return js; //返回转换后的数值

}


void fssj(char fs)  //发送数据(8位)

{

 int i;

 DCLK=0;      //确保时钟在低电平

 for(i=0;i<8;i++) //发送数据8次(8位数据)

 {

  DIN=fs>>7;   //将8位数据的最高位赋值给AD芯片

  fs<<=1;     //将8位数据左移一位(次高位变成最高位)

  DCLK=0;     //经过一个时钟周期DIN上的数据在上升沿时读走

  DCLK=1;

 }

}


int sjjs()    //接收AD返回的数据

{

int i,fh=0;   //fh:用来接收返回的数据

 for(i=0;i<12;i++)  //接收12次数据(12位数据)

 {

  fh<<=1;      //将接收数据的变量最低位清零

  fh|=DOUT;     //将AD芯片返回的1位数据读走

  DCLK=1;      //经过一次时钟周期AD芯片向DOUT发送新的数据

  DCLK=0;

 }

 return fh;    //返回最后的数据

}


void led(int sj)  //将返回的数据进行判断后点亮LED(每511点亮一个数据)

{

 if(sj>=4095)   //最大位4095LED全亮

 {

  P2=0X00;

 }else if(sj>=3584)

 {

  P2=0X80;

 }else if(sj>=3073)

 {

  P2=0XC0;

 }else if(sj>=2562)

 {

  P2=0XE0;

 }else if(sj>=2051)

 {

  P2=0XF0;

 }else if(sj>=1540)

 {

  P2=0XF8;

 }else if(sj>=1259)

 {

  P2=0XFC;

 }else if(sj>=518) //511+4(4095/8余4)  

 {

  P2=0XFE;

 }else

 {

 P2=0XFF;    //如果上面的数值都不满足则LED全部熄灭

 }

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 设计汽车集群电源

  • 6晶体管H桥

  • 温度控制风扇

  • USB LED调光器

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

    相关电子头条文章