找回密码
 立即注册

QQ登录

只需一步,快速开始

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

使用STC8单片机串口3复用口P51P50无数据发送接收

[复制链接]
跳转到指定楼层
楼主
所用芯片是STC8A8K64S4A12,用复用口P51、P50作为串口3,定时器3作为波特率发生器,发现无数据发送和接收,求助好心友友帮忙解答
  1. #include "STC8A8K64D4.H"
  2. #include <intrins.h>
  3. #include <math.h>

  4. typedef unsigned char u8;
  5. typedef unsigned int  u16;

  6. //串口3
  7. u8 T3_CNT;
  8. u8 R3_CNT;
  9. unsigned char xdata T3_BUF[10];
  10. unsigned char xdata R3_BUF[10];
  11. bit F_T3_Busy;
  12. bit F_R3_OK;

  13. //IO口 初始化 相关配置
  14. void IO_Init()
  15. {
  16.         P3M0 = 0x00;P3M1 = 0x00;        //P37-P30 双向口
  17.         P5M0 = 0x00;P5M1 = 0x00;        //P57-P50 双向口
  18.         P_SW2 = 0x02;
  19. }


  20. //-----------------------------------------------------
  21. //--------------------串口3设置-------------------------
  22. void Uart3_Init(void)        //57600bps@6.000MHz
  23. {
  24.          S3CON = 0x10;                //8位数据,可变波特率
  25.          S3CON |= 0x40;                //串口3选择定时器3为波特率发生器
  26.          T4T3M |= 0x02;                //定时器时钟1T模式
  27.          T3L = 0xE6;                        //设置定时初始值
  28.          T3H = 0xFF;                        //设置定时初始值
  29.          T4T3M |= 0x08;                //定时器3开始计时
  30.          IE2 = 0x08;                        //允许串口3中断
  31. }


  32. // void L_S3XBL()
  33. // {
  34. //         T3_BUF[0] = R3_BUF[0];
  35. //         T3_BUF[1] = R3_BUF[1];
  36. //         T3_BUF[2] = R3_BUF[2];
  37. //         T3_BUF[3] = R3_BUF[3];
  38. //         T3_BUF[4] = R3_BUF[4];
  39. //         T3_BUF[5] = R3_BUF[5];
  40. //         T3_BUF[6] = R3_BUF[6];
  41. //         T3_BUF[7] = R3_BUF[7];
  42. // }

  43. void L_S3XBL0()
  44. {
  45.         T3_BUF[0] = 0x5A;
  46.         T3_BUF[1] = 0xA5;
  47.         T3_BUF[2] = 0x05;
  48.         T3_BUF[3] = 1;
  49.         T3_BUF[4] = 1;
  50.         T3_BUF[5] = 1;
  51.         T3_BUF[6] = 1;
  52.         T3_BUF[7] = 1;
  53. }

  54. //串口3 发送函数
  55. void S3OUT(void)
  56. {
  57.         S3BUF = T3_BUF[0];
  58.         F_T3_Busy = 1;
  59.         while(F_T3_Busy);
  60. }

  61. //------串口3中断------
  62. void Uart3_Routine(void) interrupt 17
  63. {
  64.         //S3发送
  65.         if(S3CON & 0x02)
  66.         {
  67.                 S3CON &= ~0x02;
  68.                
  69.                 if(T3_BUF[2]+2 > T3_CNT)
  70.                 {
  71.                         T3_CNT++;
  72.                         S3BUF = T3_BUF[T3_CNT];
  73.                 }
  74.                 else
  75.                 {
  76.                         T3_CNT = 0;
  77.                         F_T3_Busy = 0;
  78.                 }
  79.         }
  80.         
  81.         //S3接收
  82.         if(S3CON & 0x01)
  83.         {
  84.                 S3CON &= ~0x01;        
  85.                  if(F_R3_OK==0)
  86.                  {
  87.                         R3_BUF[R3_CNT] = S3BUF;
  88.                         if(R3_CNT==0)
  89.                         {
  90.                                 if(R3_BUF[0]==0x5A)
  91.                                 {
  92.                                         R3_CNT++;
  93.                                 }
  94.                         }
  95.                         else if(R3_CNT==1)
  96.                         {
  97.                                 if(R3_BUF[1]==0xA5)
  98.                                 {
  99.                                         R3_CNT++;
  100.                                 }
  101.                                 else
  102.                                 {
  103.                                         R3_CNT = 0;
  104.                                 }
  105.                         }
  106.                         else if(R3_BUF[2]+2 > R3_CNT)
  107.                         {
  108.                                 R3_CNT++;
  109.                         }
  110.                         else
  111.                         {
  112.                                 R3_CNT = 0;
  113.                                 F_R3_OK = 1;
  114.                         }
  115.                  }
  116.         }        
  117. }

  118. void main(void)
  119. {
  120.         IO_Init();
  121.         Uart3_Init();
  122.         EA = 1;        
  123.         while(1)
  124.         {
  125.                 //直接发送
  126.                 L_S3XBL0();
  127.                 S3OUT();
  128.                                 
  129.         }
  130. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1034262 发表于 2025-7-25 12:01 | 只看该作者
这是STC官方的例子“03-串口3中断收发-C语言”,你自己选择IO编译一下:UART3_config( 115200UL, 3, 1);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer3做波特率. io=0: 串口3切换到P0.0 P0.1,  =1: 切换到P5.0 P5.1.

STC8A8K64D4-串口相关程序.rar (297.97 KB, 下载次数: 0)





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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