51 TF0与TF1清零引发的思考

本文探讨了51单片机中T0/T1定时器在使用过程中的中断问题,特别是关于定时出现的概率性不准现象。通过分析发现,使用按位与运算符(&)在清除中断标志时可能会误清其他中断标志,提出了改用直接赋值的方法解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义TCON中的位

/* sfr TCON = 0x88; */ /* T0/T1 控制寄存器 */                

#define B_TF1 7 /* T1 溢出标志 */                     
#define B_TR1 6 /* T1 启动控制 */                     
#define B_TF0 5 /* T0 溢出标志 */                     
#define B_TR0 4 /* T0 启动控制 */                     
#define B_IE1 3 /* INT1 中断标志 */                   
#define B_IT1 2 /* INT1 触发方式 0:低电平, 1:下奖沿 */
#define B_IE0 1 /* INT0 中断标志  */                  

#define B_IT0 0 /* INT0 触发方式 0:低电平, 1:下奖沿 */

软件部分

void    isrT1(void) interrupt T1_VECTOR // 3
{
    TCON &=  ~(1<<(B_TF1));        // clear flag

...

}

void    isrT0(void) interrupt T0_VECTOR // 1

{

    TCON &=  ~(1<<(B_TF0));        // clear flag

...

}

    结果出现了T0,T1定时出现概率性不准。经过一番吐血,原来是&指令搞得鬼。

    在T0中断中, TCON &=  ~(1<<(B_TF0));如果此时 TF1刚好产生,经过这句话后,TF1会被清零。

同理在T1中断中也会发生。

    改善措施:采用位操作指令:TF0 = 0; 与 TF1 = 0;就避开此问题。

    同理在IO操作也会遇到类似的问题。 输出端口 读操作的输入源有两种:

    一种是从端口数据寄存器读取,另一种是直接读引脚电平。

    用读取指令来区分: 读-改-写指令是读寄存器,而其它指令读引脚电平。

   读改写指令有:

    ANL、ORL、XRL、DJNZ、INC、DEC、JBC、CPL、CLR、SETB、MOV  PX.Y, C


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值