当前位置: 首页 > news >正文

东莞市主营网站建设平台模版建站

东莞市主营网站建设平台,模版建站,wordpress默认文章内添加,郑州网站建设(智巢)学习使用的开发板#xff1a;STC89C52RC/LE52RC 编程软件#xff1a;Keil5 烧录软件#xff1a;stc-isp 开发板实图#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…学习使用的开发板STC89C52RC/LE52RC 编程软件Keil5 烧录软件stc-isp 开发板实图 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接口串口成本低、容易使用、通信线路简单可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信极大的扩展了单片机的应用范围增强了单片机系统的硬件实力 51单片机内部自带UART(Universal Asynchronous Receiver Transmitter通用异步收发器)可实现单片机的串口通信 硬件电路 简单双向串口通信有两根通信线(发送端TXD(Transmit Exchange Data)和接收端RXD(Receive Exchange Date)) TXD和RXD要交叉连接设备1的TXD连接设备2的RXD设备1的RXD连接设备2的TXD 当只要单向传输数据时可以只有一根通信线 GND是一定要连接的若两个设备都可以各自供电则不需要连接VCC 当电平标准不一致时还需要加电平转换芯片 电平标准 电平标准是数据1和数据0的表达方式是传输线缆中人为规定的电压与数据的对应关系串口常用的电平标准有如下三种 TTL电平5V表示10V表示0一般用于单片机RS232电平-3 ~ -15V 表示13 ~ 15V 表示0一般用于电脑RS485电平两线压差 2 ~ 6V 表示1-2 ~ -6V 表示0(差分信号)一般用于CAN总线 前两个通信距离都较近一般只有十几米距离过远传输的数据就很容易出错而RS485通信距离远信号可靠性高传输距离可达1KM以上 相关术语 全双工通信双方可以在同一时刻互相传输数据 半双工通信双方可以互相传输数据但同时间只能有一段发送另一端接收必须分时复用一根数据线 单工通信双方只能一方发送到另一方不能反向传输。比如遥控器控制电视只能遥控器向电视发送数据 异步通信双方各自约定通信速率同步通信双方靠一根时钟线来约定通信速率 数据传输是依靠高低电平的也就是电平协议。比如如下两个数据 看电平都是从高电平变为低电平但是如果通信速率不一样则获取的数据不一样 通信速率快10可能会被解析为1100通信速率慢1100也可能会被解析为10。 所以约定好通信速率很重要 总线连接各个设备的数据传输线路(类似一条马路把路边的住户连接起来使住户可以相互交流) 常见通信接口比较 UART为本节学习的串口通信接口I2C板子上的C24C02使用该串口SPI板子上的DS1302使用非标准SPI1-Wire板子上的DS18B20使用该串口 常见的还有CAN总线和USBCAN总线常用于汽车领域 UART 51单片机的UART STC89C52有1个UARTRXD和TXD分别和P3.0和P3.1这两个I/O口共用同一个引脚 STC89C52的UART有四种工作模式 模式0同步移位寄存器 模式18位UART波特率可变(常用) 模式29位UART波特率固定 模式39位UART波特率可变 串口参数及时序图 波特率串口通信的速率(发送和接收各数据位的间隔时间)校验位用于数据验证一定程序可以知道数据是否错误也需要双方提前协商统一校验。常用的校验如01校验奇偶校验。9位UART就是多了一位校验位停止位用于数据帧间隔发送多个数据如何间隔两个数据就使用停止位 波特率就是上述异步双方要约定好的如何对数据进行采样 串口收发数据都是从低位开始 串口模式图 简单的串口模式图 UART是集成在单片机内部的通过TXD引脚发送数据RXD引脚接收数据 UART可以分为三个部分中间为定时器T1——控制波特率左侧绿框的SBUF用于收发数据右侧为中断系统 SBUF串口数据缓存寄存器物理上是两个独立的寄存器但占用相同的地址。写操作时写入的是发送寄存器读操作时读出的是接收寄存器 完整的串口和中断系统模式图如下 下面通过介绍相关寄存器来讲述串口通信的原理 串口相关寄存器 串行口控制寄存器SCON和PCON STC89C52系列单片机的串行口设有两个控制寄存器串行控制寄存器SCON和波特率选择特殊功能寄存器PCON PCON 电源控制寄存器可能是电源控制还有剩下比特位所以波特率选择和帧错误控制位也集成其中减少资源消耗 格式如下 我们只要关注SMOD 和 SMOD0 即可 SMOD波特率选择位。当软件置SMOD 1时使串行通信方式1、2、3的波特率加倍SMOD 0则不加倍。复位时SMOD 0SMOD0帧错误检测有效控制位。当SMOD 1SCON寄存器中的 SM0/FE 位于 FE(帧错误检测)功能当SMOD0 0SCON的SM0/FE 用于 和 SM1 组合指定串行口的工作模式。复位时 SMOD0 0 SCON 用于选择串行通信的工作方式和某些控制功能格式如下 SM0/FE当PCON寄存器的 SMOD0/FE 1时该位用于帧错误检测。当检测到一个无效停止位时通过UART接收器设置该位必须由软件清零当SMOD0/FE 0该位和 SM1 组合指定工作模式 REN允许/禁止串行接收控制位。由软件置位若REN 1即允许串行接收数据REN 0则禁止接收 SM2允许方式2或方式3多机通信控制位。 TB8在方式2或方式3为要发送的第9位数据按需要由软件置位或清0。可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。 RB8在方式2或方式3是接收到的第9位数据。在方式1若SM20则RB8是接收到的停止位。方式0不用RB8。 TI发送中断请求标志位。在方式0当串行发送数据第8位结束时由内部硬件置TI 1向主机请求中断响应中断后必须用软件复位即TI 0。在其他方式中则在停止位开始发送时由内部硬件置位必须用软件复位TI 0 RI接收中断请求标志位。在方式0当串行接收到第8位结束时由内部硬件自动置位 RI 1 ,向主机请求中断响应中断后必须用软件复位即RI0。在其他方式中串行接收到停止位的中间时刻由内部硬件置位即RI1必须由软件复位即RI0 IE 中断允许寄存器 其中我们只关注EA 和 ES EACPU的总中断允许控制位EA 1CPU开放中断EA 0CPU屏蔽所有中断请求ES串行口中断允许位ES 1允许串行口中断ES 0禁止串行口中断 注意接收中断和发送中断共用一个中断在中断处理函数中还需要通过RI 和 TI 的置位判断本次中断是接收中断还是发送中断 最后我们回归模式图讲解一下串口通信的流程 发送数据 通过总线将数据写入SBUF定时器1控制波特率。通过TXD发送数据当发送数据结束时(方式0为发完8位数据其他方式为发送停止位时)将 TI 1发送中断请求 接收数据 RXD接收数据通过定时器1控制波特率对接收数据进行采样存放在SBUF当接收数据结束(方式0当串行发送数据第8位结束时在其他方式中则在停止位开始发送时由内部硬件置位)将 RI 1发出中断请求 注意TI 和 RI 都需要由软件置0 编码 经过上述学习我们已经对串口有了一定的了解接下来就是实现串口通信 单片机通过串口发送数据 我们使用UART串口通信首先要进行初始化如选择工作方式初始化中断系统设置波特率初始化定时器 选择工作模式 涉及到SCON 和 PCON 首先是PCON的SMOD0当 SMOD0 0 时SMOD 的 SM0 才会被用来选择工作方式 其次我们选择 8位UART波特率可变模式即方式1SCON的SM0 0SM1 1 最后如果要允许串口接收数据还需要置SCON的REN 1 初始化中断系统 首先初始化串口收发数据的中断请求标志位SCON的 TI 和 RI由硬件置1我们初始化时清零即可TI 0, RI 0 到此SCON的设置就结束了 总结一下SM0 0, SM1 1, REN 1/0, TI 0, RI 0其他默认为0即可所以SCON 0x40/0x50 然后是中断开关 ES 1, EA 1 SCON 0x50; //选择工作方式 允许串口接收数据 PCON | 0x80; //使SM0为选择工作方式 //中断开关 ES 1; //串口中断开关 EA 1; //总中断开关初始化定时器 初始化定时器可参看【51单片机】定时器 此处定时器1选择工作模式2——8位自动重装 8位自动重装 一次只对TL1或TH1计数加一 当一个溢出后直接使用另一个计数单元的初值 //设置定时器1 TMOD 0x0F; //高4位清零 TMOD | 0x20; //0010模式3——8位自动重载 TR1 1; //启用定时器T1 ET1 0; //禁止定时器T1中断 //定时器初值 TL1 0xF3; //设定定时初值 TH1 0xF3; //设定定时器重装值设置波特率 我们设置波特率为4800 设置波特率需要通过设置定时器1的初始值 TL1 0xF3; //设定定时初值 TH1 0xF3; //设定定时器重装值讲解一下为什么定时器初值是这个 假设系统频率为12MHz使用12T模式则定时器频率为12 / 12 1MHz即每1us计数单元加1。 使用8位自动重装256时会溢出0xF3 243256 - 243 13。所以定时器溢出需要13us 溢出率1 / 13 0.07692 使用SMOD 1波特率加倍(不除2) 还需要 0.07692 / 16 0.0048076923MHz 转化为Hz4807.6923Hz这个就是波特率 会存在一定误差 也可参看如下计算 到此串口的初始化就完成了 完整代码如下 /*** brief 初始化串口* parm 无* retval 无*/ void UART_Init() {//SCON高4位分别为SM0、SM1、SM2、REN//SM0和SM1控制串口模式选择01——8位UART波特率可变//REN接收使能REN 0禁止接收REN 1允许接收//所以设置0101 0000SCON 0x50;//PCON包含波特率和电源设置//前两位为SMOD和SMOD0//SMOD 1波特率加倍SMOD 0波特率不加倍//SMOD0是帧错误的此处不用//所以设置1000 0000PCON | 0x80;//设置定时器1TMOD 0x0F; //高4位清零TMOD | 0x20; //0010模式3——8位自动重载TR1 1; //启用定时器T1ET1 0; //禁止定时器T1中断 //定时器初值TL1 0xF4; //设定定时初值TH1 0xF4; //设定定时器重装值//中断开关ES 1; //串口中断开关EA 1; //总中断开关 }博主的单片机系统频率为11.0592MHz 可以使用STC-ICP生成波特率设置代码 注意配置一定要选择正确代码中的AUXR寄存器为高版本单片机才有的低版本不认识这个寄存器可以直接删掉 串口发送数据通过赋值SBUF数据发送完后硬件置位TI 1需要我们手动对TI清零 代码如下 /*** brief 通过串口发送一个字节数据* parm Byte要发送字节数据* retval 无*/ void UART_SendByte(unsigned char Byte) {SBUF Byte;while(TI 0);//数据发送完硬件置1TI 0; //软件置0 }模块化编程完整代码如下 延时模块——控制串口发送数据速率 Delay.h #ifndef __DELAY_H__ #define __DELAT_H__void Delayms(unsigned int xms);//等待指定毫秒#endifDelay.c #include INTRINS.h /*** brief 延迟一定时间* parm 延迟的时间单位是毫秒范围0 ~ 65535* retval 无*/ void Delayms(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;_nop_();i 2;j 199;do{while (--j);} while (--i);} }UART串口模块 UART.h #ifndef __UART_H__ #define __UART_H__void UART_Init(); void UART_SendByte(unsigned char Byte);#endifUART.c #include REGX52.H /*** brief 初始化串口* parm 无* retval 无*/ void UART_Init() {//SCON高4位分别为SM0、SM1、SM2、REN//SM0和SM1控制串口模式选择01——8位UART波特率可变//REN接收使能REN 0禁止接收REN 1允许接收//所以设置0101 0000SCON 0x50;//PCON包含波特率和电源设置//前两位为SMOD和SMOD0//SMOD 1波特率加倍SMOD 0波特率不加倍//SMOD0是帧错误的此处不用//所以设置1000 0000PCON | 0x80;//设置定时器1TMOD 0x0F; //高4位清零TMOD | 0x20; //0010模式3——8位自动重载TR1 1; //启用定时器T1ET1 0; //禁止定时器T1中断 //定时器初值TL1 0xF4; //设定定时初值TH1 0xF4; //设定定时器重装值//中断开关ES 1; //串口中断开关EA 1; //总中断开关 } /*** brief 通过串口发送一个字节数据* parm Byte 要发送字节数据* retval 无*/ void UART_SendByte(unsigned char Byte) {SBUF Byte;while(TI 0);//数据发送完硬件置1TI 0; //软件置0 }///** // * brief 接收数据 模版 // * parm 无 // * retval 无 // */ //void UART_Routine() interrupt 4 //{ // if(RI 1)//检测是否是接收数据中断 // { // RI 0;//软件置0 // } //}主程序——每隔一秒通过串口发送递增数据 #include REGX52.H #include UART.h #include Delay.h /*** brief 通过串口每隔1s发送递增的数据 范围0 ~ 255* parm 无* retval 无*/ void SendIncreasingNum() {static unsigned char num;UART_SendByte(num);Delayms(1000); }void main() {UART_Init();while(1){SendIncreasingNum();} }使用STC-IST 的 串口助手 查看效果 注意下面一行的配置要正确 电脑通过串口发送数据控制LED灯 电脑发送数据给单片机需要USB转串口自带的USB线就已经实现了这一转换所以我们直接编写单片机通过串口接收数据的逻辑即可。 串口接收数据会存放在SBUF接收完毕后会将RI置1发出中断请求中断号为4然后需要手动清零RI 代码如下 void UART_Routine() interrupt 4 {if(RI 1)//检测是否是接收数据中断{P2 SBUF;RI 0;//软件置0} }注意P2寄存器用于控制LED亮灭为0亮起为1熄灭 还可以将数据重新返回给电脑同样使用Delay 和 UART 模块只有main.c不同 main.c #include REGX52.H #include UART.h #include Delay.h /*** brief 接收数据亮相应的灯并返回数据* parm 无* retval 无*/ void UART_Routine() interrupt 4 {if(RI 1)//检测是否是接收数据中断{P2 SBUF;UART_SendByte(SBUF);RI 0;//软件置0} } void main() {UART_Init();while(1){} }效果如下 我们通过串口助手发送 0xAA 1010 1010 LED灯效果如下 以上就是本篇博客的所有内容感谢你的阅读 如果觉得本篇文章对你有所帮助的话不妨点个赞支持一下博主拜托啦这对我真的很重要。
http://www.dnsts.com.cn/news/22417.html

相关文章:

  • 网站前置审批文件网站建设成都云
  • 门户网站时代青岛网站seo优化
  • 做网站投注员挣钱吗自己做的旅游网站简介
  • 网站集约化建设推进情况网络空间安全专业大学排名
  • 网站怎么集成支付宝国外的外贸网站
  • 临沂网站公司哪家好wordpress企业h5主题
  • 网站上线发布流程专业网络推广软件
  • 网站上传根目录蜘蛛不抓取网站的原因
  • 外汇做单在什么网站品辰设计的网站谁做的
  • 网站维护一般要几天上国外网站用什么机箱好
  • 合肥专业做网站的公司有哪些wordpress 目录下拉框
  • qq空间实名认证网站wordpress 主题安全建设
  • 网站模板建站教程视频织梦手机网站建设
  • 广州 网站优化企业建站用什么主机
  • t恤图案设计网站网站建设源码开发
  • 宽屏网站和普通网站软件开发文档国标
  • 如何让网站被百度快速收录win8风格网站开发实例
  • 编程 网站建设长沙网站运营
  • 郑州做网站建设html设计网页作业代码
  • 网匠网站建设有限公司中国石化工程建设有限公司王龙哲
  • 个人网站设计论文摘要关键词湖南企业建网站
  • 建设摩托车官方网站机械设备东莞网站建设
  • .net网站开发项目东营住房和城乡建设厅网站
  • 成都公司建站模板兰溪市建设局网站 图片
  • 网站建设流程案例it公司排名
  • 制作网站培训怎么做电商网站推广
  • 微网站建设公司豆芽网站建设douyanet
  • 网站制作品牌公司公司网站建设开发济南兴田德润简介图片
  • 自助建站申请书建设环境竣工验收网站
  • 北京东城网站建设公司wordpress 对象存储插件