数字编码电位器c语言,单片机小白学习之路(三十八)---AD转换电位器编码

目标:点位器的检测

xpt2046.c

#include "xpt2046.h"

void SPI_Write(uchar dat) //使用SPI写入数据

{

uchar i;

CLK = 0;

for(i=0;i<8;i++){

DIN = dat>>7; //放置最高位

dat <<=1;

CLK = 0; //上升沿放置数据

CLK = 1;

}

}

//写入数据通常是再一个for循环里先写入再移位

uint SPI_Read()

{

uint i,dat=0;

CLK = 0;

for(i=0;i<12;i++){

dat <<=1;

CLK = 1;

CLK = 0;

dat |= DOUT;

}

return dat;

}

//读数据通常是在一个for循环里先移位再传入数据(符号是”|=“)

uint Read_AD_Data(uchar cmd)

{

uchar i; //循环用

uint AD_Value; //接受数据

CLK = 0;

CS = 0; //片选开始

SPI_Write(cmd); //往芯片里写入通道地址选择是哪种传感器,即控制命令

for(i=6;i>0;i--); //发送一个时钟周期,清除BUSY

CLK = 1;

_nop_();

_nop_();

CLK = 0;

_nop_();

_nop_(); //以上到for都是延时是给芯片转换时间

AD_Value = SPI_Read(); //得到芯片xpt2046输出的数字信号

CS = 1; //关闭片选

return AD_Value;

}

main.c

#include "reg52.h"

#include "xpt2046.h"

typedef unsigned int u16;

typedef unsigned char u8;

sbit LSA = P3^0;

sbit LSB = P3^1;

sbit LSC = P3^3; //数码管的位选

u8 disp[4]; //用于保存数据的数组

u8 code smgduan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u16 i) //延时函数

{

while(i--);

}

void datapros()

{

u16 temp;

static u8 i;

if(i==50){

i=0;

temp = Read_AD_Data(0x94);

}

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]; //个位

}

void DigDisplay()

{

u8 i; //用于for循环

for(i=0;i<4;i++){

switch(i){

case(0):LSA=0;LSB=0;LSC=0;break;

case(1):LSA=1;LSB=0;LSC=0;break;

case(2):LSA=0;LSB=1;LSC=0;break;

case(3):LSA=1;LSB=1;LSC=0;break;

}

P0 = disp[i]; //发送数据

delay(100); //间隔一段时间扫描

P0 = 0x00; //消隐

}

}

void main()

{

while(1){

datapros(); //数据处理函数

DigDisplay(); //数码管显示函数

}

}

cpt2046.h

#ifndef _xpt2046_h_

#define _xpt2046_h_

#include#include#ifndef uint

#define uint unsigned int

#endif

#ifndef uchar

#define uchar unsigned char

#endif

#ifndef ulong

#define ulong unsigned long

#endif

sbit DOUT = P3^7; //数据输出端口

sbit CLK = P3^6; // 时钟

sbit DIN = P3^4; //数据输入端

sbit CS = P3^5; //片选

uint Read_AD_Data(uchar cmd);

uint SPI_Read(void);

void SPI_Write(uchar dat);

#endif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值