找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2050|回复: 10
收起左侧

单片机控制D2灯亮了之后就不灭,问大神改怎么修改

[复制链接]
ID:776029 发表于 2020-6-11 12:08 | 显示全部楼层 |阅读模式
51hei图片20200611120720.png

单片机源程序如下:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit led1 = P1^0;
sbit led2 = P1^1;
void main()
{

        
                IT0 = 1;//设置外部中断触发方式为 下降沿触发
                EX0 = 1;//打开外部中断0
                EA = 1;//打开中断总开关        
                TMOD=0x01; //T0定时方式1
                   TH0=0x3C; //预置计数初值
                   TL0=0xB0;
                   ET0=1; //开T0中断
                   TR0=1; //启动T0   
                while(1);
}

void change_led() interrupt 0
{
        led1 = ~led1;
}        
void timer () interrupt 1
{
        int x=0,y=0;
        if(led2==0)
        {              
                x++;
                if(x==40)
                {
                        led2=1;
                        x=0;
                }
                TH0=0x3C; //计数初值重装载
                TL0=0xB0;        
        }
        if(led2==1)
        {
                y++;
                if(y==200)
                {
                        led2=0;
                        y=0;
                }
                TH0=0x3C; //计数初值重装载
                TL0=0xB0;
        }
        
}

D2灯亮了之后就不灭,代码应该怎么修改啊

回复

使用道具 举报

ID:776029 发表于 2020-6-11 15:18 | 显示全部楼层
我想做一个手控灯,一个自动灯,但是那个自动灯亮了就不灭了
回复

使用道具 举报

ID:332444 发表于 2020-6-11 15:32 | 显示全部楼层
定时器里面的变量或声明为公共变量或声明为静态变量。否则进入中断变量始终为0。
回复

使用道具 举报

ID:24758 发表于 2020-6-11 16:04 | 显示全部楼层
51hei图片20200611160403.png

你在定时器中断中定义的x,y是局部变量,每进入一次中断都会被重新赋值为0,所以它们永远不会达到你设置的改变条件。
回复

使用道具 举报

ID:213173 发表于 2020-6-11 16:39 | 显示全部楼层
楼主局部变量int x=0,y=0;,也就是每次进入中断都清0,永远也加不到想要的数。只有把x、y设为全局变量或局部静态变量才能达到楼主想要的效果。
void timer () interrupt 1
{
        static unsigned char x=0,y=0;
        TH0=0x3C; //计数初值重装载
        TL0=0xB0;
        if(led2==0)
        {              
                x++;
                if(x==40)
                {
                        led2=1;
                        x=0;
                }
        }
        if(led2==1)
        {
                y++;
                if(y==200)
                {
                        led2=0;
                        y=0;
                }
        }
}
回复

使用道具 举报

ID:24758 发表于 2020-6-11 16:50 | 显示全部楼层
另外y的值设的有点大,时间长得让人怀疑是不是有问题
回复

使用道具 举报

ID:673128 发表于 2020-6-11 18:06 | 显示全部楼层
把在定时器0的中断服务函数里的int前面加上static就行了。你的错误出现在每一次定时器中断进入你都会重置x,y值,导致其每次都是0开始,1结束。对于其为什么会亮,是因为你电路图有问题的,没有上拉或下拉电阻,你的端口值是不确定的,似乎是低电平,导致通电就亮。建议买块板子,不要用仿真,新手用实物,等你本事到了再用仿真。
回复

使用道具 举报

ID:776029 发表于 2020-6-11 19:49 | 显示全部楼层
左眼 发表于 2020-6-11 18:06
把在定时器0的中断服务函数里的int前面加上static就行了。你的错误出现在每一次定时器中断进入你都会重置x ...

懂了多谢
回复

使用道具 举报

ID:776029 发表于 2020-6-11 19:57 | 显示全部楼层
wulin 发表于 2020-6-11 16:39
楼主局部变量int x=0,y=0;,也就是每次进入中断都清0,永远也加不到想要的数。只有把x、y设为全局变量或局 ...

好的多谢
回复

使用道具 举报

ID:436885 发表于 2020-6-12 01:31 | 显示全部楼层
int x=0,y=0; 放到外面去做全局变量
回复

使用道具 举报

ID:733205 发表于 2020-7-21 15:38 | 显示全部楼层
你这个用定时器触发中断,但是定时完一次之后你这个定时器需要重新启动,才能再次开始定时,然后进入中断才会反转
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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