找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5649|回复: 1
打印 上一主题 下一主题
收起左侧

用51单片机+xpt2046将电位器上的模拟电压转换成分辨率为12位的数字信号

[复制链接]
跳转到指定楼层
楼主
ID:368372 发表于 2018-7-10 08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:195723 发表于 2020-4-30 10:58 | 只看该作者
前来学习,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表