汇编语言与接口技术——AD转换及PWM控制

这篇具有很好参考价值的文章主要介绍了汇编语言与接口技术——AD转换及PWM控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 实验要求

实验目的:

  1. 掌握SPI总线的使用方式
  2. 掌握xpt2046 AD转换芯片的工作原理
  3. 掌握SPI总线方式实现基于xpt2046的AD转换
  4. 掌握PWM控制功率的方式

实验内容:

学习xpt2046 AD转换芯片的工作原理,利用SPI总线实现基于该芯片的AD转换,调节滑动变阻器将AD转换的结果显示在数码管上,同时利用PWM控制方式实现LED灯的亮度联动,当AD结果增大时,亮度增加,反之,亮度减小。

二、 实验设计

1.整体思路

初始化: 定义相关的IO口和数据类型。

SPI通信: 实现SPI协议的写和读操作,用于与XPT2046通信。

读取AD数据: 通过SPI通信,发送命令并读取XPT2046返回的AD转换数据。

显示数据: 将读取到的数据显示到数码管上。

2.流程图

汇编语言与接口技术——AD转换及PWM控制,51单片机

图 1 算法设计流程图

  1. 主要模块设计思路及分析

一、SPI_Write函数:

通过循环将8位数据一位一位地发送到DIN线上。

利用CLK的上升沿将数据放置到DIN上。

二、SPI_Read函数:

通过循环从DOUT线上一位一位地读取12位数据。

利用CLK的下降沿将数据从DOUT读取进来。

三、Read_AD_Data函数:

通过SPI通信发送命令给XPT2046。

等待转换完成,并清除BUSY标志。

读取转换后的AD数据。

四、DigDisplay函数:

用于控制数码管的显示。

通过循环和switch语句选择要点亮的数码管,并发送要显示的数据。

五、readData函数:

这个函数似乎没有完全给出,但从名称来看,它应该是用于读取某种数据(可能是触摸屏的数据)并可能进行进一步的处理。

三、 实现效果

汇编语言与接口技术——AD转换及PWM控制,51单片机

图 2 小于1000显示3个灯

汇编语言与接口技术——AD转换及PWM控制,51单片机

图 3 大于1000显示4个灯

汇编语言与接口技术——AD转换及PWM控制,51单片机

图 4 大于2000显示5个灯

汇编语言与接口技术——AD转换及PWM控制,51单片机

图 5 大于3000显示6个灯

  • 总结

代码主要实现了与XPT2046触摸屏控制器的SPI通信,能够发送命令并读取转换后的AD数据,然后将数据显示到数码管上。需要注意的是,代码中的readData函数没有完全给出,可能需要根据实际需求进行完善。

附录:

#ifndef   __XPT2046_H_

#define   _._XPT2046_H_

//---包含头文件---//

#inclu.de<reg52.h>

#include<intrins.h>

//---.重定义关键词---//

#ifndef uchar

#defin.e uchar unsigned char

#endif

#ifndef uint

#define uint  unsigned int

#endif

#ifndef ulong

#define ulong  unsigned long

#endif

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

//---定义使用的IO口---//

sbit DOUT = P3^7;     //输出

Sbi.t CLK  = P3^6;     //时钟

sbit DIN  = P3^4;     //输入

sbit CS   = P3^5;     //片选

sbit LSA=P2^2;

Sbit. LSB=P2^3;

sbit LSC=.P2^4;

sbit LS5=P2^5;

sbit L.S6=P2^6;

sbit LS7=P2^7;

u8 DisplayData[8];

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

uint Read_AD_Data(uchar cmd);

uint SPI_Read(void);

void SPI_Write(uchar dat);

#endif

void SP.I_Write(uchar dat)

{

    uchar i;

    CLK = 0;

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

    {

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

        dat <<= 1;

        C.K = 0;            //上升沿放置数据

        CLK = 1;

    }

}文章来源地址https://www.toymoban.com/news/detail-806326.html

uint SPI_Read(void)

{

    uint i, dat=0;

    CLK = 0;

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

    {

        dat <<= 1;

        CLK = 1;

        CLK = 0;

        dat |= DOUT;

    }

    Ret.urn dat;

}

uint Read_A.D_Data(uchar cmd)

{

    Uch.ar i;

    uint AD_Value;

    CLK = 0;

    CS  = 0;

    SPI_Write(cmd);

    for(i=6; i>0; i--);     //延时等待转换结果

    CLK = 1;      //发送一个时钟周期,清除BUSY

    _nop_();

    _nop_();

    CLK = 0;

    _nop_();

    _nop_();

    AD_Value=SPI_Read();

    CS = 1;

    return AD_Value;    

}

void delay.(u16 i)

{

while(i--);

}

void DigDi.splay()

{

    u8 i;

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

    {

        switch(i)    //位选,选择点亮的数码管,

        {

            case(0):

                LSA=0;LSB=0;LSC=0; break;//显示第0位

            case(1):

                LSA=1;LSB=0;LSC=0; break;//显示第1位

            case(2):

                LSA=0;LSB=1;LSC=0; break;//显示第2位

            case(3):

                LSA=1;LSB=1;LSC=0; break;//显示第3位

        }

        P0=DisplayData[3-i];//发送数据

        delay(100); // 延时

        P0=0x00;//消隐

    }

}

void readData()

{

    int cnt,te.mp,lightTime,step;

    if(cnt == 25)

    {

        cnt = 0;

        temp = Read_.AD_Data(0x94);      // 电位器

        DisplayData[0]=smgduan[temp/1000];//千位

        DisplayData[1.]=smgduan[temp%1000/100];//百位

        DisplayData.[2]=smgduan[temp%1000%100/10];//十位

        DisplayData[3]=smgduan[te.mp%1000%100%10];//个位       

        lightTime = temp / step;    // 设置亮灯的时间

    }

    cnt ++;

if(temp<1000){

LSA=0;

LSB=0;

L.SC=0;

LS5=1;

LS6=1;

LS7=1;

}

else if(temp>=10.00&&temp<2000){

LSA=0;

LSB=0;

LSC=0;

LS5=0;

LS6=1;

LS7=1;

}

else if(temp>=2000&&temp<3000){

LSA=0;

LSB=0;

LS.C=0;

LS5=0;

LS6=0;

LS7=1;

}  

else if(temp>=3000){

LSA=0;

LSB=0;

LSC=0;

LS5=0;

LS6=0;

LS7=0;

}     

}

void main() {

    TMOD = 0x02; // 开启中断方式2

    TH0 = 0xa0; // 0.1us

    TL0 = .0xa0;

    TR0 = 1;

    ET0 = 1;

    EA = 1;

    while(1) {

        readData();     // 数据处理

        DigDi.splay();   //数码管显示

    }

}

到了这里,关于汇编语言与接口技术——AD转换及PWM控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 单片机课设———基于51单片机的智能风扇控制器(汇编语言)

    说明:单片机芯片为AT89C52,使用普中开发板,用汇编语言编程。 系统实现了对风扇的控制: (1)控制器面板包括:启/停键、模式选择键、风速键和类型选择键。 (2)模式分为:手动模式和自动温控模式。在温控模式下,风速键和类型选择键无效。 (3)风速分为:强、中

    2024年02月11日
    浏览(20)
  • 汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。

    汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。

    前置知识:汇编语言常用系统功能调用(如果懂直接跳过看题目详解) 格式: 功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。 格式: 功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。 格式: 功能:将DL寄存器中的字

    2024年02月03日
    浏览(50)
  • 汇编语言笔记(一)——汇编语言基础

    汇编语言笔记(一)——汇编语言基础

    一、开发环境 我使用visual studio 2022 preview,其他版本的设置大同小异。 第一步: 打开visual studio,点击“创建新项目”: 第二步: visual studio并没有专门的汇编项目,所以需要挂羊头卖狗肉,选择C++空项目 第三步: 输入项目名称,点击创建 第四步: 鼠标右键单击项目名称—

    2024年02月05日
    浏览(14)
  • 汇编语言—常见汇编指令汇总

    mov    寄存器 ,数据                如:mov ax ,8 mov   寄存器,寄存器              如:mov ax,bx mov   寄存器,内存单元          如:mov ax,[0] mov   内存单元,寄存器          如:mov [0],ax mov   段寄存器,寄存器          如:mov ds,ax add   寄存器,数据

    2024年02月10日
    浏览(9)
  • 5.7 汇编语言:汇编高效乘法运算

    乘法指令是一种在CPU中实现的基本算术操作,用于计算两个数的乘积。在汇编语言中,乘法指令通常是通过 mul(无符号乘法) 和 imul(有符号乘法) 这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多,所以编译器在优化代码时通常会尝试将乘法操作转换为更

    2024年02月11日
    浏览(12)
  • 5.8 汇编语言:汇编高效除法运算

    通常情况下计算除法会使用 div/idiv 这两条指令,该指令分别用于计算无符号和有符号除法运算,但除法运算所需要耗费的时间非常多,大概需要比乘法运算多消耗10倍的CPU时钟,在Debug模式下,除法运算不会被优化,但Release模式下,除法运算指令会被特定的算法经过优化后转

    2024年02月11日
    浏览(10)
  • 5.6 汇编语言:汇编高效数组寻址

    数组和指针都是用来处理内存地址的操作,二者在C语言中可以互换使用。数组是相同数据类型的一组集合,这些数据在内存中是连续存储的,在C语言中可以定义一维、二维、甚至多维数组。多维数组在内存中也是连续存储的,只是数据的组织方式不同。在汇编语言中,实现

    2024年02月11日
    浏览(14)
  • 汇编语言第一讲:计算机的组织架构和汇编语言介绍

    汇编语言第一讲:计算机的组织架构和汇编语言介绍

    第一讲:计算机的组织架构和汇编语言介绍 汇编语言 计算机组织架构 数字电路 术语回顾 数制 数字电路 硬件电路 数字电路的问题 汇编语言的开始 程序的节(sections) 调用操作系统的系统调用 列出文件(Listing files) 汇编和链接 调试汇编程序 反汇编现有的程序 附录 课程资源

    2024年04月09日
    浏览(13)
  • 5.10 汇编语言:汇编过程与结构

    过程的实现离不开堆栈的应用,堆栈是一种后进先出 (LIFO) 的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。 栈是由 CPU 管理的线性内存数组,它使用两个寄存器 (S

    2024年02月11日
    浏览(12)
  • 低级语言汇编真的各个面不如汇编吗?

    低级语言汇编真的各个面不如汇编吗?

    今日话题,低级语言汇编真的各个面不如C语言吗?C语言因其可移植性、开发效率和可读性而在各领域广泛使用,市场占有率极高。然而,汇编语言在特定场景下仍然具有独特优势,稳固地占据一席之地。如果你对这方面感兴趣,我可以分享一套包含各类语言和嵌入式行业教

    2024年02月06日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包