题目:

练习题1:

关于UART串口通信的基本原理和通信过程,书中已经有了较为详细的描述,在此仅仅作一些较为简单的描述。

关于UART串口通讯首先它是串行通讯。对于串行通讯这个概念是相较于并行通讯的。在串行通信中,信息为一位一位的进行传输,而对于并行通信则是几位几位的进行传输。相较串行通讯,并行通讯的传输效率比较高,但是它比较占用硬件资源即它在传输的时候需要多条的数据线路,而对于串行通讯,它仅仅需要一条数据路线即可。               对于UART通讯来说,首先它会有1位的检测位即低电平,通过一个周期的低电平就告诉单片机要有信息传输过来了。在接下来的8个周期中,在每个周期中给高电平和低电平,分别代表了相应位置上为高电平和低电平。而且传递的信息中,属于小端数。即从数字的第1位逐步到第8位。而最后也会一位的校验位为1,即持续一个周期的高电平。 在我描述的该过程之中的每个周期的持续时间为波特率分之一。

练习题2:

对于通过I/O来对UART通讯进行模拟,也就是基本上模拟一下练习题1中的通讯过成。需要注意的是,在单片机接受信号的时候一般取每个周期中中间时刻的电平信号。因为一开始的电平信号处于两个电平信号的交界处信号不是很稳定。所以要去取中间时刻的电平进行分析。

练习题3:

串口模块已经进行了集成化的处理,所以只需要对于相应的寄存器进行配置即可。简化了编程的复杂度,以及提升了编程的效率。关于具体的如何配置相应的寄存器,参考接下来的练习题5和练习题6即可。

练习题4:

对于字符和数字之间的转换,其实就是C语言里面char数据类型和8位整数之间的关系而已。实际上7位已经对于英文字符已经足够完成所以的编码,而第8位一般是取0的。

练习题5:

该练习题为通过串口发送数据来控制流水灯程序是否进行,我设计的为通过串口进行发送数据,如果该数据为偶数则流水灯正常电亮,如果该数据为奇数,小灯不发光。源码如下:

#include <reg52.h>
void BTLV(unsigned int baud);
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;void main()
{EA=1;      //打开总中断BTLV(9600);  //设置波特率为9600ENLED=0;        //使能3-8译码器ADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;while(1){if(SBUF%2==0){         //如果是偶数,打开定时器0中断,ET0=1;}else{                 //如果是基数关闭定时器中断,小灯熄灭P0=0xff; ET0=0;   }   }
}
void BTLV(unsigned int baud)
{SCON=0X50; //配置串口模式TMOD=0x21; //配置定时器模式寄存器TH0=0x00;  //配置好定时器0的初值TL0=0x60;TH1=256-(11059200/12/32)/baud; //配置好定时器1的初值TL1=TH1;ET1=0;             //关闭定时器1中断ET0=0;            //打开定时器0中断ES=1;             //打开串口中断TR1=1;           //打开定时器1TR0=1;             //打开定时器0
}
void Timer_0() interrupt 1
{static unsigned char i=0;TH0=0x00;TL0=0x60;P0=~(0x01<<i);i++;if(i==8)i=0;
}
void Timer_1() interrupt 4
{if(RI){RI=0;}if(TI){TI=0;}
}

效果:

串口_流水灯

练习题6:

和练习5类似,现在给出作者源码,方便大家理解程序(其实因为笔者比较懒而这两个程序又差不多)

/*
*******************************************************************************
*                     《手把手教你学51单片机(C语言版)》
*                    配套 KST-51 单片机开发板 示例源代码
*
*         (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利
*                 获取更多资料请访问:http://www.kingst.org
*
* 文件名:main.c
* 描  述:第11章 作业题6 UART串口控制蜂鸣器的开关
* 版本号:v1.0.0
* 备  注:只当接收到大写字符'B'后改变蜂鸣器的开/关状态
*******************************************************************************
*/#include <reg52.h>sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit BUZZ  = P1^6;unsigned char code LedChar[] = {  //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[7] = {  //数码管+独立LED显示缓冲区0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char T0RH = 0;  //T0重载值的高字节
unsigned char T0RL = 0;  //T0重载值的低字节
unsigned char RxdByte = 0;  //串口接收到的字节
unsigned char flagBuzz = 0; //蜂鸣器控制标志void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);void main()
{EA = 1;       //使能总中断ENLED = 0;    //选择数码管和独立LEDADDR3 = 1;ConfigTimer0(1);   //配置T0定时1msConfigUART(9600);  //配置波特率为9600while (1){   //将接收字节在数码管上以十六进制形式显示出来LedBuff[0] = LedChar[RxdByte & 0x0F];LedBuff[1] = LedChar[RxdByte >> 4];}
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(unsigned int ms)
{unsigned long tmp;  //临时变量tmp = 11059200 / 12;      //定时器计数频率tmp = (tmp * ms) / 1000;  //计算所需的计数值tmp = 65536 - tmp;        //计算定时器重载值tmp = tmp + 13;           //补偿中断响应延时造成的误差T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0;   //清零T0的控制位TMOD |= 0x01;   //配置T0为模式1TH0 = T0RH;     //加载T0重载值TL0 = T0RL;ET0 = 1;        //使能T0中断TR0 = 1;        //启动T0
}
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{SCON  = 0x50;  //配置串口为模式1TMOD &= 0x0F;  //清零T1的控制位TMOD |= 0x20;  //配置T1为模式2TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值TL1 = TH1;     //初值等于重载值ET1 = 0;       //禁止T1中断ES  = 1;       //使能串口中断TR1 = 1;       //启动T1
}
/* 按键扫描函数,需在定时中断中调用 */
void LedScan()
{static unsigned char i = 0;  //动态扫描索引P0 = 0xFF;             //关闭所有段选位,显示消隐P1 = (P1 & 0xF8) | i;  //位选索引值赋值到P1口低3位P0 = LedBuff[i];       //缓冲区中索引位置的数据送到P0口if (i < 6)             //索引递增循环,遍历整个缓冲区i++;elsei = 0;
}
/* T0中断服务函数,完成LED扫描 */
void InterruptTimer0() interrupt 1
{TH0 = T0RH;  //重新加载重载值TL0 = T0RL;LedScan();   //LED扫描显示if (flagBuzz == 0)BUZZ = 1;      //蜂鸣器关闭elseBUZZ = ~BUZZ;  //蜂鸣器鸣叫
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{if (RI)  //接收到字节{RI = 0;  //手动清零接收中断标志位RxdByte = SBUF;  //接收到的数据保存到接收字节变量中SBUF = RxdByte;  //接收到的数据又直接发回,叫作-"echo",//用以提示用户输入的信息是否已正确接收if (RxdByte == 'B')  //接收到大写字母B时改变一次蜂鸣器控制标志{flagBuzz = !flagBuzz;}}if (TI)  //字节发送完毕{TI = 0;  //手动清零发送中断标志位}
}

效果:

串口_蜂鸣器

第11章 UART串口通信 练习题相关推荐

  1. 第11章 UART 串口通信(手把手教你学51单片机pdf部分)

    手把手教你学51单片机-C语言版.pdf  

  2. 【正点原子MP157连载】 第十六章 UART串口通信实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  3. 正点原子linux串口驱动下载,【正点原子Linux连载】第二十一章UART串口通信实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南 (amobbs.com 阿莫电子论坛)...

    示例代码21.3.1 bsp_uart.h文件代码 1  #ifndef _BSP_UART_H 2  #define _BSP_UART_H 3  #include "imx6ul.h&q ...

  4. 单片机:11.UART串口通信

    原文地址:https://blog.csdn.net/Qingzhusshuiyun/article/details/78236798 通信按照传统的理解就是信息的传输与交换.对于单片机来说,通信则与 ...

  5. 【自学51单片机】11 -- UART串口通信

    文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...

  6. NXP(I.MX6uLL) UART串口通信原理————这个未复习

    参考:Linux NXP (I.MX6uLL) UART串口通信原理 作者:一只青木呀 发布时间: 2020-09-20 16:48:33 网址:https://blog.csdn.net/weixi ...

  7. 【正点原子FPGA连载】 第十七章 RS485串口通信实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  8. RS232与UART串口通信

    通信,按照传统的理解就是信息的传输与交换.对于单片机来说,通信则与传感器.存储芯片.外围控制芯片等技术紧密结合,成为整个单片机系统的"神经中枢".没有通信,单片机所实现的功能仅仅局 ...

  9. UART 串口通信实验

            串口是"串行接口"的简称,即采用串行通信方式的接口.串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢.因此串口广泛应 ...

  10. UART串口通信浅谈之(一)--基础概述

    通信按照传统的理解就是信息的传输与交换.UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用 ...

最新文章

  1. 命令行操作svn和git和git
  2. SIC插槽,WSIC插槽,XSIC插槽
  3. jps,jstat,jinfo,jmap,jhat,jstack工具的使用/查看Linux磁盘信息
  4. 计算php代码执行时间长短的类(精确到毫秒)
  5. Vue项目中的初始化
  6. Win11如何更改盘符?Win11更改磁盘驱动器号的方法
  7. 所谓敏感(数字的敏感)
  8. 如何获取屏幕分辨率呢
  9. HTML5 桌面通知:Notification API的基础用法
  10. javascript 常用代码技巧大收集
  11. ahk键盘增强✨✨✨v1.1
  12. 恒生电子2018秋招笔经面经(开发岗)
  13. 登陆apple pay显示无法登录服务器,apple pay无法添加卡怎么办?未能连接到apple pay的解决方法...
  14. mysql和jdbc(韩)
  15. Android Q版本实现自动连接WiFi
  16. 中国药典 android,中国药典在线查询_中国药典v2.05.03安卓版
  17. 我的第一个JS组件-跨浏览器JS调试工具
  18. 现代经济感悟(4)-为什么一分钱一分货,两分货却要一块钱
  19. 剖析KCP以及KCP在游戏中是如何使用的
  20. matplotlib 绘图 中文乱码 0.5

热门文章

  1. 开启windows10系统组策略更新、开启Windows自动更新、关闭自动更新
  2. 小科普:浏览器的神玩法,将开启万能版浏览器?
  3. 关于矩阵相乘顺序的理解(跟旋转没关)
  4. 圣水盆景区是闾山最著名的景点
  5. Linux网络编程 -- Linux常用工具的使用(vim、gcc、gdb、makefile、shell)
  6. 8g内存一般占用多少_你到底需要多大内存?4G、8G还是16G
  7. html毕业论文参考文献,本科毕业论文参考文献规范格式
  8. 数据看板是什么,怎么做?
  9. @Transient注解
  10. android系统分区刷机包,安卓刷机最大最专业最齐全的安卓ROM刷机包资源