吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1282|回复: 20
收起左侧

[求助] 51单片机,如何并行运行

[复制链接]
81051006 发表于 2022-7-27 08:30
25吾爱币
最近在学习单片机,关于两组流水灯同时运行的问题,一直不能解决。
按下按键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是什么功能呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-16 00:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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