• 蓝桥杯单片机串口初始化加上之后,数码管就不能正常显示了,为什么


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 木槿呀 2024-04-09 17:25 采纳率: 75% 浏览 19 首页/ 嵌入式 / 蓝桥杯单片机串口初始化加上之后,数码管就不能正常显示了,为什么 单片机c语言蓝桥杯 我串口用的定时器1,数码管显示用的定时器2。当没有写串口初始化的时候,数码管可以正常显示,加上串口初始化之后,数码管就不能正常显示了,为什么呀?main.c #include #include "hardware.h" //---------------------------------------------------------------------- void Delay(unsigned int t) { while(t--); } //---------------------------------------------------------------------- //---------------------------------------------------------------------- void main() { Timer5Init(); Init_Uart(); Delay(60000); Delay(60000); while(1) { } } hardware.c #include #include "hardware.h" /************* 本地常量声明 **************/ unsigned char code t_display[]={ //标准字库 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, //black - H J K L N o P U t G Q r M y 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e, 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1 unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码 unsigned char SMG_buf[8]={2,0,2,4,17,4,17,9}; unsigned char led_buf=0xff; unsigned char ws_buf=0x00; unsigned char timer10ms=0; //----------------------------------------------------------------------------------------------- void SelectHC573(unsigned char channel) { switch(channel) { case 4: P2=(P2&0x1f)|0x80; break; case 5: P2=(P2&0x1f)|0xa0; break; case 6: P2=(P2&0x1f)|0xc0; break; case 7: P2=(P2&0x1f)|0xe0; break; case 0: P2=(P2&0x1f)|0x00; break; } } //-------------------------------------------------------------------------- void led_output() { P0=led_buf; SelectHC573(4); SelectHC573(0); } //-------------------------------------------------------------------------- void SMG_output() { static unsigned char SMG_com=0; P0=0x00; SelectHC573(6); SelectHC573(0); P0=~t_display[SMG_buf[SMG_com]]; SelectHC573(7); SelectHC573(0); P0=T_COM[SMG_com]; SelectHC573(6); SelectHC573(0); if(++SMG_com>=8) { SMG_com=0; } } //------------------------------------------------------------------- void ws_output() { P0=ws_buf; SelectHC573(5); SelectHC573(0); } //-------------------------------------------------------------------- void Timer5Init() //1毫秒@12.000MHz,定时器2 { AUXR |= 0x04; //定时器时钟1T模式 T2L = 0x20; //设置定时初值 T2H = 0xD1; //设置定时初值 AUXR |= 0x10; //定时器2开始计时 IE2|=0x04; EA = 1; } //-------------------------------------------------------------------- void ServiceTimer2()interrupt 12 { led_output(); ws_output(); SMG_output(); timer10ms++; } //-------------------------------------------------------------------- void Init_Uart()//串口用计时器1 { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SCON=0x50; AUXR=0x00; ES=1; EA=1; } 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 09:25
      关注

      上午好☀️☀️☀️️
      本答案参考ChatGPT-3.5

      原因:串口初始化可能会修改定时器的配置寄存器,导致之前设置的定时器2配置被改变。

      解决方案:

      1.检查串口初始化的代码,确保它不会修改定时器2的配置寄存器。

      2.将串口初始化的代码移动到定时器2的初始化代码之后,以确保定时器2的配置在设置完之后不会被改变。同时,在串口初始化代码之前添加一个延时,以便定时器2能够正确地初始化。

      修改后的代码:

      main.c

      #include 
      #include "hardware.h"
      
      void Delay(unsigned int t)
      {
          while(t--);
      }
      
      void main()
      {
          Timer5Init();    
          Delay(1000);  // 1秒延时
          Init_Uart();  
          while(1)
          {
              
          }
      }
      

      hardware.c

      #include 
      #include "hardware.h"
      
      unsigned char code t_display[]={
      //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
          0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
      //black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
          0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
          0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
      
      unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
      unsigned char SMG_buf[8]={2,0,2,4,17,4,17,9};
      unsigned char led_buf=0xff;
      unsigned char ws_buf=0x00;
      unsigned char timer10ms=0;
      
      void SelectHC573(unsigned char channel)
      {
          switch(channel)
          {
              case 4:
                  P2=(P2&0x1f)|0x80;
              break;
              case 5:
                  P2=(P2&0x1f)|0xa0;
              break;
              case 6:
                  P2=(P2&0x1f)|0xc0;
              break;
              case 7:
                  P2=(P2&0x1f)|0xe0;
              break;
              case 0:
                  P2=(P2&0x1f)|0x00;
              break;
          }
      }
      
      void led_output()
      {
          P0=led_buf;
          SelectHC573(4);
          SelectHC573(0);
      }
      
      void SMG_output()
      {
          static unsigned char SMG_com=0;
          
          P0=0x00;
          SelectHC573(6);
          SelectHC573(0);
          
          P0=~t_display[SMG_buf[SMG_com]];
          SelectHC573(7);
          SelectHC573(0);
          
          P0=T_COM[SMG_com];
          SelectHC573(6);
          SelectHC573(0);
          
          if(++SMG_com>=8)
          {
              SMG_com=0;
          }
          
      }
      
      void ws_output()
      {
          P0=ws_buf;
          SelectHC573(5);
          SelectHC573(0);
      }
      
      void Timer5Init()        //1毫秒@12.000MHz,定时器2
      {    
          AUXR |= 0x04;        //定时器时钟1T模式
          T2L = 0x20;        //设置定时初值
          T2H = 0xD1;        //设置定时初值
          AUXR |= 0x10;        //定时器2开始计时
          IE2|=0x04; 
          EA = 1;
      }
      
      void ServiceTimer2()interrupt 12
      {
          led_output();
          ws_output();
          SMG_output();
          timer10ms++;
      }
      
      void Init_Uart()//串口用计时器1
      {
          TMOD=0x20;
          TH1=0xfd;
          TL1=0xfd;
          TR1=1;
          SCON=0x50;
          AUXR=0x00;
          ES=1;
          EA=1;
      }
      

      展开全部

      评论
    • GISer Liu 2024-04-09 17:40
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据您描述的问题,您在单片机程序中使用了定时器1初始化串口,而数码管显示则使用了定时器2。在没有写串口初始化时,数码管可以正常显示,但加上串口初始化后,数码管就不能正常显示了。针对这个问题,我可以提供以下解决思路和方案:

      1. 定时器冲突 :首先需要确认定时器1和定时器2是否会发生冲突。由于您在初始化串口时使用了定时器1,而数码管显示使用了定时器2,需要确保两者不会发生资源冲突。如果两者同时操作了相同的资源或者有相互影响的情况,可能导致其中一个模块工作异常。
      2. 中断优先级设置 :单片机的中断优先级设置可能会影响定时器的工作。如果定时器1和定时器2的中断优先级设置不当,可能导致其中一个定时器的中断被另一个中断打断,从而影响程序的正常执行。建议确认中断优先级设置是否正确,确保定时器中断能够按照预期的顺序执行。
      3. 资源占用冲突 :检查串口初始化过程中是否占用了与数码管显示相关的资源,例如GPIO口或者共享的寄存器。如果串口初始化过程中占用了数码管显示相关的资源,可能会导致数码管无法正常显示。需要确保串口初始化不会影响数码管显示所需的资源。
      4. 时序问题 :在串口初始化过程中,是否存在时序问题,例如初始化过程中的延时是否影响了定时器2的工作。需要仔细检查串口初始化的时序,确保其不会影响其他模块的正常工作。
        解决方案可能包括:
      • 重新设计中断优先级设置,确保定时器中断按照正确的顺序执行。
      • 检查串口初始化过程中是否占用了数码管显示相关的资源,并进行必要的调整。
      • 确保串口初始化的时序不会影响定时器2的工作,可以适当调整延时或者初始化顺序。
        您可以根据以上思路逐一排查,定位到问题的根源,并进行相应的调整和修正。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-09 20:11
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    计算机毕业设计ssm手机销售平台系统i949w系统+程序+源码+lw+远程部署
    CSS总结
    C#的MessagePack(unity)--01
    开发板采集数据后存入数据库再在电脑上显示数据库
    嵌入式程序架构的可行性建议
    DAY36 738.单调递增的数字 + 968.监控二叉树
    Java进阶学习笔记15——接口概述
    python 操作windows的Wlan
    Springboot从数据库读取配置文件
    第14课 形变之城--故事卡--听ChatGPT说
  • 原文地址:https://ask.csdn.net/questions/8085795