找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC52RC单片机问题求助

[复制链接]
回帖奖励 150 黑币 回复本帖可获得 30 黑币奖励! 每人限 1 次(中奖概率 60%)
跳转到指定楼层
楼主
ID:354781 发表于 2019-11-21 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下  #include "reg52.h"

void UartInit(void)
{
  TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SCON=0X50;
        ES=1;
        EA=1;
}
void main()
{
UartInit();
        while(1);
}

void Uart() interrupt 4
{

        P1=SBUF;
        RI=0;
        SBUF=P1;
        while(!TI);
        TI=0;
}
烧录提示如下
正在检测目标单片机 ...
  单片机型号: STC89C52RC/LE52RC
  固件版本号: 4.3C

当前芯片的硬件选项为:
  . 当前的时钟频率: 7.332MHz
  . 系统频率为12T(单倍速)模式
  . 振荡器的放大增益不降低
  . 当看门狗启动后,任何复位都可停止看门狗
  . MCU内部的扩展RAM可用
  . ALE脚的功能选择仍然为ALE功能脚
  . P1.0和P1.1与下次下载无关
  . 下次下载用户程序时,不擦除用户EEPROM区

  单片机型号: STC89C52RC/LE52RC
  固件版本号: 4.3C


正在重新握手 ... 成功                        [0.765"]
当前的波特率: 9600
正在擦除目标区域 ... 完成 !                [0.312"]
正在下载用户代码 ... 完成 !                [0.827"]
正在设置硬件选项 ... 完成 !                [0.063"]

更新后的硬件选项为:
  . 当前的时钟频率: 7.332MHz
  . 系统频率为12T(单倍速)模式
  . 振荡器的放大增益不降低
  . 当看门狗启动后,任何复位都可停止看门狗
  . MCU内部的扩展RAM可用
  . ALE脚的功能选择仍然为ALE功能脚
  . P1.0和P1.1与下次下载无关
  . 下次下载用户程序时,不擦除用户EEPROM区

  单片机型号: STC89C52RC/LE52RC
  固件版本号: 4.3C


操作成功 !(2019-11-21 21:53:47)

用串口助手点灯 灯乱亮 求大神帮助
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:25310 发表于 2019-11-22 08:09 | 只看该作者
看看内部时钟频率设定和波特率是否匹配。
回复

使用道具 举报

板凳
ID:470332 发表于 2019-11-22 09:04 | 只看该作者
1、检查串口接收是否正常
2、串口助手是不是以16进制的方式发送的
回复

使用道具 举报

地板
ID:213173 发表于 2019-11-22 11:03 | 只看该作者
程序没有什么问题,串口助手是HEX模式,可能是楼主没适应P1接LED的反码表示,可以加一个中间变量取反处理。
  1. #include "reg52.h"

  2. void UartInit(void)
  3. {
  4.         TMOD=0x20;
  5.         TH1=0xfd;
  6.         TL1=0xfd;
  7.         TR1=1;
  8.         SCON=0X50;
  9.         ES=1;
  10.         EA=1;
  11. }
  12. void main()
  13. {
  14.         UartInit();
  15.         while(1);
  16. }

  17. void Uart() interrupt 4
  18. {
  19.         unsigned char i;
  20.         RI=0;
  21.         i=SBUF;
  22.         P1=~i;//LED低电平亮
  23.         SBUF=i;
  24.         while(!TI);
  25.         TI=0;
  26. }
复制代码
回复

使用道具 举报

5#
ID:647245 发表于 2019-11-22 14:48 | 只看该作者
可以加一个中间变量取反处理。
回复

使用道具 举报

6#
ID:245004 发表于 2019-11-22 19:57 | 只看该作者
前面几位朋友给出的建议值得参考,但是还有一点需要注意,楼主实际已经给出了答案:串口设置和实际时钟不统一。

STC89C52RC没有内部时钟,只能用外部时钟,而且上面这个芯片版本也很旧了。

另外我不明白为什么要把“while(!TI);”放在串口中断里面?你们学习是从哪里学的?真怀疑自己是不是落伍了!

下面这段代码可以试试:
由于没有实际测试7.332Mhz,有什么问题还请帮忙修改。

#include <intrins.h>
#include <reg51.h>

#define FOSC 7332000UL
// #define FOSC 11059200UL
#define BAUD 9600
// 9600bps@FOSC
void UartInit(void) {
  SCON = 0x50;
  TMOD &= 0x0f;
  TMOD |= 0x20;
  TL1 = 256 - (FOSC / 12 / 32 / BAUD);  // 0xfe@7.332MHz
  TH1 = TL1;
  ET1 = 0;
  ES = 1;
  TR1 = 1;
}

void Uart_Isr() interrupt 4 {
  if (RI) {
    RI = 0;
    P1 = SBUF;
    _nop_();
    SBUF = P1;
  }
  if (TI) {
    TI = 0;
  }
}

// 主函数
void main(void) {
  UartInit();
  EA = 1;
  while (1) {
  }
}


回复

使用道具 举报

7#
ID:354781 发表于 2019-11-24 20:05 | 只看该作者
谢谢各位大佬的帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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