找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3371|回复: 0
收起左侧

STC12C5A16S2单片机的串口通信演示实验

[复制链接]
ID:149839 发表于 2016-11-23 23:03 | 显示全部楼层 |阅读模式
  1. fine  BUF_LENTH 128                  //定义串口接收缓冲长度
  2. unsigned char  uart1_wr;                  //写计数器
  3. unsigned char  uart1_rd;                  //读计数器
  4. unsigned char  xdata RX0_Buffer[BUF_LENTH]; //接收缓冲
  5. unsigned char flag;           //定义串口是否有接收到数据的标志位
  6. unsigned char i;           //普通的循环变量
  7. bit  B_TI;            //定义B_TI为bit类型
  8. void uart1_init(void);         //串口初始化函数声明
  9. void Uart1_TxByte(unsigned char dat);   //串口发送单个字符函数声明
  10. void Uart1_String(unsigned char code *puts); //串口发送字符串函数函数声明
  11. void delay_ms(unsigned char ms);    //延时函数声明

  12. #define MAIN_Fosc  11059200UL       //定义外部晶振的频率
  13. #define Baudrate0  9600UL        //定义串口波特率频率         
  14. #define BRT_Reload    (256 - MAIN_Fosc / 16 / Baudrate0) //装入定时器1工作在1倍模式下的益出数
  15. /*************************************************************
  16. *  函数名:main( void )
  17. *  输入:无
  18. *  输出:无
  19. *  功能描述:串口初始化参数为9600 8 N 1.
  20.              程序一开始执行输出"www*frotech*com",然后将
  21.     串口接收到的数据原样返回
  22. **************************************************************/
  23. void main(void)
  24. {
  25. uart1_init();          //调用串口初始化函数
  26. Uart1_String("www*frotech*com");     //一开始就输出"www*frotech*com"
  27. while(1)
  28. {
  29.      if(flag == 1)         //是否有串口中断
  30.   {
  31.      
  32.      for(i = 0; i < uart1_wr; i++)   
  33.      {
  34.          Uart1_TxByte(RX0_Buffer[ i]);    //将接收到的字符串原样输出
  35.      }
  36.      uart1_wr = 0;        //将写计数器0
  37.      flag = 0;          //将中断判断读清0
  38.   }
  39. }
  40. }

  41. /*************************************************************
  42. *  函数名:uart1_init(void)
  43. *  输入:无
  44. *  输出:无
  45. *  功能描述:串口初始化参数为9600 8 N 1.
  46.             
  47. **************************************************************/
  48. void uart1_init(void)         
  49. {
  50. PCON |= 0x80;            //SMD=1    串行通讯的波特率加倍  P265
  51. SCON = 0x50;            //当SM0/FE=0 SM1=1时组成工作方式1(8位UART,波特率可变)    P264
  52. AUXR |=  0x01;            //S1BRS=1  使用独立波特率发生器作为串行口的波特率发生器    P266
  53. AUXR |=  0x04;            //BRTx12=1 波特率发生器每一个时钟计数一次
  54. //BRT = BRT_Reload;              //把根据波特率计算的 定时器的值,装入波特率发生器          P267
  55. BRT =0xB8;
  56. AUXR |=  0x10;                                 //BRTR=1   开启独立波特率发生器运行        P266                                 
  57. ES  = 1;             //IE寄存器的ES位为1 串口1中断开         P192
  58. EA = 1;              //IE寄存器的EA位为1 CPU开中断
  59. }
  60. /*************************************************************
  61. *  函数名:Uart1_TxByte(unsigned char dat)
  62. *  输入:发送字符
  63. *  输出:无
  64. *  功能描述:将单个字符通过串口发送.
  65.             
  66. **************************************************************/
  67. void Uart1_TxByte(unsigned char dat)       //串口1发送单个字符函数
  68. {
  69.     B_TI = 0;             //将B_TI置0
  70. SBUF = dat;             //将发送的数据写入SBUF缓冲器中
  71. while(!B_TI);            //等待发送 缓冲器发送完数据
  72. B_TI = 0;             //将B_TI置位0
  73. }
  74. /*************************************************************
  75. *  函数名:Uart1_String(unsigned char code *puts)
  76. *  输入:发送字符串
  77. *  输出:无
  78. *  功能描述:将字符串通过调用单个字符函数发送.
  79.             
  80. **************************************************************/
  81. void Uart1_String(unsigned char code *puts)      
  82. {
  83.     for(; *puts != 0; puts++)
  84. {
  85.         Uart1_TxByte(*puts);         //以指针的形式将字符串分解为单个字符,调用上面的单个字符发送函数发送
  86. }
  87. }

  88. /*************************************************************
  89. *  函数名:UART1_RCV (void)
  90. *  输入:无
  91. *  输出:无
  92. *  功能描述:定义串口的中断处理函数,串口中断号为4.
  93.              当串口接受完或者发送完一帧数据
  94.     时产生中断,告知CPU进行中断处理
  95. **************************************************************/
  96. void UART1_RCV (void) interrupt 4       //中断接收函数 中断号为4    P188
  97. {
  98. if(RI)             //判断接收的数据是否接收完,当接收到第8位时 接收结束  RI会置1   P265
  99. {
  100.   RI = 0;            //接收中断使能位清0
  101.   RX0_Buffer[uart1_wr++] = SBUF;      //将串口缓冲器SBUF的数据放到数据接收缓冲器RX0_Buffer[]中
  102.   flag = 1;           //将标志位置1方便主函数判断
  103. }
  104. if(TI)             //判断发送的数据是否发送完,当发送到第8位时 发送结束  TI会置1    P265
  105. {
  106.   TI = 0;            //将发送结束标志位 TI清0
  107.   B_TI = 1;           //将B_TI 置1 方便上面的Uart1_TxByte 函数判断
  108. }
  109. }
  110. /*************************************************************
  111. *  函数名:delay_ms(unsigned char ms)
  112. *  输入:延时时间
  113. *  输出:无
  114. *  功能描述:产生毫秒级别延时.
  115.             
  116. **************************************************************/
  117. void delay_ms(unsigned char ms)       //毫秒级延时函数
  118. {
  119.     unsigned int i;
  120. do{
  121.      i = MAIN_Fosc /1400;
  122.   while(--i);
  123. }while(--ms);
  124. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表