找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7317|回复: 9
打印 上一主题 下一主题
收起左侧

请教大神,谁用过STC15W204S单片机,怎么设置串口通信,简单的收或发送例程都行?

[复制链接]
楼主
ID:155507 发表于 2019-12-2 22:01 | 显示全部楼层
STC15W204S单片机 没有定时器1

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15W201S 系列 定时器2用作串口1的波特率发生器举例------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  9. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  10. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  11. /*---------------------------------------------------------------------*/

  12. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  13. //若无特别说明,工作频率一般为11.0592MHz


  14. #include "reg51.h"
  15. #include "intrins.h"

  16. typedef unsigned char BYTE;
  17. typedef unsigned int WORD;

  18. #define FOSC 11059200L          //系统频率
  19. #define BAUD 115200             //串口波特率

  20. #define NONE_PARITY     0       //无校验
  21. #define ODD_PARITY      1       //奇校验
  22. #define EVEN_PARITY     2       //偶校验
  23. #define MARK_PARITY     3       //标记校验
  24. #define SPACE_PARITY    4       //空白校验

  25. #define PARITYBIT EVEN_PARITY   //定义校验位

  26. sfr P5          =   0xC8;   //xxxx,1111 端口5
  27. sbit P50        =   P5^0;
  28. sbit P51        =   P5^1;
  29. sbit P52        =   P5^2;
  30. sbit P53        =   P5^3;
  31. sbit P54        =   P5^4;
  32. sbit P55        =   P5^5;
  33. sbit P56        =   P5^6;
  34. sbit P57        =   P5^7;
  35. sfr P1M1 = 0x91;
  36. sfr P1M0 = 0x92;
  37. sfr P3M1 = 0xb1;
  38. sfr P3M0 = 0xb2;
  39. sfr P5M1 = 0xC9;
  40. sfr P5M0 = 0xCA;


  41. sfr AUXR  = 0x8e;               //辅助寄存器
  42. sfr T2H   = 0xd6;               //定时器2高8位
  43. sfr T2L   = 0xd7;               //定时器2低8位

  44. sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

  45. #define S1_S0 0x40              //P_SW1.6
  46. #define S1_S1 0x80              //P_SW1.7

  47. //sbit P55 = P5^5;

  48. bit busy;

  49. void SendData(BYTE dat);
  50. void SendString(char *s);

  51. void main()
  52. {
  53.     P1M0 = 0x00;
  54.     P1M1 = 0x00;
  55.     P3M0 = 0x00;
  56.     P3M1 = 0x00;
  57.     P5M0 = 0x00;
  58.     P5M1 = 0x00;


  59.     ACC = P_SW1;
  60.     ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  61.     P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
  62.    
  63. //  ACC = P_SW1;
  64. //  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  65. //  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  66. //  P_SW1 = ACC;  
  67. //  
  68. //  ACC = P_SW1;
  69. //  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
  70. //  ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
  71. //  P_SW1 = ACC;  

  72. #if (PARITYBIT == NONE_PARITY)
  73.     SCON = 0x50;                //8位可变波特率
  74. #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
  75.     SCON = 0xda;                //9位可变波特率,校验位初始为1
  76. #elif (PARITYBIT == SPACE_PARITY)
  77.     SCON = 0xd2;                //9位可变波特率,校验位初始为0
  78. #endif

  79.     T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  80.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  81.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  82.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  83.     ES = 1;                     //使能串口1中断
  84.     EA = 1;

  85.     SendString("STC15W201S\r\nUart Test !\r\n");
  86.     while(1);
  87. }

  88. /*----------------------------
  89. UART 中断服务程序
  90. -----------------------------*/
  91. void Uart() interrupt 4
  92. {
  93.     if (RI)
  94.     {
  95.         RI = 0;                 //清除RI位
  96.         P1 = SBUF;              //P0显示串口数据
  97.         P55 = RB8;              //P5.5显示校验位
  98.     }
  99.     if (TI)
  100.     {
  101.         TI = 0;                 //清除TI位
  102.         busy = 0;               //清忙标志
  103.     }
  104. }

  105. /*----------------------------
  106. 发送串口数据
  107. ----------------------------*/
  108. void SendData(BYTE dat)
  109. {
  110.     while (busy);               //等待前面的数据发送完成
  111.     ACC = dat;                  //获取校验位P (PSW.0)
  112.     if (P)                      //根据P来设置校验位
  113.     {
  114. #if (PARITYBIT == ODD_PARITY)
  115.         TB8 = 0;                //设置校验位为0
  116. #elif (PARITYBIT == EVEN_PARITY)
  117.         TB8 = 1;                //设置校验位为1
  118. #endif
  119.     }
  120.     else
  121.     {
  122. #if (PARITYBIT == ODD_PARITY)
  123.         TB8 = 1;                //设置校验位为1
  124. #elif (PARITYBIT == EVEN_PARITY)
  125.         TB8 = 0;                //设置校验位为0
  126. #endif
  127.     }
  128.     busy = 1;
  129.     SBUF = ACC;                 //写数据到UART数据寄存器
  130. }

  131. /*----------------------------
  132. 发送字符串
  133. ----------------------------*/
  134. void SendString(char *s)
  135. {
  136.     while (*s)                  //检测字符串结束标志
  137.     {
  138.         SendData(*s++);         //发送当前字符
  139.     }
  140. }



复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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