中断时部分子程序不执行是为什么?

2020-01-17 19:11发布

程序的问题是当漫反射接收到信号,向单片机P3^2脚发出低电平时,86步进电机没有按照程序转动,有大神能告诉我是为什么?
源程序奉上
#include <reg52.h>
#include <intrins.h>   

#define uch unsigned char
#define uint unsigned int

sbit get = P3^2;//转盘得物信号
sbit ULR = P0^1;//脉冲脚
sbit DIR = P0^2;//方向脚
sbit OE = P0^3;//74LS573 锁存器芯片输出使能

int volue = 0;//转动标志位
char t; //86电机循环用变量

uch idata buf[8];  //接收字符串用的数组

//**********************正向旋转相序表*****************************
unsigned char code FFW[9]=
{0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09,0X00};  
//28 BYJ-48 小电机正转相序表
// 上履带电机
unsigned char code FFW1[9]=
{0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90,0X00};
//下履带电机
//**********************履带步进电机正转******************************

void receive (uch idata * d) //串口接收数据子程序
{
        int i; // 循环用的局部变量
        while(RI == 0);
        //用while语句确定已经接收完一组数据
        for(i=0; i<10; i++)
        {
                d[i] = SBUF; //把数据缓冲器的值写到定义的数组里
        }
        if(d[0] == 1)
        {
                volue = 1;         //转盘用的86电机,转动角度标志//45°
        }
        if(d[0] == 2)
        {
                volue = 2;         //同上 //0°
        }
        RI = 0;        //软件复位,为下次串口接收做准备
}

void delay(void)   //软件生成误差 0us          //控制上履带电机频率
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=2;b>0;b--)
            for(a=197;a>0;a--);
}

void mdelay(void)                //86电机的脉冲频率 //软件计算误差0us;
{
        unsigned char a,b;
          for(b=185;b>0;b--)
      for(a=12;a>0;a--);
}

void motor_ffw(unsigned int n)         //上履带电机正向转动程序
{
   uch i;          //循环用局部变量
   uint j;          //循环用局部变量
   for (j=0; j<8*64*n; j++)          //电机减速比1/64,消除转速比,8脉冲一圈,n为圈数
    {
      for (i=0; i<8; i++)
        {
                P1 = FFW[i];                //P1口高8位控制上履带电机正转
                 delay();
        }
    }
}

void  motor_ffw1(unsigned int n)  //上履带电机正向转动程序
{
   uch i;
   uint j;
   for (j=0; j<8*64*n; j++)
    {
      for (i=0; i<8; i++)
        {
                  P1 = FFW1[i];                  //P1口高8位控制下履带电机正转
                 delay();
        }
    }
}

void go()
{
        motor_ffw(20);                //上履带20圈
}

void go1()        //由于期间会被中断打断并重新触发所以基本可以无视圈数
{
        motor_ffw1(20);                //下履带20圈
}

void init()          //初始化
{         
        OE = 1; //高阻态       
        ULR = 1; //86电机脉冲初始化
        EX0=1;//允许外部中断0       
        IT0=1; //有信号时保持中断,信号撤除中断停止
        SCON = 0X50;  //  0工作方式2,允许接收
        TMOD = 0X20; //          定时器模式,T0,工作方式2       
        PCON = 0X80;  //  波特率翻倍
        TH1 = 0XF3;         //          定时器赋初值
        TH0 = 0XF3;        //          定时器赋初值
        ES = 1;         //          串口中断开启
        EA = 1;         //         总中断开启
        TR1 = 1; //         开启定时器中断
}

void move()        //86电机转动45度程序
{
        for(t=0; t<25; t++)
        {
                ULR = 1;
                mdelay();
                ULR = 0;
                mdelay();
        }
}

//*************************主程序*********************************
void main()
{  
        init();
        go();
}

void wvolue() interrupt 4 // 串口中断  即扫描枪扫描并确定角度程序
{
        receive(buf);
}

void turn() interrupt 0          //转盘转动并送物中断程序
{
        switch(volue)
        {
                case 1:
                {
                  OE = 0;//锁存器输出使能       
              DIR = 1;
                  move();
                  go1();
                  DIR = 0;
                  move();
                  volue = 0;
                  break;
                }
                case 2:
                {
                        OE = 0;//锁存器输出使能       
                        go1();
                        volue = 0;               
                        break;
                }
                default:
                {
                        OE = 0;//锁存器输出使能       
                        DIR = 0;
                        move();
                        go1();
                        DIR = 1;
                        move();
                        volue = 0;       
                        break;
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
浮生莫若闲
1楼-- · 2020-01-18 15:08
int volue = 0;//转动标志位,改成 volatile int volue = 0;//转动标志位 然后再试试
柯铭凯
2楼-- · 2020-01-18 16:40
浮生莫若闲 发表于 2016-4-14 09:32
int volue = 0;//转动标志位,改成 volatile int volue = 0;//转动标志位 然后再试试

谢谢前辈,我这就去试,这样改的意义是?
柯铭凯
3楼-- · 2020-01-18 21:56
 精彩回答 2  元偷偷看……
kebaojun305
4楼-- · 2020-01-19 03:23
#define uch unsigned char
#define uint unsigned int


这种写法,在某些情况下会出问题的,怎么不用typedef
kebaojun305
5楼-- · 2020-01-19 08:00
柯铭凯 发表于 2016-4-14 09:47
谢谢前辈,我这就去试,这样改的意义是?

你好好理解下 volatile  这个关键字的含义。 网上很容易搜到的。
kebaojun305
6楼-- · 2020-01-19 11:42
柯铭凯 发表于 2016-4-14 09:48
但是前辈,编译的时候没有提示有错误啊,连漏洞也不提示,菜鸟说的不对您耐心点哈 ...

提示错误是 语法错误,和程序逻辑没有啥关系。

一周热门 更多>