datasheet

STC12C5A60S2 串口中断接收程序

2019-05-21来源: 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...rn");


   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("rn");

              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系统里面,每行结尾是“<换行><回车>”,即“nr”;Mac系统里,每行结尾是“<回车>”。


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


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


    

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



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


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


   

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


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


    


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


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


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


 

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


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


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


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

关键字:STC12C5A60S2  串口中断  接收程序

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic462394.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STC12C5A60S2双串口通信
下一篇:STC12C5A60S2单片机串口1无法连续发送字符的问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC12C5A60S2_PWM

#include <reg52.h>#include <intrin.h>#define uint unsigned int #define uchar unsigned charsfr CCON = 0XD8;sbit CCFO = CCON^0;sbit CCF1 = CCON^1;sbit CR = CCON^6;sbit CF = CCON^7;sfr CMOD = 0XD9;sfr CL = 0XE9;sfr CH = 0XF9;sfr CCAPM0 = 0XDA;sfr CCAP0L = 0XEA;sfr CCAP0H = 0XFA;sfr CCAMP1 = 0XDB;sfr CCAP1
发表于 2019-06-01

单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)

= 0; if(time < PWM) pwm = 1; else if(time >= PWM) pwm = 0; }}proteus仿真结果由仿真结果来看,所得波形还是不算很精准,实际应用过程中还会有很多误差,但是这样已经比延时函数产生pwm的结果可靠的多。【STC12C5A60S2系列单片机输出PWM】我在做循迹小车时使用的是stc12c5a60s2单片机。stc12c5a60s2单片机集成了两路可编程计数器阵列(PCA)模块,可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出。使用stc12c5a60s2单片机的PCA模块可通过程序设定,使其工作于8位PWM模式,通过P13和P14输出
发表于 2019-05-22
单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)

STC12C5A60S2的PCA模块输出PWM波

,就会去改变PWM的占空比,这也就是所说的脉宽调制。要改变PWM的周期,只能改变CL的取值范围,但是CL的取值范围是不可改变的,因为CL是一个8位寄存器。所以只能是改变CL每次加1的速度(原来CL加1用0.1s,现在要改为0.05s)也就是说我们要时钟源的频率。这种方法并没有被PCA模块所用,PCA模块所改变PWM频率的方法为,时钟源选择T0的溢出率,或者是选择外部时钟晶振源。上述为个人理解,下图为手册中的流程
发表于 2019-05-22
STC12C5A60S2的PCA模块输出PWM波

增强型单片机STC12C5A60S2输出各种频率方波信号

【例7-3】 设时钟频率Fosc=18.432MHz,设计程序,从P1.0/CLKOUT2引脚输出频率为124.540KHz的时钟;从T0(P3.4)引脚输出频率为125KHz的时钟;从T1(P3.5)引脚输出频率为38.4KHz的时钟。解:使用STC12C5A60S2的可编程时钟输出功能完成所需要求。在下面的程序设计中(在此只给出C语言程序),T0、T1和独立波特率发生器BRT均工作在1T模式。程序编制如下:#include "stc12c5a.h"        //包含STC12C5A60S2的寄存器定义头文件void main(void){   
发表于 2019-05-22

STC12C5A60S2 ADC中断方式

/*------------------------------------------------------------------*//* --- STC MCU Limited ---------------------------------------------*//* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*//* --- Web: www.STCMCU.com -----------------------------------------*//* If you want to use the program or
发表于 2019-05-22

STC12C5A60S2 ADC查询方式

/*------------------------------------------------------------------*//* --- STC MCU Limited ---------------------------------------------*//* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*//* --- Web: www.STCMCU.com -----------------------------------------*//* If you want to use the program or
发表于 2019-05-22

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved