STC12C5A60S2 串口中断接收程序

发布者:chinapxf最新更新时间:2016-06-15 来源: eefocus关键字:STC12C5A60S2  串口中断  接收程序 手机看文章 扫描二维码
随时随地手机看文章
#define UART0_BUF_LEN 32


int UART1_Recv_count;  //接收计数

bit UART1_Overflow_Flag;   //缓冲区满标志

idata uchar UART1_Recv_BUF[UART0_BUF_LEN];  //串口接收缓冲区

 

//串口初始化
void Init_Uart()
{
    UART1_Overflow_Flag=0;
    UART1_Recv_count=0;
     //22.1184M 晶振   115200波特率
    PCON &= 0x7f;  //波特率不倍速
    SCON = 0x50;  //8位数据,可变波特率
    BRT = 0xFA;  //设定独立波特率发生器重装值
    AUXR |= 0x04;  //独立波特率发生器时钟为Fosc,即1T
    AUXR |= 0x01;  //串口1选择独立波特率发生器为波特率发生器
    AUXR |= 0x10;  //启动独立波特率发生器   
     ES = 1;             //充许串口1中断

  }

 

//串口中断接收程序

/*

   说明:

      (1)如果缓冲区接收满了,则中断接收程序不在接收数据。UART1_Recv_count=32

      (2)如果接收到“回车符”、“换行符”,则中断不在接收数据。UART1_Recv_count={实际接收到的数据个数}

       以上2种情况触发后 UART1_Overflow_Flag标志位置为1,等待MAIN函数(主程序处理)

*/
void UART1_Int(void) interrupt 4  
{  
    if (RI == 1)  
    {  
      RI = 0;  
   if(UART1_Overflow_Flag==0) 
   {           
     if(UART1_Recv_count          { 
       UART1_Recv_BUF[UART1_Recv_count++] = SBUF;   
       if(SBUF=='\r' || SBUF=='\n')
       {
               UART1_Overflow_Flag=1;
    }
     }
     else
     {
              UART1_Overflow_Flag=1; // 关闭串口中断,停止接收
     }
    }
    LED2=~LED2;  
    }     
}  

 

 

int main()
{
   char i; 
   TMOD=0x00;
   AUXR=0x00;

   LED1=0;
   LED2=1;

   Init_Uart();
   EA=1;  //开总中断
   
   printf("System is start...\r\n");

   while(1)
   {
      if (UART1_Overflow_Flag==1)     //串口中断数据接收完毕,开始处理
      {  
              for(i=0;i                    printf("%c",UART1_Recv_BUF[i]);                       
                        Appcall(UART1_Recv_BUF,UART1_Recv_count);    
                   printf("\r\n");
              UART1_Recv_count = 0;            //缓存清零 
              UART1_Overflow_Flag=0;        //允许串口继续接收数据
      }  
   }
}

小知识:

     [1]换行符、回车符的定义

         

  ASIC C语言编程描述
回车符 0a(13) \r
换行符 0d \n

 

    换行符、回车符的来历:

 

    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

    后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

    Unix系统里,每行结尾只有“<换行>”,即“\n”;

    Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。

    在ascii中,回车和换行是不同的字符。0x0A是回车,即光标移动到本行的最左面; 0x0D是换行,即光标移动到下一行。

 

  [2]常见的串口工具如何发生“换行符”

   STC12C5A60S2 串口中断接收程序

     在用串口工具发送数据时,如果勾选了发送新行,串口工具就会在数据尾部添加“换行符”

 

     [2] STC单片机波特率计算

         STC单片机官网上有一个比较好用的波特率计算工具,大家都可以自己下载了使用。

       STC12C5A60S2 串口中断接收程序

     选择好晶振,波特率发生器、定时器时钟后, 该程序就可以自动生成代码了。非常方便。

     STC官网地址:http://www.stcmcu.com/

    

   [3]关于STC单片机独立波特率发生器的理解

         a. STC单片机有1个独立的波特率发生器,虽然用独立的波特率发生器就不需要用定时器了。但是要注意的时,独立波特率发生器和“晶振”频率还是有关的。

         b. 如果要串口的数据收发误码率较低,还是要选用 11.0592 、22.1184  这些晶振。

       STC12C5A60S2 串口中断接收程序

         注意看上图,误码率为 0.00%

         c. 6M、  12M 、24M 这些晶振如果在串口通信里,是不建议用的

         d. 在STC单片机上,用 11.0592 晶振,是可以非常方便的上 115200 波特率高速传输的,这是普通的AT89S51单片机很难实现的。

       STC12C5A60S2 串口中断接收程序

      只要让单片机工作在1T的工作模式下,11.0592的晶振,也可以轻松跑到115200波特率。

关键字:STC12C5A60S2  串口中断  接收程序 引用地址:STC12C5A60S2 串口中断接收程序

上一篇:写一个串口接收发送程序
下一篇:串口中怎样接收一个完整数据包的解析

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

51单片机中的串口中断模式
最近在写51的串口,遇到一些问题,折腾了十天左右,终于解决了,串口接收数据,用的中断模式,在一个有四层嵌套的while循环中,最底层的循环中使用串口数据,结果发来的数据不正常,一般是第一次没有发过来,第二次的时候一起把第一次的数据一起送上来,而且这种现象是我在用到xdata数据以后就会出现(不管程序中哪个地方用到),要是都用idata就不会出现这个问题,很是奇怪,说实话,我至今没有找到原因,但是找到一个解决办法,分享一下: 在最底层的while循环中,不采用中断接收串口数据,而是采用查询的方式接收串口数据,这样的话就正常了
[单片机]
STM32CubeMX— 配置串口1 接收中断
实验操作 1、打开cubemax ,芯片选取。 我们选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。 图1、芯片选取界面 图2、配置界面 如上图: (1)、标号1 为系统核心的配置,其中由晶振的配置。 (2)、标号2为模拟量相关的外设配置,如adc,dac,等。 (3)、标号3为定时器配置。 (4)、标号4为通信相关的外设。比如串口,CAN等。 其他图中有标注。 2、晶振配置 晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振
[单片机]
STM32CubeMX— 配置<font color='red'>串口</font>1 <font color='red'>接收</font><font color='red'>中断</font>
nrf24l01接收和显示程序
1、nrf24l01.h文件 #include intrins.h typedef unsigned char uchar; typedef unsigned char uint; //****************************************IO端口定义*************************************** sbit CE =P2^0;//3 sbit CSN =P2^1;//4 sbit SCK =P2^2;//5 sbit MOSI =P2^3;//6 sbit MISO =P2^4;//7 sbit IRQ =P2^5;//8 //**************
[单片机]
基于Q2403A的单片机短消息收发系统
引言 基于GSM短消息的业务不需要建立拨号连接,只需把待发的消息加上目的地址发送至短消息中心,再由短消息中心转发到最终目标。GSM 短消息业务以其连接简单、费用低廉、覆盖范围广、实现方便等优点得到了广泛的应用。运用 GSM 短消息实现远程测控的可靠性较高、信号传播距离远、覆盖面积广,并且可以节省建网初期的巨额投资。 本文对基于GSM短消息收发系统的设计与实现作了具体描述,给出了系统的软硬件设计方案,对主要硬件,即GSM模块Q2403A 和8051单片机作了重点介绍。给出了系统的软件设计,包括PC与单片机通信部分和短消息收发部分。最后实现系统监控功能。 系统硬件实现 总体系统结构 该系统硬件主要由8051单片机扩展电路、
[单片机]
串口控制LED点亮stm32中断 跑马灯
/** @file : main.c @brief : Main program body ** This notice applies to any and all portions of this file that are not between comment pairs USER CODE BEGIN and USER CODE END. Other portions of this file, whether inserted by the user or by software development tools are owned by their respective copyright owners.
[单片机]
串口发送数据查询方式与中断方式
单片机采用中断或查询方式使用串口,这是根据实际应用的需要确定的,没有好/坏之分。有时之所以采用查询方式处理串口程序,是因为应用程序不苛刻单片机的时间资源,采用查询的方式就能满足应用的需要,所以没采用中断。 大量连续的向串口发送数据,就没有必要使用中断了,因为单片机根本没有时间去处理其它事务,这样采用查询的方式反而效率更高,实际应用中向串口发送数据很少使用中断,更多的是使用接收中断,除非单片机的时间资源特别的紧张,连等待一个数据的发送时间也得利用。 一般发送数据采用查询方式: 以stm32串口为例 void Send_String(uint8_t *str) { uint8_t index = 0; do
[单片机]
单片机STC12C5A60S2控制AT24C04的程序(C语言)
/************************************** 主芯片:STC12C5A60S2(1T) 工作频率:12.000MHz **************************************/ #include REG51.H #include INTRINS.H typedefunsignedcharBYTE; typedefunsignedshortWORD; sbitSCL=P3^4;//AT24C04的时钟 sbitSDA=P3^5;//AT24C04的数据 BYTEBUF ;//数据缓存区 BYTEcodeTESTDATA = { 0x00,0x11,0x22,0x33,0x44
[单片机]
stc12c5a60s2 0-30电压测量 有注释
#include STC12C5A60S2.H #include intrins.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC 电源控制位 10000000 0X80 / #define ADC_FLAG 0x10 //ADC 完成标志 00010000 0x10 #define ADC_START 0x08
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved