中国和住房城乡建设部网站首页,未来做那些网站致富,专业设计网站排名,wordpress mysql数据库目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步#xff1f;全双工#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择#xff1a;实现分时复用模式选择串口1模式1#xff0c;模式1波特率计算公式 3.串口通信代码实现编写串口1通信程序… 目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步全双工常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择实现分时复用模式选择串口1模式1模式1波特率计算公式 3.串口通信代码实现编写串口1通信程序15.5.4 串口2使用定时器2做波特率发生器新建工程16.串口2通信 错误排查及代码分析 总结课后练习 1.串口通信的基础知识
百度百科串口通信的概念 什么是通信 例如U盘和电脑我们电脑需要往U盘存东西而U盘上只有四个触点除去一个电源一个地只剩下两个引脚了。此时我们坑定不能像点亮LED那样单纯的给他两个引脚上输出个高低电平就能写数据了对吧。总不至于输出一个高电平就能在U盘里写入“STC32位8051单片机就是牛”这么一句话了吧。 通信指设备之间通过一定的协议进行的信息交换。 每次发送一位数据的称为串行通信多位(严格来说是2位以上一起传输的称为并行通信。 今天要讲的串口通信是串行通信的其中的一种也是1位1位的往外发数据不是像这个图一样8位一起发。 stc共有4个串口串口1/2和3/4的主要区别在这里这节课主要讲异步串口。
串口通信(Serial Communication)
是指外设和计算机间通过数据信号线 、地线、控制线等按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少在远距离通信中可以节约通信成本但其传输速度比并行传输低。
同步/异步
异步方式使用较多 ①以字符为单位传送信息。 ②相邻两字符间的间隔是任意长。 ③因为一个字符中的比特位长度有限所以需 要的接收时钟和发送时钟只要相近就可以。 ④异步方式特点简单的说就是字符间异步字符内部各位同步。 同步方式 ①以数据块为单位传送信息。 ②在一个数据块信息帧内字符与字符间无间隔。 ③因为一次传输的数据块中包含的数据较多所以接收时钟与发送进钟严格同步通常要有同步时钟。
全双工 常见的串口软件的参数
这里的4个数据发送端和接收段必须严格保持一致。否则接收到的就是乱码。 ●波特率 例如9600的波特率意味着每秒钟可以发9600位的数据。 我们这里起始位就是一个位一个二进制的一个数0或者11bit的变量。中间有8个数据为然后校验位停止位。速度9600即每秒最快可以发960个这种包 ●数据位 有几个2进制位的数据 ●校验位 ●停止位 ●传输距离 通信距离很短如何解决 以下分别为RS232,RS422,RS485的通信原理图。 串口的逻辑电平只有5V或者3.3V,如果单片机是5V供电逻辑电平只有5V(高电平),因为电平比较低传输距离受限 ●串口有什么用
2.STC32的串口通信实现原理
引脚选择实现分时复用 模式选择 每一种模式的配置参考手册这里不再复述。这里主要讲串口1的模式1应用最广泛。
串口1模式1模式1波特率计算公式
当软件设置SCON的SMO、SM1为“01”时串行口1则以模式Ⅰ进行工作。此模式为8位UART格式一帧信息为10位:1位起始位8位数据位低位在先和1位停止位。波特率可变即可根据需要进行设置波特率。TxD为数据发送口RxD为数据接收口串行口全双工接受/发送。 模式Ⅰ的发送过程:串行通信模式发送时数据由串行发送端TxD输出。当主机执行一条写SBUF的指令就启动串行通信的发送写“SBUF”信号还把“1”装入发送移位寄存器的第9位并通知TX控制单元开始发送。移位寄存器将数据不断右移送TxD端口发送在数据的左边不断移入“O”作补充。当数据的最高位移到移位寄存器的输出位置紧跟其后的是第9位“1”在它的左边各位全为“0”这个状态条件使TX控制单元作最后一次移位输出然后使允许发送信号“SEND”失效完成一帧信息的发送并置位中断请求位TI即 TI1向主机请求中断处理。 模式1的接收过程:当软件置位接收允许标志位.REN即REN1时接收器便对RxD端口的信号进行检测当检测到RxD端口发送从“1”→“O”的下降沿跳变时就启动接收器准备接收数据并立即复位波特率发生器的接收计数器将IFFH装入移位寄存器。接收的数据从接收移位寄存器的右边移入已装入的IFFH向左边移出当起始位0O移到移位寄存器的最左边时使RX控制器作最后一次移位完成一帧的接收。若同时满足以下两个条件: ·RI0; . SM20或接收到的停止位为1。 则接收到的数据有效实现装载入SBUF停止位进入RB8RI标志位被置l向主机请求中断若上述两条件不能同时满足则接收到的数据作废并丢失无论条件满足与否接收器重又检测RxD端口上的1→0的跳变继续下一帧的接收。接收有效在响应中断后RI标志位必须由软件清0。通常情况下串行通信工作于模式1时SM2设置为0。 串口1的波特率是可变的其波特率可由定时器1或者定时器2产生。当定时器采用IT模式时(12倍速相应的波特率的速度也会相应提高12倍。 模式2和模式3大同小异不深入展开。
3.串口通信代码实现 RXD和TXD接在了P4.6跟P4.7上使用的是串口2。
编写串口1通信程序
打开手册15.5 范例程序
15.5.4 串口2使用定时器2做波特率发生器 新建工程16.串口2通信
复制15.NTC温度采集工程为16.串口2通信HARDWARE目录中新建usart子目录,并将usart文件夹加入include新建usart2.c和usart2.h,: 插入头文件模板并修改。 先编写初始化函数声明void Usart2_Init(void);入口参数肯定是无。函数实现(先把官方例程的初始化抄写过来) #define BRT (65536 - (MAIN_Fosc / 1152002)/4) //加2操作是为了让Keil编译器自动实现四舍五入运算void Usart2_Init(void)
{P_SW2 0X80; //0X801000 0000S2CFG 0X01;S2CON 0X50;T2L BRT;T2H BRT8;T2x12 1;T2R 1;wptr 0x00;rptr 0x00;busy 0;
}串口要用到主频将该定义从demo.c中移动到usart2.h中。单独写在串口里面。 初始化代码中有三个小写的变量属于用户定义变量需要增加定义。另外在头文件中也要增加定义主函数中也会使用到这些变量使用extern关键字。
extern bit busy;
extern char wptr;
extern char rptr;
extern char buffer[16];编写中断服务函数中断函数的名字可以任意取只要后面的中断号无错误即可。 增加发送函数Usart2_Send和void Usart2_SendStr(char *p)并在头文件中声明。 在主函数中删除上节课无用内容再调用串口初始化demo.c中while循环内的usb串口部分可以注释掉本节不使用。 时间部分可以留着方便计时。 修改后的源代码如下。 demo.c中的main函数部分
void main() //程序开始运行的入口
{sys_init(); //USB功能IO口初始化usb_init(); //usb库初始化delay_ms(500);Timer0_Init(); //定时器0初始化Usart2_Init(); //串口初始化IE2 0X01;EA 1; //CPU开放中断打开总中断。Usart2_SendStr(Usart2 Test !\r\n);while(1) //死循环{if( TIM_10MS_Flag1 ) //如果10ms到了{TIM_10MS_Flag 0; //清空标志位}if (rptr ! wptr){Usart2_Send(buffer[rptr]); //字符发送rptr 0x0f;}}
}Usart2.c
#include usart2.h#define BRT (65536 - (MAIN_Fosc / 1152002)/4) //加2操作是为了让Keil编译器自动实现四舍五入运算bit busy;
char wptr;
char rptr;
char buffer[16];void Usart2_Init(void)
{P_SW2 0X80; //0X801000 0000S2CFG 0X01;S2CON 0X50;T2L BRT; //BRT为宏定义T2H BRT8;T2x12 1;T2R 1;wptr 0x00;rptr 0x00;busy 0;
}void Usart_Isr() interrupt 8
{if( S2TI ){S2TI 0;busy 0;}if( S2RI ){S2RI 0;buffer[wptr] S2BUF;wptr 0X0F;}
}void Usart2_Send(char dat)
{while(busy);busy 1;S2BUF dat;
}void Usart2_SendStr(char *p)
{while(*p){Usart2_Send(*p);}
}Usart2.h
#ifndef __USART2_H
#define __USART2_H#include COMM/stc.h //调用头文件
#include COMM/usb.h#define MAIN_Fosc 11059200UL //定义为无符号长整型,避免计算溢出//------------------------引脚定义------------------------////------------------------变量声明------------------------//extern bit busy;
extern char wptr;
extern char rptr;
extern char buffer[16];//------------------------函数声明-----------------------//
void Usart2_Init(void);
void Usart2_Send(char dat);
void Usart2_SendStr(char *p);#endif编译成功下载进去看一下。注意这里的时钟选择11.0592。使用串口线使用usb转串口线usb-RS232按要求接线并选择正确的串口。
错误排查及代码分析
下载完成后无反应看一下代码在执行主函数之前就应该执行串口发送但是串口工具里无变化检查串口工具参数设置 都是对的回过头看手册查找问题原因先找到初始化Usart2_Init在手册中使用高级搜索功能查找P_SW2 找到定义3.1.2 外设端口切换控制寄存器2(P_sW2) 使能访问XFREAXFR在sys_init中已经使能EAXFR 1; //扩展寄存器(XFR)访问使能所以P_SW2 0X80; 不使用也是可以的。 查看S2_S:串口2功能脚选择位开发板上的串口2需切换到P4.6和P4.7引脚上S2_S位应置为1这里可以使用或等于在不影响最高位的情况下设置S2_S位即增加P_SW2 | 0X01; 再查找S2CFG目录对应项跳转至15.4.3 串口⒉配置寄存器(S2CFG)。这里设置W1为1解释W1:当需要使用串口2时此位必须设置为“1”否则可能会产生不可预期的错误。若不需使用串口 2则不用特别设置W1。 搜索S2CON跳转至15.4.1串口2控制寄存器(S2CON)。 S2CON 0X50; //0X5001010000设置为模式1可变波特率8位数据方式S2REN1:允许串口接收数据 T2LT2H是定时器相关设置串口需要用到1个定时器来生成波特率也就是作为一个基准时钟。具体设置为首先它传入的是一个数组 T2L BRT; //BRT为宏定义T2H BRT8;T2x12 1;T2R 1;接下来是3个变量。如果说TI需要发送数据发送完了以后把这个变量给他清零。发送时先检测一下busy如果等于1说明上次的数据还没有发完阻塞继续等待。 如果发送完了先把busy置1然后把数据写入S2BUF的位里面,之后开始发送看一下手册15.3.6串口1模式1模式1波特率计算公式中的时序图和串口2同理数据发送完之后才会变成高电平 也就是执行if( S2TI )S2T:串口2发送中断请求标志位。在模式0中当串口发送数据第8位结束时由硬件自动将S2TI置1向主机请求中断响应中断后S2TI必须用软件清零。在其他模式中则在停止位开始发送时由硬件自动将S2TI置1向CPU发请求中断响应中断后S2TI必须用软件清零。满足条件后S2TI清0这个BUSY其实是个忙碌标志位。也就是等于0的时候他才能发送数据把数据直接写进S2BUF寄存器中就可以自动发送。S2BUF进行读操作实际是读取串口接收缓冲区对S2BUF进行写操作则是触发串口开始发送数据。 void Usart2_SendStr(char *p) //发送整个字符。while(*p)可以用这个判断他这个字符是否为空这里用到了一个指针的技巧首先传入的是一个数组或者说是地址把里面的数不断发送出去直到发送至最后一位。发完之后结束。这样写以后如果想发字符串只要在双引号内写入即可。 接收到8位数值后RI会变高进入中断if( S2RI )进入后先清0将读到的数据存入只会把地址加1也就是接收到的数值位数。每接收到1个就加1接收到的最大值是0x0f16。 接下来demo.c中判断if (rptr ! wptr)如果rptr不等于tptr,那就就将rptr的数值不断累加然后直到等于这个数值。 可以看到分析过程代码段中仅增加了1行P_SW2 | 0X01; //开发板上的串口2需切换到P4.6和P4.7引脚上。 重新编译手动下载可以看到数值显示了需要打印的参数显示出来了也可以再把需要的数据写进去可以回显出来可以试试。 这里的演示功能仅为上电显示一段文字运行过程中发送什么文字返回显示同样的文字。重点需要注意默认选择的引脚。写的时候一定要按照实际电路引脚去写。
总结
1.学会串口的一专业名词。 2.学会串口的配置和使用也可以去学习一下试验箱代码里面的代码非常全面 总共有4个串口例程包里4个串口都有示例代码基本上所有用的的代码均已涵盖示例里的初始化也写的非常详细可以选择不一样的定时器只有定时器2可以同时为4个串口作为波特率发生器
课后练习
1.串口发送字符Ax\r\nx表示0-7板子点亮对应LED 2.串口发送Bxxxx\r\nxxxx表示一个四位数四位数码管显示这个4位数 2.串口发送Z\r\n板子给电脑发送“Hello STC”; 3.串口发送字符Cx\r\nx表示0-1板子打开/关闭蜂鸣 4.串口发送字符Dx\r\n板子通过串口发送当前温度给电脑。 能独立做出这个实验的话说明你已经快出师了。