找回密码
 立即注册
查看: 1233|回复: 8

开启串口打印功能后单片机没有执行if语句

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-11 10:30:45 | 显示全部楼层 |阅读模式

各位大佬,我经常遇到这个问题:在函数while(1)的大循环里面,如果开启串口打印信息功能,定时计时250mS时间到并没有打开绿灯,或者定时计时250mS时间到了打开绿灯但是到后面1050mS到了绿灯并没有关闭。如果关闭串口打印信息功能,一切正常。这是为什么?如果要开启串口打印信息功能同时也要单片机运行程序正常,怎么解决此问题?
while(1)

{
        data_0x10=read_data(0x10);//读取充电盒各种状态的寄存器
        ST_CH=0x20&data_0x10;//如果芯片在充电状态,ST_CH==0x20
        ST_CH_END=0x40&data_0x10;//如果电池充满电,ST_CH_END==0x40

        TI=1;

        printf("ST_CH_END is 0x%bx\n",ST_CH_END);//串口打印ST_CH_END状态
        while(TI==0);
        TI=0;


       if(open_lid_flag==1)
   {

        if(oc_lid_led_5ms==50)//定时器计时250mS到了
                green_led=1;      //打开绿灯
        if(oc_lid_led_5ms==1050)//定时器计时5S时间到了
                {
                        green_led=0;//关闭绿灯
                        open_lid_flag=0;
                        oc_lid_led_5ms=0;
                        hvbat_flag=0;
                        TR0=0;
                }

    }
}

void timer0() interrupt 1//count time 5ms
{
        if((open_lid_flag==1)||(close_lid_flag==1))
                oc_lid_led_5ms++;

}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2025-06-19 00:29:31

8

主题

353

回帖

2482

积分

金牌会员

积分
2482
发表于 2023-4-11 14:46:26 | 显示全部楼层
  if(oc_lid_led_5ms==50)//定时器计时250mS到了
这一行判断只有5ms间隙机会,不然中断里计数器累加超过50就要死变量溢出再回头了,
改为if(oc_lid_led_5ms>=50),或者中断里计数器做个50限幅应该就可以了
你试试,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-11 16:12:23 | 显示全部楼层
网*** 发表于 2023-4-11 14:46
if(oc_lid_led_5ms==50)//定时器计时250mS到了
这一行判断只有5ms间隙机会,不然中断里计数器累加超过50就 ...

好的,中断里计数器做个50限幅,这个功能怎么写代码呢?谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2025-06-19 00:29:31

8

主题

353

回帖

2482

积分

金牌会员

积分
2482
发表于 2023-4-11 16:31:03 | 显示全部楼层
98057*** 发表于 2023-4-11 16:12
好的,中断里计数器做个50限幅,这个功能怎么写代码呢?谢谢

后面用到5ms计数器值1050判断,所以中断限幅不可能了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-11 16:51:27 | 显示全部楼层
网*** 发表于 2023-4-11 16:31
后面用到5ms计数器值1050判断,所以中断限幅不可能了

那麻烦解释一下我的疑问:

在函数while(1)的大循环里面,如果开启串口打印信息功能,定时计时250mS时间到并没有打开绿灯,或者定时计时250mS时间到了打开绿灯但是到后面1050mS到了绿灯并没有关闭。如果关闭串口打印信息功能,一切正常。这是为什么?为什么加入串口打印信息语句影响这么大?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:446
  • 最近打卡:2025-06-18 09:00:43
已绑定手机

40

主题

2064

回帖

7101

积分

论坛元老

积分
7101
发表于 2023-4-11 19:53:20 | 显示全部楼层
98057*** 发表于 2023-4-11 16:51
那麻烦解释一下我的疑问:

在函数while(1)的大循环里面,如果开启串口打印信息功能,定时计时250mS时间 ...

在主循环里加一个IO口翻转,通过测量IO口翻转时间就知道主循环多长时间执行一次,如果超过5ms的话,那么就可能判断不到绿灯开关的时间点。
串口打印是需要时间的,加上这个时间如果主循环一次就超过5ms的话,就会出现你说的那种现象。
最简单的方法就如2楼所说的,将判断语句里面的 “==50”、“==1050” 改成 “>=50”、“>=1050” 。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:96
  • 最近打卡:2025-06-18 10:41:10

74

主题

6099

回帖

1万

积分

超级版主

积分
12749
发表于 2023-4-11 21:14:37 | 显示全部楼层
打印函数是查询的,需要时间长,你判断时间错过了,应该在定时器中断中判断,然后设置标志。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-12 09:58:44 | 显示全部楼层
梁*** 发表于 2023-4-11 21:14
打印函数是查询的,需要时间长,你判断时间错过了,应该在定时器中断中判断,然后设置标志。 ...

好的,明白了,谢谢。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-12 10:00:02 | 显示全部楼层
乘风*** 发表于 2023-4-11 19:53
在主循环里加一个IO口翻转,通过测量IO口翻转时间就知道主循环多长时间执行一次,如果超过5ms的话,那么 ...

好的,明白了,谢谢大咖指点,但是不明白串口打印需要这么久
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 09:03 , Processed in 0.154193 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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