找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机中断程序跳不出来了,小白求助

[复制链接]
跳转到指定楼层
楼主
ID:241325 发表于 2018-1-25 12:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小白求助,中断程序跳不出来,不能往下执行,大神帮忙看看怎么改
#include<reg52.h>        
#define uint unsigned int
#define uchar unsigned char

sbit IN1=P3^1;//接IN1 控制正转
sbit IN2=P3^2;//接IN2 控制反转
sbit IN3=P3^3;
sbit IN4=P3^4;

sbit ENA=P3^5;          //使能
sbit ENB=P3^6;

uchar time;
void delay(uint);
void head();
void stop();
void configpwm();

void main()
{
        configpwm();    /*执行完这两个语句以后,
        head();             就不往下执行stop这条语句了,是哪个地方不对,大神帮
        delay(300);       忙看看怎么改*/
        stop();
}
void configpwm()
{
       TMOD=0x01;//定时器0工作方式1
       TH0=0xff;//(65536-200)/256;//赋初值定时
       TL0=0xf7;//(65536-200)%256;//0.2ms
       EA=1;//开总中断
       ET0=1;//开定时器0中断
       TR0=1;//启动定时器0
        
}

void timer0() interrupt 1
{
       TR0=0;//赋初值时,关闭定时器
       TH0=0xff;//(65536-200)/256;//赋初值定时         +
       TL0=0xf7;//(65536-200)%256;//0.2ms
       TR0=1;//打开定时器
           time++;
       if(time>=100) time=0;//50hz
       if(time<=80)
           {
            ENA=0; //占空比20%
                ENB=0;
           }
       else
           {
                ENA=1;
                ENB=1;
           }
}
void head(uint i)
{
                 IN1=1;          //正转   前
                IN2=0;
                IN3=0;           
                IN4=1;
}
void stop()
{
        IN1=0;
        IN2=0;
        IN3=0;
        IN4=0;
}
void delay(uint z)
{
        uint x,y;
        for(x=1000;x>0;x--)
        {
                for(y=z;y>0;y--);
        }
}





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

使用道具 举报

沙发
ID:279618 发表于 2018-1-25 14:18 | 只看该作者
程序有问题
回复

使用道具 举报

板凳
ID:279601 发表于 2018-1-25 14:26 | 只看该作者
不知道你用的是那款单片机,有些单片机本身自带循环的,你可以在程序最后stop();后面加一个while(1);语句试试看看是不是会停下来,再者你在stop();语句里可以把定时器中断给关了,反正你要实现的是停止,需要用的时候,在head();里打开中断,初始化可以关掉中断,这样你使用的时候调用函数就会打开中断,调用stop函数就可以关闭中断,把中断的关闭和打开指令放在相应的子函数里,这样就不会产生干扰了
回复

使用道具 举报

地板
ID:97438 发表于 2018-1-25 14:36 | 只看该作者
void main()
{
    configpwm();   
    while( 1 )
    {
        head();
        delay( 300 );
        stop();
        delay( 300 );
    }
}
回复

使用道具 举报

5#
ID:97438 发表于 2018-1-25 14:37 | 只看该作者
还有。。。谁告诉你这个程序中断跳不出来。。。错误根本不在于中断是否能跳出来。
回复

使用道具 举报

6#
ID:279632 发表于 2018-1-25 15:39 | 只看该作者
首先  中断不要用延时   尽量短时间呆在中断里    你的情况应该是  你中断之后   程序延时300   但是没到300的时候就又发生了中断  中断之后再延时   这样就成死循环了
回复

使用道具 举报

7#
ID:213173 发表于 2018-1-25 18:16 | 只看该作者
你的中断周期太短,大约9us,中断服务内容又占用较多时间,留给CPU处理main函数的时间微乎其微。所以delay执行一次要比你设置的时间长出许多,你就感觉卡死在delay。另外main函数写得不规范,每循环一次就要重新初始化定时器,这样定时器中断也会工作不正常。改成这样好些:
void main()
{
        configpwm();
        while(1)
        {
                head();
                delay(300);
                stop();
        }
}
回复

使用道具 举报

8#
ID:97438 发表于 2018-1-25 19:25 来自手机 | 只看该作者
wulin 发表于 2018-1-25 18:16
你的中断周期太短,大约9us,中断服务内容又占用较多时间,留给CPU处理main函数的时间微乎其微。所以delay ...

你这个程序也不能实现。。。应该在stop后面再延时。详细看我发的。
回复

使用道具 举报

9#
ID:279566 发表于 2018-1-25 19:26 | 只看该作者
不要在终端里面给占空比,你写个while循环就可以了
回复

使用道具 举报

10#
ID:70531 发表于 2018-1-25 21:41 | 只看该作者
主函数是应该有个while(1);l另外定时器中断有什么用 赋初值时为什么要关闭定时器
回复

使用道具 举报

11#
ID:213173 发表于 2018-1-25 22:08 | 只看该作者
luoluoluo136 发表于 2018-1-25 19:25
你这个程序也不能实现。。。应该在stop后面再延时。详细看我发的。

其实这个程序根本就无法正常运行,这样改动只是给楼主解释一下程序卡在delay(300);的原因。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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