标题: 用51单片机+xpt2046将电位器上的模拟电压转换成分辨率为12位的数字信号 [打印本页]

作者: tiantian97    时间: 2018-7-10 08:46
标题: 用51单片机+xpt2046将电位器上的模拟电压转换成分辨率为12位的数字信号
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int  
#define uchar unsigned char  
unsigned char smgnumber[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,         //数码管
                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint i,j;
uchar qian,bai,shi,ge ;
uint number        ;

sbit AA=P2^2;
sbit BB=P2^3;
sbit CC=P2^4;

sbit DIN=P3^4;                                         // 控制字 输入端口
sbit CS=P3^5;                                          //xpt2046芯片使能端,低电平有效
sbit CLK=P3^6;                                        //芯片时钟输入端,在时钟上升沿或下降沿进行数据输入或输出
sbit DOUT=P3^7;                                        //芯片ad转换后 数字量输出口,串行输出

void delayms(uint);                                
void display(uint);                        
void SPI_write (uchar);
void SPI_read();


void main ()
{

        while (1)
        {        
                CLK=0;
                CS=0;
               
                SPI_write(0X94);                 //输入控制字 0X94
                for(i=6;i>0;i--);                  // 延迟一丁点,等待转换结果
                CLK=1;_nop_();_nop_();           //看时序图需延迟一个时钟周期               
                CLK=0;_nop_();_nop_();


                SPI_read  ();
                CS=1;                  
                 display (number) ;
                 
                                       
        }
}

void delayms(uint t)
{
        for(i=t;i>0;i--)
                for(j=110;j>0;j--);
}

void display (uint number1)
{
        qian= number1/1000;
        bai=number1%1000/100;
        shi=number1%100/10;
        ge=number1%10;

        CC=0,BB=0,AA=0;                           //数码管显示 ad转化后的数字量
        P0=smgnumber[ge];
        delayms(5);
        P0=0;
        CC=0,BB=0,AA=1;
        P0=smgnumber[shi];
        delayms(5);
        P0=0;
        CC=0,BB=1,AA=0;
        P0=smgnumber[bai];
        delayms(5);
        P0=0;
        CC=0,BB=1,AA=1;
        P0=smgnumber[qian];
        delayms(5);
        P0=0;
}

void SPI_write (uchar controlword)
{
        uchar m;
        CLK=0;
        for (m=0;m<8;m++)
        {
                DIN=controlword>>7;                                  //控制位最高位赋给 DIN输入口
                 controlword = controlword<<1 ;           //将控制字次高位变为最高位
                CLK=0;                                                          //串行输入,时钟上升沿将控制字一位一位的输入到芯片。
                CLK=1;

        }
}

void SPI_read  ()
{
        uchar n;
        CLK=0;
        number=0;                                                            ////注意!!!!这点清零很重要,number是全局变量,如果不清0,
                                                                 //下次再进行移位的时候运算的结果得不到我们想要的
        for(n=0;n<12;n++)
        {
                number = number<<1;                                 // number 定义的是全局变量,不赋初值的话全局变量默认初值为0
                CLK=1;                                                        //时钟下降沿 把一位数据 从DOUT口 输出
                CLK=0;
                number = number | DOUT ;            // number 和 DOUT这个串行输出口 进行或运算,实现DOUT端口的值赋给number        
                                                                                //十二个周期后,ad转换的12位数字量全部附给了number
n
        }
}



作者: 伟云科技    时间: 2020-4-30 10:58
前来学习,谢谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1