51单片机串口问题

发布者:落寞梦惊最新更新时间:2015-11-02 来源: eefocus关键字:51单片机  串口问题 手机看文章 扫描二维码
随时随地手机看文章
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。
当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。
无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。
在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。
看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。
接收数据时,基本上都是使用“中断方式”,这是正确合理的。
即:每当收到一个新数据,就在中断函数中,把 RI 清零,并用一个变量,通知主函数,收到了新数据。
发送数据时,很多的程序都是使用的“查询方式”,就是执行 while(TI ==0); 这样的语句来等待发送完毕。
这时,处理不好的话,就可能带来问题。
看了一些网友编写的程序,发现有如下几条容易出错:
1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。
这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。
这种处理方法,就会遗漏收到的数据。
2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断程序的。
但是,却在中断函数中,将 TI 清零!
这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。
3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。
对此,做而论道发表自己常用的方法:
接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。
这样一来,收、发两者基本一致,编写程序也很规范、易懂。
更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。


实例:
求一个PC与单片机串口通信的程序,要求如下:
1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。
2、如果接收到1,则将P10置高电平,接收到0,P10置低电平。(用来控制一个LED)
单片机是STC89C52RC/晶振11.0592/波特率要求是9600或4800。谢谢!
问题补充:可能会将【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机,只能能原样返回。

最佳答案:
下列程序,已经调试成功。
#include
sbit LED = P1^0;
unsigned char UART_buff;
bit New_rec = 0, Send_ed = 1, Money = 0;
//----------------------------------------------
void main (void)
{
    SCON = 0x50;   //串口方式1, 8-n-1, 允许接收.
    TMOD = 0x20;   //T1方式2
    TH1 = 0xFD;    [url=]//9600bps@11.0592MHz[/url]
    TL1 = 0xFD;
    TR1 = 1;                        
    ES  = 1;       //开中断.
    EA  = 1;
    while(Money == 0);    //等着交费,呵呵,等着接收$.
    while(1)  {
      if ((New_rec == 1) && (Send_ed == 1))   //如果收到新数据及发送完毕
        SBUF = UART_buff; //那就发送.
        New_rec = 0;
        Send_ed = 0;
    } }
}
//----------------------------------------------
void ser_int (void) interrupt 4
{
    if(RI == 1) {  //如果收到.
      RI = 0;      //清除标志.
      New_rec = 1;
      UART_buff = SBUF;  //接收.
      if(UART_buff == '1')  LED = 1;
      if(UART_buff == '0')  LED = 0;
      if(UART_buff == '$')  Money = 1;
    }
    else         //如果送毕.
      TI = 0;      //清除标志.
      Send_ed = 1;
    }
}
//----------------------------------------------
关键字:51单片机  串口问题 引用地址:51单片机串口问题

上一篇:Proteus调试单片机串口的方法
下一篇:串口通信之点阵左移

推荐阅读最新更新时间:2024-03-16 14:38

51单片机串口通信(一)
随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信方式 有并行通信和串行通信两种。 并行通信通常是将数据字节的各位用多条数据线同时进行传送 。 图一:并行通信 串行通信是将数据字节分成一位一位的形式在。 图二:串行同行 串行通信的传输方向 单工是指数据传输仅能沿一个方向,不能实现反向传输。 半双工是指数据传输可以沿两个方向,但需要分时进行。 全双工是指数据可以同时进行双向传输。 串行通信常见的错误校验 奇偶校验、循环冗余校验 传输速率(比特率): 比特率是每秒钟传输二进制代码的位数,
[单片机]
<font color='red'>51单片机</font>的<font color='red'>串口</font>通信(一)
51单片机快速入门指南】5:软件SPI
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机:Vofa+ 1.3.10 源于软件模拟SPI接口程序代码(4种模式)—— 内陆的咸水鱼,有改动。 硬知识 SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说)、MOSI(数据输出,针对主机来说)、SCLK(时钟,主机产生)、CS/SS(片选,一般由主机发送或者直接使能,通常为低电平有效) SPI接口介绍 SCK:时
[单片机]
【<font color='red'>51单片机</font>快速入门指南】5:软件SPI
STM32 USB虚拟串口问题汇总
汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下是笔者将ST的Custom_HID例程修改为“自定义USB设备”例程时总结出来的,因为笔者也是刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正。 一、usb_desc.c文件 根据你程序使用的通信方式修改。usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小;ConfigDescriptor 下添加需要处理的端点;根据需要添加或删除报告描述符(主要用于HID)和CDC接口描述符(主要用于实现USB转串口)等。具体方法可以下载个“
[单片机]
51单片机IIC通信底层程序
#include IIC.H #include intrins.h unsigned char ask; void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } void IICinit() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; } void IICstart() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; } void IICrespon
[单片机]
51单片机:电脑向串口发送数据并控制LED灯
电脑向串口发送数据后,控制LED灯,并返回发送的数据 程序如下 #include regx52.h #include intrins.h unsigned int num; //建立全局变量 void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //480
[单片机]
<font color='red'>51单片机</font>:电脑向<font color='red'>串口</font>发送数据并控制LED灯
如何使用51单片机和荧光数码管实现电子数字钟的程序
2051单片机和荧光数码管电子数字钟设计读红外代码子程序******************************* org 0290h tt1:push dph ;保护现场 push dpl push acc push psw jb 07h,ttt0 ;全部动作未完成则返回 jb 00h,ttt1 ;如果收到遥控引导码则进入接收识别模式 mov th1,#00h ;清T1,为接收做准备 mov tl1,#00h setb 00h ;设接收遥控波头准备好标志位 setb tr1 ;开T1中断 sjmp ttt0 ttt1:setb psw.4 ;进入区2 clr psw.3 mov a,th1 ;将收到的第一个遥控波头存到30h
[单片机]
51单片机之数码管静态显示
在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示,我们就拿带小数点的八段数码管来说 ,其实我们没必要说对数码管很陌生,因为数码管无非就是八块发光二极管集成在了一起,另外数码管有共阴极和共阳极数码管之分,说起共阴,共阳,大家可能会有所陌生,这里我们简单介绍一下: 共阴极数码管:将八只发光二极管的负极通过一根总线连接在了一起 , 然后每只二极管的正极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入高电平时,二极管点亮。(换句话说,也就是说想让哪一只二极管点亮,就给哪只二极管高电平。下
[单片机]
<font color='red'>51单片机</font>之数码管静态显示
基于Proteus的51单片机实时时钟的仿真设计
  单片机技术应用于各行各业,是一种实用的智能型控制技术,单片机技术的发展极大地推动了电子、通信、计算机、机电一体化等行业的快速发展,成为当前教学和科研的热门技术。本文详细介绍一种新型的单片机仿真软件Proteus,利用它可以实现单片机教学中很多面向端口、外围设备扩展控制型实验的仿真,提高教学效果,进一步缩短教学与工程实际的距离。   1Proteus简介   ProteusISIS是英国Lacenterelec-tronics公司开发的电路分析与实物仿真软件,应用范围十分广泛,涉及PCB制版、Spice电路仿真、单片机仿真以及对ARM7/LPC2000的仿真。Proteus主要由ARESISIS两大模块构成,ARES主要用于
[单片机]
基于Proteus的<font color='red'>51单片机</font>实时时钟的仿真设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
502 Bad Gateway

502 Bad Gateway


openresty
设计资源 培训 开发板 精华推荐

502 Bad Gateway

502 Bad Gateway


openresty
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
502 Bad Gateway

502 Bad Gateway


openresty