找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2097|回复: 10
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
#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灯亮了之后就不灭,代码应该怎么修改啊

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:776029 发表于 2020-6-11 15:18 | 只看该作者
我想做一个手控灯,一个自动灯,但是那个自动灯亮了就不灭了
回复

使用道具 举报

板凳
ID:332444 发表于 2020-6-11 15:32 | 只看该作者
定时器里面的变量或声明为公共变量或声明为静态变量。否则进入中断变量始终为0。
回复

使用道具 举报

地板
ID:24758 发表于 2020-6-11 16:04 | 只看该作者


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

使用道具 举报

5#
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;
                }
        }
}
回复

使用道具 举报

6#
ID:24758 发表于 2020-6-11 16:50 | 只看该作者
另外y的值设的有点大,时间长得让人怀疑是不是有问题
回复

使用道具 举报

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

使用道具 举报

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

懂了多谢
回复

使用道具 举报

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

好的多谢
回复

使用道具 举报

10#
ID:436885 发表于 2020-6-12 01:31 | 只看该作者
int x=0,y=0; 放到外面去做全局变量
回复

使用道具 举报

11#
ID:733205 发表于 2020-7-21 15:38 | 只看该作者
你这个用定时器触发中断,但是定时完一次之后你这个定时器需要重新启动,才能再次开始定时,然后进入中断才会反转
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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