STC89C52RC定时器2串口收发字符串

  • 前言
  • 一、宏定义
  • 二、变量
  • 三、函数
  • 四、结果

前言

众所周知,STC89C52RC有一个定时器2,具体的不说了,你只需要知道本文是将它用来产生串口波特率从而进行串口通信的定时器就对了。

声明:本文代码是在STC提供的范例程序基础上进行修改,程序在STC官方工具STC-ISP软件里。

但因为范例程序是收一个字节展示一个字节,也就是在P0和P2.2上表示出收到的内容,而我们需要的是收到字符串消息处理后再xxx,重点是能收到字符串,当然,这也很简单,但不懂为什么我调试了贼久。

思路就是:每次收到一个字节,就从SBUF读取该字节并加入字符数组buff,最后在处理过程中,将这个数组拷贝给另一个长度比它大1的数组str,并追加’\0’。

没办法,我之前遇到的问题就是,假设它收到字符串后,buff[]里面的东西处理完了,没法清空,试了memset(buff, ‘\0’, sizeof(buff))、也试了for循环赋值’\0’,但很奇怪居然失效了,如果有试成功的可以告诉我。

通常来讲,判断是否收完一个字符串内容有定时器方法、标志位方法,这里我用的是第二种,因为51单片机定时器本来就少,定时器0我用来延时了,定时器1我准备用来做软件定时器。

一、宏定义

#define FOSC 11059200L      // 晶振
#define BAUD 115200         // 波特率/*Define UART parity mode*/
#define NONE_PARITY     0   // 无校验位
#define ODD_PARITY      1   // 奇校验位
#define EVEN_PARITY     2   // 偶校验位
#define MARK_PARITY     3   // 校验位始终为1
#define SPACE_PARITY    4   // 校验位始终为0#define PARITYBIT NONE_PARITY#define MAXSIZE_BUFF 16

二、变量

bit busy;static unsigned int count = 0;bit flag_receive_finish = 0;char buff[MAXSIZE_BUFF] = {0};

三、函数

/*** *************************************************** @brief main* ***************************************************/
int main(void) {EA = 1;init_uart();while(1) {if (0 != flag_receive_finish) {receive_process();}}
}
/*----------------------------
Process data after receiving message
Input:None
Output:None
----------------------------*/
void receive_process() {char str[MAXSIZE_BUFF + 1] = {0};unsigned int i;for (i = 0; i < count; i++) {str[i] = buff[i];}str[i] = '\0';SendString(str);memset(buff, '\0', sizeof(buff));count = 0;flag_receive_finish = 0;
}
/*----------------------------
UART interrupt service routine
----------------------------*/
void Uart_Isr() interrupt 4 {if (RI) {RI = 0;             //Clear receive interrupt flagif (0 == flag_receive_finish) {if ('$' == SBUF) {flag_receive_finish = 1;} else {buff[count++] = SBUF;}}if (MAXSIZE_BUFF == count) {flag_receive_finish = 1;}}if (TI) {TI = 0;             //Clear transmit interrupt flagbusy = 0;           //Clear transmit busy flag}
}

下面是STC官方的例程里提供的串口发送函数和串口初始化。

/*----------------------------
UART init
----------------------------*/
void init_uart() {count = 0;flag_receive_finish = 0;#if (PARITYBIT == NONE_PARITY)SCON = 0x50;            //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)SCON = 0xda;            //9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)SCON = 0xd2;            //9-bit variable UART, parity bit initial to 0
#endifTL2 = RCAP2L = (65536 - (FOSC / 32 / BAUD));TH2 = RCAP2H = (65536 - (FOSC / 32 / BAUD)) >> 8;T2CON = 0x34;ES = 1;EA = 1;
}
/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(unsigned char dat) {while (busy);           //Wait for the completion of the previous data is sentACC = dat;              //Calculate the even parity bit P (PSW.0)if (P) {                //Set the parity bit according to P
#if (PARITYBIT == ODD_PARITY)TB8 = 0;            //Set parity bit to 0
#elif (PARITYBIT == EVEN_PARITY)TB8 = 1;            //Set parity bit to 1
#endif} else {#if (PARITYBIT == ODD_PARITY)TB8 = 1;            //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)TB8 = 0;            //Set parity bit to 0
#endif}busy = 1;SBUF = ACC;             //Send data to UART buffer
}
/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s) {while (*s) {            //Check the end of the stringSendData(*s++);     //Send current char and increment string ptr}
}

四、结果

上面的代码应该很好理解吧,就是开头思路说的,设一个标志位(这里用的是&),如果超过长度或者遇到标志位则停止接收,把收到的这一串复制给新串,发送后清空原串(其实清不清无所谓,因为count从0计数了),最后把这新串添加’\0’通过串口再发送出去。

如图:

这里设置的是16位存储,所以如果没有遇到标志符,那么直到16位满了才接收完一次。

但如果遇到标识符’$’,则立刻停止接收。

问题是没有问题了的,不过我后续还得做其他东西,51只是作为指令接收机,也就是下位机,上位机还是得用STM32做

STC89C52RC定时器2串口通信相关推荐

  1. 嵌入式学习——使用定时器同时实现串口通信和LED流水灯

    一.定时器的概念以及作用 1.定时器的概念以及作用 在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作. 定时器的主要作用是产生一个 ...

  2. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  3. AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  4. 嵌入式作业STM32定时器实现串口通信及LED灯闪烁

    目录 前言 一.什么是定时器 1.定时器与计数器 2. 定时器有什么用 3. 定时器的原理 4.时钟产生器和时基单元 二.用STM32CubeMx创建项目 1. 创建项目 2.配置RCC和SYS 3. ...

  5. STM32定时器实现串口通信

    文章目录 使用工具 一.通过STM32Cube配置工程 二.使用keil配置代码 三.效果展示 四.总结 五.参考资料 使用工具 软件:STM32CubeMX:6.6.1 Keil 5.31 mcui ...

  6. 发现好文!51单片机特殊功能寄存器 /I/O口操作 /中断/ 定时器/ 串口通信/ ---位寻址解释由来--以及程序例程

    51单片机特殊功能寄存器有哪些_功能是什么 最近学习中对寄存器的概念理解很迷惑,I/O口操作/中断/定时器/串口通信四大模块的寄存器应用不太明白,这篇文章,解释的不错,希望帮到各位! 1.21个寄存器 ...

  7. 【嵌入式系统开发15】STM32F103C8T6下通过定时器Timer方式实现时间的精准控制,实现串口通信并让LED等周期性地闪烁

    本文目的是主要介绍通过STM32F103C8T6采用定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务.请设置一个5秒的 ...

  8. STM32关于使用定时器来实现串口通信的整活实验

    目录 一.整活说明 二.原理简介 先说接收 发送数据 优化 三.实验条件和目标 条件 目标 四.掉头发环节 1.定义串口类 2.定义简单宏 3.定义私有数据 4.init 函数 5.其他接口函数 6. ...

  9. 51单片机——中断系统、外部中断、定时器中断、串口通信C语言入门编程

    目录 中断系统: 外部中断: 1.外部中断0.1:当触发时,LED状态取反 定时器中断: 1.定时器0.1:LED以1S为周期闪烁 串口通信: 1.串口中断:通过串口发送什么数据给单片机,单片机再通过 ...

最新文章

  1. form表单的action提交写到js中来,同时onclick事件也写在js中来。其action也可以通过ajax来提交的。...
  2. HTML5学习笔记(一)(2015-12-2)【新浪云搬运】
  3. swift如何动态创建对象
  4. mysql事务变量_mysql学习四之事务、变量、触发器、函数、存储过程
  5. 面试题之发散思维能力:如何用非常规方法求1+2+···+n
  6. 常用数据结构及复杂度
  7. python scrapy cookies 处理
  8. CIA的海外间谍,要如何完美避开AI的监控?
  9. 《算法图解》读书笔记(一)
  10. 如何使用会声会影标题工具制作弹幕效果
  11. LINUX内核的进程调度策略
  12. eclispe file查找
  13. 斗智斗勇 -- 谷歌浏览器的主页被篡改
  14. mysql语句批量更新数据库_sql 更新批量数据库语句
  15. c++中冒号(:)和双冒号(::)的用法
  16. 斐讯路由器怎样设置虚拟服务器,斐讯路由器怎么设置_p.to路由器设置界面-WIFI之家...
  17. 2020-12-19
  18. ios底部栏设计规范_IOS界面设计尺寸标准规范
  19. 一些名企秋招网申链接合集
  20. 长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽...

热门文章

  1. 艾伟:一个让人遗忘的角落—Exception(二)
  2. 网络拓扑配置案例练习(VRRP,浮动路由,DHCP,三层交换机配置)
  3. WebSocket连接wss链接
  4. java IO初识与Linux网络I/O模型简介
  5. linux ss 命令
  6. 日期控件My97的时间限制
  7. 陷维权风波,冲高端的小米手机过于激进?
  8. 更改cognos upfront 的外观
  9. win10 uwp iot
  10. ARM-translation table walk