81051006 发表于 2022-7-27 08:30

51单片机,如何并行运行

最近在学习单片机,关于两组流水灯同时运行的问题,一直不能解决。
按下按键1,第一组流水线灯一直运行不停
按下按键2,第二组流水线灯一直运行不停
(按键2是外部中断)
现在使用了1个外部中断,按下按键2的时候,打开中断,就运行第二组流水灯了。第一组暂停了。
不能达到并行运行的效果。

run2u 发表于 2022-7-27 16:33

再检查一下程序 或许没设置好死循环?

SLCoCo 发表于 2022-7-27 20:09

关键部分发出来看看?

81051006 发表于 2022-7-29 08:41

SLCoCo 发表于 2022-7-27 20:09
关键部分发出来看看?

#include<reg51.h>

#define uchar unsigned char
sbit P30 =P3^0;
sbit P00 =P0^0;

//#define u8 unsigned char
//#define u16 unsigned int
typedef        unsigned char u8;
typedef unsigned int u16;
sbit key_s2 = P3^0;
sbit flag = P3^7;
                                                                       
//延时函数
void delay_ms(u16 x)
{
        u16 i,j;
for(i=0;i<x;i++)
    for(j=0;j<115;j++);
}


void int1Init()
{
        EA = 1;        //开总中断
        EX1 = 1;//开外部中断1
        EX0 = 1;
        IT1 = 1;//外部中断1下降沿触发
        IT0 = 1;
}
u16 i,j;
void main()
{
       
        int1Init();
        while(1)
        {

                if(key_s2 == 0)
                {
                        delay_ms(20);
                        if(key_s2 == 0)
                        {
                                flag = 1;
                                flag = 0;
                                while(!key_s2);
                        }       
                }

        }       
}
//外部中断1中断服务程序
void int1() interrupt 2
{
        for(i=0;i<20;i++)
                {
                       
                        P1 =~P1;
                        delay_ms(100);
                       
                }
}

void int0() interrupt 0
{
        for(i=0;i<20;i++)
                {
                       
                        P30 =~P30;
                        delay_ms(100);
                       
                }
}

81051006 发表于 2022-7-29 08:42

run2u 发表于 2022-7-27 16:33
再检查一下程序 或许没设置好死循环?

#include<reg51.h>

#define uchar unsigned char
sbit P30 =P3^0;
sbit P00 =P0^0;

//#define u8 unsigned char
//#define u16 unsigned int
typedef        unsigned char u8;
typedef unsigned int u16;
sbit key_s2 = P3^0;
sbit flag = P3^7;
                                                                       
//延时函数
void delay_ms(u16 x)
{
        u16 i,j;
for(i=0;i<x;i++)
    for(j=0;j<115;j++);
}


void int1Init()
{
        EA = 1;        //开总中断
        EX1 = 1;//开外部中断1
        EX0 = 1;
        IT1 = 1;//外部中断1下降沿触发
        IT0 = 1;
}
u16 i,j;
void main()
{
       
        int1Init();
        while(1)
        {

                if(key_s2 == 0)
                {
                        delay_ms(20);
                        if(key_s2 == 0)
                        {
                                flag = 1;
                                flag = 0;
                                while(!key_s2);
                        }       
                }

        }       
}
//外部中断1中断服务程序
void int1() interrupt 2
{
        for(i=0;i<20;i++)
                {
                       
                        P1 =~P1;
                        delay_ms(100);
                       
                }
}

void int0() interrupt 0
{
        for(i=0;i<20;i++)
                {
                       
                        P30 =~P30;
                        delay_ms(100);
                       
                }
}

81051006 发表于 2022-7-29 08:43

SLCoCo 发表于 2022-7-27 20:09
关键部分发出来看看?

就比如看,电视一样,
在播放中央一套的时候,可以去调整音量,这样就是属于并行运行。
互不干涉。

contest 发表于 2022-7-29 14:08

你的思路在我看来错了一点,外部中断程序触发后,执行完外部中断程序之后,才会回到原先执行的程序。
这样的一个逻辑,就会使你理解的并行不会真实发生,这样也就意味着如果想要完成你并行的想法,就需要你写的外部中断程序中继续执行1组流水灯的功能程序,用到寄存器并读取中断触发时的状态值,继续执行1组流水灯对应的程序,并完成2组流水灯对应的程序。
希望对你有帮助!

81051006 发表于 2022-7-30 09:51

contest 发表于 2022-7-29 14:08
你的思路在我看来错了一点,外部中断程序触发后,执行完外部中断程序之后,才会回到原先执行的程序。
这样 ...

是的,中断运行的同时,继续运行第1组的流水灯程序。
使用74HC595吗?

contest 发表于 2022-7-30 14:51

81051006 发表于 2022-7-30 09:51
是的,中断运行的同时,继续运行第1组的流水灯程序。
使用74HC595吗?

如果想在单独使用芯片保存状态也是可以,这个思路没有错误。在我看来,更加简单的方法,也可以使用51单片机自身的存储计算能力来完成,再通过程序将中断时的状态继承下来,继续执行程序。

run2u 发表于 2022-7-31 17:20

我看见你的引脚3.0重新定义了两次... 运行第一组流水灯亮灭是哪个引脚 对应程序哪个部分呢 引脚3.7是什么功能呢
页: [1] 2 3
查看完整版本: 51单片机,如何并行运行