找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机中断执行不了,求大神解答

[复制链接]
跳转到指定楼层
楼主
ID:417505 发表于 2018-10-29 20:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint count;
sbit LED1 = P1^0;
void q(uchar a)
{
    uchar x,y;
    for(x = a; x > 0;x--)
    {
        for(y = 114;y > 0;y--);
    }   
}
void init()
{
    TMOD=0x01;
    TH0=0x4b;
    TL0=0xfd;
    TR0=1;
    ET0=1;
    EA = 1;//开总中断
}
void main()
{   
    init();
    while(1)
    {               
    P1 = 0;
    }
}
void timer() interrupt 1
{
    LED1 = ~LED1;
    TH0=0x4b;
    TL0=0xfd;
    count++;
    if(count == 8)
    {
        P1 = 0xff;
        q(10);
        count = 0;
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:41713 发表于 2018-10-30 08:52 | 只看该作者
你的While循环,把P1限制为低电平了,中断刚生效,While就马上把电平拉低,你的灯应该一直亮。While循环里,放点别的语句,只要不是对P1的改动就行。
回复

使用道具 举报

板凳
ID:164602 发表于 2018-10-30 08:57 | 只看该作者
谁说中断没有执行?灯在闪啊
程序有点小问题,我已经修改了,在我的板子了运行通过
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint count;
sbit LED1 = P1^0;
void q(uchar a)
{
    uchar x,y;
    for(x = a; x > 0;x--)
    {
        for(y = 114;y > 0;y--);
    }   
}
void init()
{
    TMOD=0x01;
    TH0=0x4b;
    TL0=0xfd;
    TR0=1;
    ET0=1;
    EA = 1;//开总中断
}
void main()
{   
    init();
    while(1)
    {               
    }
}
void timer() interrupt 1
{
    LED1 = ~LED1;
    TH0=0x4b;
    TL0=0xfd;
    count++;
    if(count == 8)
    {
        q(10);
        count = 0;
    }
}
不知道你为什么要将P1置0或ff,我把它们去掉,就可以看到灯闪了。如果不去掉,灯就以PWM方式亮,亮度很暗。
回复

使用道具 举报

地板
ID:153397 发表于 2018-10-30 10:48 | 只看该作者
膜拜楼上大神
回复

使用道具 举报

5#
ID:417934 发表于 2018-10-30 14:56 | 只看该作者
谁说中断没有执行?灯在闪啊
程序有点小问题,我已经修改了,在我的板子了运行通过
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint count;
sbit LED1 = P1^0;
void q(uchar a)
{
    uchar x,y;
    for(x = a; x > 0;x--)
    {
        for(y = 114;y > 0;y--);
    }   
}
void init()
{
    TMOD=0x01;
    TH0=0x4b;
    TL0=0xfd;
    TR0=1;
    ET0=1;
    EA = 1;//开总中断
}
void main()
{   
    init();
    while(1)
    {               
    }
}
void timer() interrupt 1
{
    LED1 = ~LED1;
    TH0=0x4b;
    TL0=0xfd;
    count++;
    if(count == 8)
    {
        q(10);
        count = 0;
    }
}
回复

使用道具 举报

6#
ID:44335 发表于 2018-10-30 15:43 | 只看该作者
你的While循环,把P1限制为低电平了,中断刚生效,While就马上把电平拉低,你的灯应该一直亮。While循环里,放点别的语句,只要不是对P1的改动就行。
回复

使用道具 举报

7#
ID:410942 发表于 2018-10-30 17:11 | 只看该作者
不要while 里面的P1=0;如果要它的初值是0的话可以直接放在while上面。你这样写的确跟定时器中断有冲突。
回复

使用道具 举报

8#
ID:418093 发表于 2018-10-30 18:56 | 只看该作者
修改一下循环语句
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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