上午好☀️☀️☀️️
本答案参考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;
}
