[51单片机] 新人求教:关于定时器中断的运用,不知道哪里错了

[复制链接]
 楼主| hellocross 发表于 2020-4-11 21:08 | 显示全部楼层 |阅读模式
#include<reg52.h>
sbit D1=P1^0;
unsigned char tt=0;
void main()
{
        EA=1;
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;
        TR0=1;                  
        while(1)
        {
        if(tt==20)
        D1=0;
        if(tt==40)
        D1=1;
        tt=0;                           // 为什么此处加上tt=0以后,灯不亮了呢?
        }
}
void exter0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        tt++;
}

如上,程序中去掉tt=0语句后,P1^0脚输出动作正常,但是为什么加上tt=0以后P1^0没有了输出,不能实现P1^0脚循环通断呢?

叶春勇 发表于 2020-4-12 08:51 来自手机 | 显示全部楼层
本帖最后由 叶春勇 于 2020-4-12 08:53 编辑

中断里要修改的变量加volatile
ayb_ice 发表于 2020-4-13 10:18 | 显示全部楼层
每个循环都清零了,当然不会亮了,因为中断又要从零开始计时,没计几个又被你清零了

改为这样才是合理的

while(1)
{
        if (tt <= 20)
        {
                D1=0;
        }
        else
        {
                D1=1;
        }
        if (tt >= 40)
        {
                tt = 0;
        }
}
叶春勇 发表于 2020-4-13 11:29 | 显示全部楼层
顶楼上,正解
jyzhzn 发表于 2020-4-13 20:35 | 显示全部楼层
本帖最后由 jyzhzn 于 2020-4-13 20:42 编辑

if(tt==40)
        D1=1;
        tt=0;                           // 为什么此处加上tt=0以后,灯不亮了呢?
      

你这个if(tt==40)只对D1=1起作用
改成
while(1)
        {
        if(tt==20)
        D1=0;
        if(tt==40)                           {                            //加花括号
                D1=1;
                tt=0;                           // 为什么此处加上tt=0以后,灯不亮了呢?
         }                           //加花括号
        }
应该就没问题了


 楼主| hellocross 发表于 2020-4-24 20:57 | 显示全部楼层
jyzhzn 发表于 2020-4-13 20:35
if(tt==40)
        D1=1;
        tt=0;                           // 为什么此处加上tt=0以后,灯不亮了 ...

好!谢谢!受教了!
干掉9527 发表于 2020-4-24 23:35 | 显示全部楼层
编程规范需要好好练练
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部