找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于STC8单片机的一些疑惑,望大神有心情解答一下,功能脚切换使用问题

[复制链接]
跳转到指定楼层
楼主
ID:1022674 发表于 2023-1-31 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用单片机串口1时,寄存器SCON,B0和B1位的RI和TI能直接使用,但是在使用串口2时,S2CON,S2BUF,S2RI和S2RI都不能使用,S2RI和S2RI这两个好像不好定义。在使用时是不是只能给S2CON整体赋值(运算赋值)来达到发送/接收中断请求标志位清零?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1022674 发表于 2023-1-31 13:31 | 只看该作者
本来是点保存的,结果直接发了,现在图片补上。不知道这样能不能直接显示出来。

串口2图解.png (291.89 KB, 下载次数: 44)

串口2图解.png
回复

使用道具 举报

板凳
ID:155507 发表于 2023-1-31 15:40 | 只看该作者
是的,只能给 S2CON 整体赋值(运算赋值)来达到发送/接收中断请求标志位清零

  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC            11059200UL
  4. #define BRT             (65536 - FOSC / 115200 / 4)

  5. sfr     AUXR        =   0x8e;
  6. sfr     T2H         =   0xd6;
  7. sfr     T2L         =   0xd7;
  8. sfr     S2CON       =   0x9a;
  9. sfr     S2BUF       =   0x9b;
  10. sfr     IE2         =   0xaf;

  11. bit busy;
  12. char wptr;
  13. char rptr;
  14. char buffer[16];

  15. void Uart2Isr() interrupt 8
  16. {
  17.     if (S2CON & 0x02) //S2TI 串口 2 发送中断请求标志位
  18.     {
  19.         S2CON &= ~0x02;
  20.         busy = 0;
  21.     }
  22.     if (S2CON & 0x01)  //S2RI 串口 2 接收中断请求标志位
  23.     {
  24.         S2CON &= ~0x01;
  25.         buffer[wptr++] = S2BUF;
  26.         wptr &= 0x0f;
  27.     }
  28. }

  29. void Uart2Init()
  30. {
  31.     S2CON = 0x10;
  32.     T2L = BRT;
  33.     T2H = BRT >> 8;
  34.     AUXR = 0x14;
  35.     wptr = 0x00;
  36.     rptr = 0x00;
  37.     busy = 0;
  38. }

  39. void Uart2Send(char dat)
  40. {
  41.     while (busy);
  42.     busy = 1;
  43.     S2BUF = dat;
  44. }

  45. void Uart2SendStr(char *p)
  46. {
  47.     while (*p)
  48.     {
  49.         Uart2Send(*p++);
  50.     }
  51. }

  52. void main()
  53. {
  54.     Uart2Init();
  55.     IE2 = 0x01;
  56.     EA = 1;
  57.     Uart2SendStr("Uart Test !\r\n");

  58.     while (1)
  59.     {
  60.         if (rptr != wptr)
  61.         {
  62.             Uart2Send(buffer[rptr++]);
  63.             rptr &= 0x0f;
  64.         }
  65.     }
  66. }

复制代码
回复

使用道具 举报

地板
ID:1022674 发表于 2023-1-31 16:18 | 只看该作者
angmall 发表于 2023-1-31 15:40
是的,只能给 S2CON 整体赋值(运算赋值)来达到发送/接收中断请求标志位清零

新年快乐!感谢解惑!受教了,不停的看官方PDF,看多了就慢慢的好像就有点点明白了,但还是有很多不明白的地方,官方也没有明说,还是非常感谢大神们的宝贵知识与经验。
回复

使用道具 举报

5#
ID:1042619 发表于 2023-1-31 16:30 | 只看该作者

STC8单片机的S2CON地址0x9A,不支持位操作(地址低4位是0或者8的SFR寄存器才支持位操作),所以需要通过整体赋值(运算赋值)的方式进行设置。
STC32的所有SFR寄存器都支持位操作,就可以直接对S2RI,S2TI进行位操作。
回复

使用道具 举报

6#
ID:1034262 发表于 2023-1-31 23:21 | 只看该作者
51核的特殊功能寄存器,地址结尾不是0或8的,都不能位寻址,只能用赋值、与、或操作,建议用与、或操作。
S2CON &= ~0x01;   //清除S2RI
S2CON &= ~0x02;   //清除S2TI
S2CON |= ~0x80;   //置位S2SM0

回复

使用道具 举报

7#
ID:1022674 发表于 2023-2-1 03:01 来自手机 | 只看该作者
大漠孤烟001 发表于 2023-1-31 16:30
STC8单片机的S2CON地址0x9A,不支持位操作(地址低4位是0或者8的SFR寄存器才支持位操作),所以需要通过 ...

非常感谢大神说的知识点,接触单片机的时间不长,要学的东西太多了,谢谢!新年快乐!
回复

使用道具 举报

8#
ID:1022674 发表于 2023-2-1 03:07 来自手机 | 只看该作者
coody_sz 发表于 2023-1-31 23:21
51核的特殊功能寄存器,地址结尾不是0或8的,都不能位寻址,只能用赋值、与、或操作,建议用与、或操作。
...

感谢大神耐心的解惑,关于单片机,需要学习的知识点太多了,边实践边学习才是掌握知识最快的途径,谢谢!新年快乐!
回复

使用道具 举报

9#
ID:130230 发表于 2023-2-6 17:46 | 只看该作者
有些寄存器是可以位寻址的,有些不可以。
回复

使用道具 举报

10#
ID:491577 发表于 2023-2-11 15:03 | 只看该作者
可以位寻址的寄存器毕竟是少数,要习惯整体赋值。如果是STM32全部寄存器都只能整体赋值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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