问题遇到的现象和发生背景
目的是实现时间在串口助手上打印
例如2022 01 01 00-00-00-MON
遇到的现象和发生背景,请写出第一个错误信息
串口接收的格式很奇怪
2022 不能在同一行打印
这是串口i接受的信息(每次两行)
[16:37:04.698]接收←2
[16:37:04.761]接收←022-01-01-00-01-23-MON
[16:37:06.208]接收←2
[16:37:06.255]接收←022-01-01-00-01-24-MON
[16:37:07.698]接收←2
[16:37:07.760]接收←022-01-01-00-01-25-MON
[16:38:59.328]接收←2
[16:38:59.375]接收←022-01-01-00-00-03-MON
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include <reg52.h>
sbit SegmentG1 = P2^3; //定义数码管1
sbit SegmentG2 = P2^2; //定义数码管2
sbit SegmentG3 = P2^1; //定义数码管3
sbit SegmentG4 = P2^0; //定义数码管4
int mode=1,tick=1,year=2022,month=1,m=0,day=1,hour=0,min=0,sec=1,w=0,ws=0;
static unsigned char s_arrNumber[] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //定义数码管显示数字0-9
static unsigned char arrmonth[]={31,29,31,30,31,30,31,31,30,31,30,31};
static unsigned char arrweek[7][3]={"MON","TUE","WED","THR","FRI","STA","SUN"};
static void DelayNms(int nms);
static void InitLED(void);
static void InitLED(void)
{
P2 = 0xff;
}
static void DelayNms(int nms)
{
unsigned int i,j;
for(i=0;i<nms;i++)
{
for(j=0;j<123;j++)
{
}
}
}
static void InitUART()
{
SCON = 0x50; //设置串口工作模式1,并打开接收允许
TMOD = 0x20; //设置定时器1工作模式2(8位自动重装载)
PCON = 0x80; //设置波特率加倍
TL1 = 0xf3; //设置定时器1 计数初值,波特率为4800
TH1 = TL1; //设置定时器1 重装载值,等于计数初值
TR1 = 1; //打开定时器1
}
static void InitInterrupt()
{
IT0 = 1; //设置外部中断0触发方式为下降沿触发
EX0 = 1; //打开外部中断0中断允许
IT1 = 1; //设置外部中断1触发方式为下降沿触发
EX1 = 1; //打开外部中断1中断允许x
ES = 1; //打开串口接收中断允许
EA = 1; //打开总中断允许
}
void main()
{
unsigned char i,temp;
int a,b,c,d;
InitInterrupt(); //初始化中断
InitUART(); //初始化串口
InitLED(); //LED初始化
while(1)
{
temp = ~0xef;
//第一阶段,从1-3轮流点亮
for(i = 0; i < 3; i++)
{
P2 = ~temp;
DelayNms(200); //延时200ms
temp <<= 1; //左移一位,轮流点亮
}
//第二阶段,从4-1轮流点亮
for(i = 0; i < 3; i++) //i<3 为了让循环流畅,i<4的时候上一循环结束跟下一循环开始为同一状态,耗时400ms
{
P2 = ~temp; //取反是因为temp右移产生的是0
DelayNms(200); //延时200ms
temp >>= 1; //右移一位,轮流点亮
}
DelayNms(50);
tick++;
sec=tick%60;
if(sec==0)
{
min++;
if(min==60)
{
min=0,hour++;
if(hour==24)
{
hour=0;
day++;
ws++;
w=ws%7;
if(day>arrmonth[m])
{
m++;month++;day=1;
if(m==13)
{
year++;
month=1,m=0;
}
}
}
}
}
if(mode==1)
{
a=hour/10;
b=hour%10;
c=min/10;
d=min%10;
}
else
{
a=month/10;
b=month%10;
c=day/10;
d=day%10;
}
for(i=0;i<10;i++)
{
P0 = s_arrNumber[a]; //数码管1显示为数字1
SegmentG1 = 0; //打开数码管1
DelayNms(5); //延时5ms
SegmentG1 = 1; //关闭数码管1
P0 = s_arrNumber[b]; //数码管2显示为数字2
SegmentG2 = 0; //打开数码管2
DelayNms(5); //延时5ms
SegmentG2 = 1; //关闭数码管2
P0 = s_arrNumber[c]; //数码管3显示为数字3
SegmentG3 = 0; //打开数码管3
DelayNms(5); //延时5ms
SegmentG3 = 1; //关闭数码管3
P0 = s_arrNumber[d]; //数码管4显示为数字4
SegmentG4 = 0; //打开数码管4
DelayNms(5); //延时5ms
SegmentG4 = 1; //关闭数码管4
}
SBUF= '\n';
}// end of while(1)
}
void UART_Handler() interrupt 4
{
unsigned char arrSBUF[24];
unsigned char i;//用指针?
arrSBUF[0]=(year/1000)+'0';
arrSBUF[1]=(year%1000)/100+'0';
arrSBUF[2]=(year%100)/10+'0';
arrSBUF[3]=year%10+'0';
arrSBUF[4]='-';
arrSBUF[5]=month/10+'0';
arrSBUF[6]=month%10+'0';
arrSBUF[7]='-';
arrSBUF[8]=day/10+'0';
arrSBUF[9]=day%10+'0';
arrSBUF[10]='-';
arrSBUF[11]=hour/10+'0';
arrSBUF[12]=hour%10+'0';
arrSBUF[13]='-';
arrSBUF[14]=min/10+'0';
arrSBUF[15]=min%10+'0';
arrSBUF[16]='-';
arrSBUF[17]=sec/10+'0';
arrSBUF[18]=sec%10+'0';
arrSBUF[19]='-';
arrSBUF[20]=arrweek[w][0];
arrSBUF[21]=arrweek[w][1];
arrSBUF[22]=arrweek[w][2];
arrSBUF[23]='\n';
for(i=0;i<24;i++)
{
SBUF = arrSBUF[i];; //将数据放入到寄存器
while(!TI) //等待发送数据完成
{
}
TI = 0; //清除发送中断请求标志位
}
}
void Exrernal0_Handler() interrupt 0
{
mode= ~mode; //反转mode
}
运行结果及详细报错内容
这是串口接收到的:
[16:37:04.698]接收←2
[16:37:04.761]接收←022-01-01-00-01-23-MON
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
在main 函数里的while(1)
{
最后的SBUF= 可能对下面的产生了影响
}
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
将2022放到同一行