木槿呀 2024-04-09 17:25 采纳率: 72.2%
浏览 49

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

我串口用的定时器1,数码管显示用的定时器2。当没有写串口初始化的时候,数码管可以正常显示,加上串口初始化之后,数码管就不能正常显示了,为什么呀?
main.c

#include <STC15F2K60S2.H>
#include "hardware.h"
//----------------------------------------------------------------------
void Delay(unsigned int t)
{
    while(t--);
}
//----------------------------------------------------------------------

//----------------------------------------------------------------------
void main()
{
    Timer5Init();    
    Init_Uart();
    Delay(60000);
    Delay(60000);
    while(1)
    {
        
    }
}

hardware.c

#include <STC15F2K60S2.H>
#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;
}

  • 写回答

4条回答 默认 最新

  • 关注

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

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

    解决方案:

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

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

    修改后的代码:

    main.c

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

    hardware.c

    #include <STC15F2K60S2.H>
    #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;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月9日

悬赏问题

  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3
  • ¥20 Tesla 特斯拉K80显卡 如果需要使用该设备,你需要禁用系统上的另一个设备。
  • ¥30 QT调用百度智能云千帆模型无法取得返回文本
  • ¥50 CCD工业视觉相机检测出现光边
  • ¥60 二次元手游日常任务自动化代肝(相关搜索:自动化)
  • ¥15 mysql将查询的结果作为动态列名怎么实现