找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用两个按键控制单片机流水灯的暂停和启动问题

[复制链接]
跳转到指定楼层
楼主
ID:272210 发表于 2018-9-13 14:35 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题详见程序的注释语句
单片机源程序如下:
  1. #include "reg51.h"                      /* 此文件中定义了单片机的一些特殊功能寄存器 */
  2. #include <intrins.h>
  3. typedef unsigned int        int16_t;        /* 对数据类型进行声明定义 */
  4. typedef unsigned char        int8_t;

  5. #define LED P2
  6. /**************端口定义************************************************/
  7. sbit Key_A=P3^1;           //开始
  8. sbit Key_B=P3^2;           //停止
  9. /*********变量定义******************************************/
  10. int8_t Start=0;
  11. int8_t Stop=0;

  12. void delay( int8_t );
  13. void LSD  ( )       ;
  14. void delay( int16_t i )
  15. {

  16.         while ( i-- );
  17.                
  18. }

  19. void Key_Scan(  )
  20. {

  21.            if(Key_A==0)                  //检测开始按键
  22.            delay(500);
  23.            if(Key_A==0)
  24.            {
  25.                Start++;
  26.                    while(!Key_A);
  27.            }

  28.                               if(Key_B==0)                  //检测停止按键
  29.            delay(500);
  30.            if(Key_B==0)
  31.            {
  32.                Stop++;
  33.                    while(!Key_B);
  34.            }

  35.            if(Start>1)
  36.            Start=0;
  37.            if(Stop>1)
  38.            Stop=0;               
  39. }

  40. void LSD ( )
  41. {
  42.            int8_t i=0;
  43.             int8_t LED_Last=0;

  44.             LED=0xfF;
  45.                 for(i=0;i<=7;i++)
  46.                 {
  47.                     LED=LED<<1;
  48.                 //        LED_Last=LED;

  49.                         delay(50000);
  50.                 }
  51. }

  52. void main()
  53. {
  54.         while(1)
  55.         {
  56.            Key_Scan();
  57.            if(Start)
  58.            {
  59.          while(1)
  60.          {
  61.              LSD();

  62.                   Key_Scan();
  63.                   if(Stop==1)//无法通过stop这个变量//跳出内层循环,这个是怎么回事?
  64.                   {
  65.                     Start=0;
  66. LED=0xff;
  67.                         break;
  68.                   }
  69. }
  70.       
  71.          

  72.          
  73.          }
  74.             
  75.         }
  76. }
复制代码


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

使用道具 举报

沙发
ID:164602 发表于 2018-9-14 08:59 | 只看该作者
我在板子上试验了你的程序。
第一:首次按下K1,灯只循环一次就自动停止了。
第二:是可以退出循环的——机器运行时间极短,你按下键时,跳出循环的判断语句早执行过了,当然就出不来了,我说可以出来,是一直按着键,当灯亮完最后一个后,这些语句就执行到了,就退出来了。
建议:这种需要分时控制的程序,最好用外部中断,随时都可以打断灯的开关。

在你的程序基础上,我修改了一下:
#include "reg51.h"                      /* 此文件中定义了单片机的一些特殊功能寄存器 */
#include <intrins.h>
typedef unsigned int        int16_t;        /* 对数据类型进行声明定义 */
typedef unsigned char        int8_t;

#define LED P2
/**************端口定义************************************************/
sbit Key_B=P3^3;           //外部中断1,HC6800-ES-V2.0板子是独立按键K4键
/*********变量定义******************************************/
bit Start=0;

void IntConfiguration()//外部中断设置子函数
{
        IT1=1;
        EX1=1;
        EA=1;
}

void delay( int16_t i )
{

        while ( i-- );
               
}

void LSD ( )
{
           int8_t i=0;
            int8_t LED_Last=0;

            LED=0xfF;
                for(i=0;i<=7;i++)
                {
                    LED=LED<<1;
                //        LED_Last=LED;

                        delay(50000);
                }
}

void main()
{
        IntConfiguration();
        while(1)
                {
                        while (Start)
                        {
                                LSD ( );
                        }
                        LED=0xff;
        }
}

void Int1(void) interrupt 2//外部中断1的中断服务函数
{
        delay(50000);
        Start=~Start;
        IE0=0;
}
这样,只用一个键,就可以启停灯的亮灭了。k4键按奇数次,灯就亮,按偶数次灯就灭。
回复

使用道具 举报

板凳
ID:164602 发表于 2018-9-14 09:14 | 只看该作者
如果你想在任何时候按下偶数次键,灯就立即灭,程序是这样的:
#include "reg51.h"                      /* 此文件中定义了单片机的一些特殊功能寄存器 */
#include <intrins.h>
typedef unsigned int        int16_t;        /* 对数据类型进行声明定义 */
typedef unsigned char        int8_t;

#define LED P2
/**************端口定义************************************************/
sbit Key_B=P3^3;           //停止
/*********变量定义******************************************/
bit Start=0;
int8_t i=0;

void IntConfiguration()//外部中断设置子函数
{
        IT1=1;
        EX1=1;
        EA=1;
}

void delay( int16_t i )
{

        while ( i-- );
               
}

void main()
{
        IntConfiguration();
        while(1)
                {
                        while (Start)
                        {
                                i++;
                                if (i==8)
                                {
                                        i=0;
                                        LED=0xff;
                                        delay(50000);
                                }
                                LED=LED<<1;
                                delay(50000);
                        }
        }
}

void Int1(void) interrupt 2//外部中断1的中断服务函数
{
        delay(50000);
        Start=~Start;
        LED=0xfF;
        i=0;
if (Start==1)
        {LED=LED<<1;
        delay(50000);}
        IE0=0;
}
回复

使用道具 举报

地板
ID:776802 发表于 2020-6-12 11:48 来自手机 | 只看该作者
楼主?
回复

使用道具 举报

5#
ID:877984 发表于 2021-1-15 20:32 | 只看该作者
HC6800-ES-V2.0 发表于 2018-9-14 09:14
如果你想在任何时候按下偶数次键,灯就立即灭,程序是这样的:
#include "reg51.h"                       ...

请问最后的IE0=0是什么意思
回复

使用道具 举报

6#
ID:213173 发表于 2021-1-15 22:44 | 只看该作者
用两个按键控制单片机流水灯的暂停和启动
  1. #include "reg51.h"                      /* 此文件中定义了单片机的一些特殊功能寄存器 */
  2. #include <intrins.h>
  3. typedef unsigned int        int16_t;        /* 对数据类型进行声明定义 */
  4. typedef unsigned char        int8_t;

  5. #define LED P2
  6. /**************端口定义************************************************/
  7. sbit Key_A=P3^1;           //开始
  8. sbit Key_B=P3^2;           //停止
  9. /*********变量定义******************************************/
  10. bit Start=0;
  11. bit sign=0;
  12. int16_t count,count1;

  13. void Key_Scan()
  14. {
  15.         if(Key_A==0||Key_B==0)//检测按键
  16.         {
  17.                 if(++count1>=250 && sign==0)//检测开始按键
  18.                 {
  19.                         sign=1;
  20.                         if(Key_A==0)Start=1; //开始
  21.                         if(Key_B==0)Start=0; //停止
  22.                 }        
  23.         }
  24.         else
  25.         {
  26.                 sign=0;
  27.                 count1=0;
  28.         }
  29. }

  30. void main()
  31. {
  32.         LED=0xfe;
  33.         while(1)
  34.         {
  35.                 Key_Scan();
  36.                 if(Start)
  37.                 {
  38.                         count++;
  39.                         if(count>=10000)
  40.                         {
  41.                                 count=0;
  42.                                 LED=LED<<1|0x01;
  43.                                 if(LED==0xff)
  44.                                         LED=0xfe;
  45.                         }
  46.                 }
  47.         }
  48. }
复制代码
回复

使用道具 举报

7#
ID:847443 发表于 2021-1-25 17:13 | 只看该作者
挑不出循环可以用中断,或者skip
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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