久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4478|回復: 24
打印 上一主題 下一主題
收起左側

單片機按鍵控制led流水燈閃程序錯誤解決

[復制鏈接]
跳轉到指定樓層
樓主
ID:939271 發表于 2021-6-17 12:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求大佬看看這個程序的錯誤
我想設計一個程序實現,一個按鍵控制led流水燈閃,一個按鍵控制滅。但現在按鍵卻沒有反應,求大佬看看哪里出了問題
單片機源程序如下:
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
#include<intrins.h>                //因為要用到左右移函數,所以加入這個頭文件

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;

#define led P2           //將P2口定義為led 后面就可以使用led代替P2口
sbit k1=P3^1; //定義 P31 口是 k1
sbit k2=P3^0;
/*
函 數 名         : delay
函數功能                 : 延時函數,i=1時,大約延時10us
*/
void delay(u16 i)
{
        while(i--);        
}
函 數 名         : keypros
函數功能         : 按鍵處理函數,判斷按鍵 K1 是否按下
*/
void keypros()
{         u8 a=0;
     if(k1==0) //檢測按鍵 K1 是否按下
      {
        delay(1000); //消除抖動 一般大約 10ms
        if(k1==0) //再次判斷按鍵是否按下
       {
            a=1;
         
       }
        while(!k1);  //檢測按鍵是否松開               
                }
     if(k2==0) //檢測按鍵 K1 是否按下
      {
        delay(1000); //消除抖動 一般大約 10ms
        if(k2==0) //再次判斷按鍵是否按下
       {
            a=0;
         
       }
        while(!k2);  //檢測按鍵是否松開               
                }
}

/*
函 數 名       : main
函數功能           : 主函數
*/

void main()
{  u8 a;
   u8 i=0;
   
   
  while(1)
  {        
    keypros();
    if(a==1)
        {        
        led=0xfe;    //         P2  1111 1110(7654 3210)
        delay(50000); //大約延時450ms        
        
                        for(i=0;i<7;i++)         //將數字左移一位,led燈右移
                {
                        led=_crol_(led,1);
                        delay(50000); //大約延時450ms        
                }
        keypros();        
        
        }        
          else{led=0xff;
        keypros();
        }
        
   }
   

  

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:453974 發表于 2021-6-17 14:32 | 只看該作者
感覺應該是按鍵的延時時間太長了
回復

使用道具 舉報

板凳
ID:298123 發表于 2021-6-17 14:44 | 只看該作者
兩個變量a是啥意思?你想表達什么樣的邏輯?
回復

使用道具 舉報

地板
ID:94031 發表于 2021-6-17 14:51 | 只看該作者
按鍵狀態不能被及時檢測造成,最好按鍵狀態由外部中斷及時檢測。
回復

使用道具 舉報

5#
ID:939271 發表于 2021-6-17 15:27 | 只看該作者
xuyaqi 發表于 2021-6-17 14:51
按鍵狀態不能被及時檢測造成,最好按鍵狀態由外部中斷及時檢測。

那怎么解決啊?求教
回復

使用道具 舉報

6#
ID:711539 發表于 2021-6-17 15:49 | 只看該作者
這邊建議你回頭看看C語言。
  1. void keypros()函數的a,是局部變量。
  2. void main()函數的a,是局部變量。
  3. 它們是兩個變量。
  4. 解決方法:取消這兩個局部變量,開設一個新的全局變量a。
復制代碼

以上。
回復

使用道具 舉報

7#
ID:298123 發表于 2021-6-17 16:01 | 只看該作者
ncml 發表于 2021-6-17 15:27
那怎么解決啊?求教

按鍵檢測也許是有問題,但也不至于不能用,對初學者,這樣的做法也能理解。問題的關鍵在于你全局變量和局部變量沒有搞清楚,還有函數返回值也沒有概念。
回復

使用道具 舉報

8#
ID:298123 發表于 2021-6-17 16:07 | 只看該作者
任重而道遠!還是希望打好基礎,做應用能做和做好,還是差別很大的!
回復

使用道具 舉報

9#
ID:489002 發表于 2021-6-17 16:30 | 只看該作者
局部變量 函數1中的a和函數2中的a其實是兩個不同的a
回復

使用道具 舉報

10#
ID:94031 發表于 2021-6-17 16:35 | 只看該作者
ncml 發表于 2021-6-17 15:27
那怎么解決啊?求教

在你程序基礎上改了,你試一下。
//k1按下燈循環,k2按下停

#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
#include<intrins.h>                //因為要用到左右移函數,所以加入這個頭文件

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;

sbit k1=P3^1; //定義 P31 口是 k1
sbit k2=P3^0;

u8 a;

/*
函 數 名         : keypros
函數功能         : 按鍵處理函數,判斷按鍵 K1 是否按下
*/
void keypros()
{         
  if(k1==0) //檢測按鍵 K1 是否按下
        {
               
         if(k1==0) //再次判斷按鍵是否按下
         {
                                a=1;
         }
                while(!k1);  //檢測按鍵是否松開               
        }
  if(k2==0) //檢測按鍵 K1 是否按下
        {
               
                if(k2==0) //再次判斷按鍵是否按下
         {
                                a=0;
                 
         }
                while(!k2);  //檢測按鍵是否松開               
        }
}

/*
函 數 名         : delay
函數功能                 : 延時函數,i=1時,大約延時10us
*/
void delay(u16 i)
{
        u16 m;
       
  for(m=0;m<i;)//  
        {
                keypros();
                m++;
        }

}

/*
函 數 名       : main
函數功能           : 主函數
*/
void main()
{  
  u8 ii=0;
        u8 led;
       
  while(1)
  {      
    keypros();
    if(a==1)
                {      
                        led=0xfe;    //         P2  1111 1110(7654 3210)
                                         
                        for(ii=0;ii<7;)//將數字左移一位,led燈右移         
                        {
                                //keypros();
                                led=_crol_(led,1);
                                P2=led;
                                delay(20000); //
        ii++;                               
                        }
                        keypros();      
         
                }      
    led=0xff;    //
                P2=led;
   }
       
         
}
回復

使用道具 舉報

11#
ID:298123 發表于 2021-6-17 16:57 | 只看該作者
xuyaqi 發表于 2021-6-17 16:35
在你程序基礎上改了,你試一下。
//k1按下燈循環,k2按下停

越改越錯啦!按鍵檢測里,必要的延遲還是需要的。
回復

使用道具 舉報

12#
ID:824490 發表于 2021-6-17 18:00 | 只看該作者
按鍵沒延時,如何去抖動?
回復

使用道具 舉報

13#
ID:939271 發表于 2021-6-17 19:09 | 只看該作者
菜鳥yc 發表于 2021-6-17 15:49
這邊建議你回頭看看C語言。
以上。

我已經知道錯誤了,感謝
回復

使用道具 舉報

14#
ID:939271 發表于 2021-6-17 19:10 | 只看該作者
hz_dyg 發表于 2021-6-17 16:01
按鍵檢測也許是有問題,但也不至于不能用,對初學者,這樣的做法也能理解。問題的關鍵在于你全局變量和局 ...

好的,我主要是為了做作業,以后有機會會加深了解的
回復

使用道具 舉報

15#
ID:939271 發表于 2021-6-17 19:16 | 只看該作者
菜鳥yc 發表于 2021-6-17 15:49
這邊建議你回頭看看C語言。
以上。

請問一下,我現在按樓下修改的添加了全局變量,k1點亮沒問題,但k2必須長按才能熄滅是什么原因啊?
回復

使用道具 舉報

16#
ID:939271 發表于 2021-6-17 19:19 | 只看該作者
菜鳥yc 發表于 2021-6-17 15:49
這邊建議你回頭看看C語言。
以上。

不用了,我懂了,我必須在led流水燈的流程結束的一瞬間執行按鍵函數的時候按k2才能執行函數使led熄滅。
回復

使用道具 舉報

17#
ID:94031 發表于 2021-6-17 19:38 | 只看該作者
hz_dyg 發表于 2021-6-17 16:57
越改越錯啦!按鍵檢測里,必要的延遲還是需要的。

為了按鍵的及時性沒有延時也是可以的,不要太教條,不要延時會產生什么問題?
回復

使用道具 舉報

18#
ID:94031 發表于 2021-6-17 19:41 | 只看該作者
名字不是重點 發表于 2021-6-17 18:00
按鍵沒延時,如何去抖動?

在這個程序里不去抖動會出什么問題,不要太教條。
回復

使用道具 舉報

19#
ID:94031 發表于 2021-6-17 19:46 | 只看該作者
ncml 發表于 2021-6-17 19:16
請問一下,我現在按樓下修改的添加了全局變量,k1點亮沒問題,但k2必須長按才能熄滅是什么原因啊?

還是按鍵響應不及時問題。
回復

使用道具 舉報

20#
ID:298123 發表于 2021-6-18 09:19 | 只看該作者
xuyaqi 發表于 2021-6-17 19:41
在這個程序里不去抖動會出什么問題,不要太教條。

啊!? 不去抖,按鍵按下瞬間,很多次跳變,你的程序還能按邏輯運行嗎? 這不是教條不教條的問題,沒有技術能原諒,但誤人子弟不能原諒!
回復

使用道具 舉報

21#
ID:94031 發表于 2021-6-18 09:25 | 只看該作者
hz_dyg 發表于 2021-6-18 09:19
啊!? 不去抖,按鍵按下瞬間,很多次跳變,你的程序還能按邏輯運行嗎? 這不是教條不教條的問題,沒有技 ...

跳變次數再多也是 a=1,會出問題嗎?
回復

使用道具 舉報

22#
ID:934353 發表于 2021-6-18 11:04 | 只看該作者
ncml 發表于 2021-6-17 19:19
不用了,我懂了,我必須在led流水燈的流程結束的一瞬間執行按鍵函數的時候按k2才能執行函數使led熄滅。

你如果想隨時滅掉流水燈,最好設置外部中斷,這樣就可以隨時滅燈了,非常方便
回復

使用道具 舉報

23#
ID:824490 發表于 2021-6-18 16:40 | 只看該作者
xuyaqi 發表于 2021-6-17 19:41
在這個程序里不去抖動會出什么問題,不要太教條。

這不是教條不教條, 是關乎軟件代碼的強壯!不延時不怕誤觸發?不怕干擾?誰家代碼的按鍵不做去抖?
如同進餐館吃飯,有人要燙一下碗筷,而有些人覺得麻煩不燙,一樣的道理。
玩玩可以,真要做產品只能呵呵了。萬分之一的BUG機率,對客戶來說就是100%的出錯。
回復

使用道具 舉報

24#
ID:824490 發表于 2021-6-18 16:44 | 只看該作者
沒有去抖,可能邊上一個小車啟動一下、大功率電器一個開關、、、你需要的狀態就不復存在 了。。。
回復

使用道具 舉報

25#
ID:939710 發表于 2021-6-20 12:02 | 只看該作者
你最后檢測松開的代碼應該放在第二次檢測按下的括號里,因為你是加了消抖延時的,如果是抖動帶來的低電平,延時之后進入了高電平,這樣你的程序就卡在了檢測是否松開,  雖然你把延時消了能解決這個問題。但是消抖的功能也就沒了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线视频免费看 | 久久久久国产成人精品亚洲午夜 | 一区二区精品 | aacc678成免费人电影网站 | 亚洲久久 | 国产日韩欧美一区二区 | 福利片一区二区 | 国产精品亚洲一区二区三区在线 | 91视频在线| 国产男女猛烈无遮掩视频免费网站 | www国产亚洲精品久久网站 | a级黄色片视频 | 亚洲欧美日韩电影 | 亚洲综合在线播放 | 麻豆久久久9性大片 | 一呦二呦三呦国产精品 | 成人免费精品视频 | 国产欧美精品一区二区色综合朱莉 | 粉嫩一区二区三区性色av | 欧美成人一区二区三区 | 美女黄网站 | 欧美精品中文字幕久久二区 | 欧美一级片在线看 | 91av久久久 | 久久国产精品视频 | 亚洲精品小视频在线观看 | 国产一区二区小视频 | 成人免费在线播放视频 | 看a级黄色毛片 | 久久久久久免费毛片精品 | 午夜亚洲 | 国产人成精品一区二区三 | 国产精品色哟哟网站 | 青青草av在线播放 | 午夜精品一区二区三区在线观看 | 在线观看成人免费视频 | 精品欧美乱码久久久久久 | av一二三区 | 成人a网 | 国产精品污污视频 | 毛片黄|