欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4986|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)按鍵控制led流水燈閃程序錯(cuò)誤解決

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:939271 發(fā)表于 2021-6-17 12:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
求大佬看看這個(gè)程序的錯(cuò)誤
我想設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn),一個(gè)按鍵控制led流水燈閃,一個(gè)按鍵控制滅。但現(xiàn)在按鍵卻沒有反應(yīng),求大佬看看哪里出了問題
單片機(jī)源程序如下:
#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>                //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

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

/*
函 數(shù) 名       : main
函數(shù)功能           : 主函數(shù)
*/

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

  

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

使用道具 舉報(bào)

25#
ID:939710 發(fā)表于 2021-6-20 12:02 | 只看該作者
你最后檢測(cè)松開的代碼應(yīng)該放在第二次檢測(cè)按下的括號(hào)里,因?yàn)槟闶羌恿讼堆訒r(shí)的,如果是抖動(dòng)帶來的低電平,延時(shí)之后進(jìn)入了高電平,這樣你的程序就卡在了檢測(cè)是否松開,  雖然你把延時(shí)消了能解決這個(gè)問題。但是消抖的功能也就沒了
回復(fù)

使用道具 舉報(bào)

24#
ID:824490 發(fā)表于 2021-6-18 16:44 | 只看該作者
沒有去抖,可能邊上一個(gè)小車啟動(dòng)一下、大功率電器一個(gè)開關(guān)、、、你需要的狀態(tài)就不復(fù)存在 了。。。
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

跳變次數(shù)再多也是 a=1,會(huì)出問題嗎?
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

還是按鍵響應(yīng)不及時(shí)問題。
回復(fù)

使用道具 舉報(bào)

18#
ID:94031 發(fā)表于 2021-6-17 19:41 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2021-6-17 18:00
按鍵沒延時(shí),如何去抖動(dòng)?

在這個(gè)程序里不去抖動(dòng)會(huì)出什么問題,不要太教條。
回復(fù)

使用道具 舉報(bào)

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

為了按鍵的及時(shí)性沒有延時(shí)也是可以的,不要太教條,不要延時(shí)會(huì)產(chǎn)生什么問題?
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

請(qǐng)問一下,我現(xiàn)在按樓下修改的添加了全局變量,k1點(diǎn)亮沒問題,但k2必須長(zhǎng)按才能熄滅是什么原因啊?
回復(fù)

使用道具 舉報(bào)

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

好的,我主要是為了做作業(yè),以后有機(jī)會(huì)會(huì)加深了解的
回復(fù)

使用道具 舉報(bào)

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

我已經(jīng)知道錯(cuò)誤了,感謝
回復(fù)

使用道具 舉報(bào)

12#
ID:824490 發(fā)表于 2021-6-17 18:00 | 只看該作者
按鍵沒延時(shí),如何去抖動(dòng)?
回復(fù)

使用道具 舉報(bào)

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

越改越錯(cuò)啦!按鍵檢測(cè)里,必要的延遲還是需要的。
回復(fù)

使用道具 舉報(bào)

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

在你程序基礎(chǔ)上改了,你試一下。
//k1按下燈循環(huán),k2按下停

#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>                //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

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

u8 a;

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

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

}

/*
函 數(shù) 名       : main
函數(shù)功能           : 主函數(shù)
*/
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;)//將數(shù)字左移一位,led燈右移         
                        {
                                //keypros();
                                led=_crol_(led,1);
                                P2=led;
                                delay(20000); //
        ii++;                               
                        }
                        keypros();      
         
                }      
    led=0xff;    //
                P2=led;
   }
       
         
}
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

8#
ID:298123 發(fā)表于 2021-6-17 16:07 | 只看該作者
任重而道遠(yuǎn)!還是希望打好基礎(chǔ),做應(yīng)用能做和做好,還是差別很大的!
回復(fù)

使用道具 舉報(bào)

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

按鍵檢測(cè)也許是有問題,但也不至于不能用,對(duì)初學(xué)者,這樣的做法也能理解。問題的關(guān)鍵在于你全局變量和局部變量沒有搞清楚,還有函數(shù)返回值也沒有概念。
回復(fù)

使用道具 舉報(bào)

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

以上。
回復(fù)

使用道具 舉報(bào)

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

那怎么解決啊?求教
回復(fù)

使用道具 舉報(bào)

地板
ID:94031 發(fā)表于 2021-6-17 14:51 | 只看該作者
按鍵狀態(tài)不能被及時(shí)檢測(cè)造成,最好按鍵狀態(tài)由外部中斷及時(shí)檢測(cè)。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

沙發(fā)
ID:453974 發(fā)表于 2021-6-17 14:32 | 只看該作者
感覺應(yīng)該是按鍵的延時(shí)時(shí)間太長(zhǎng)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表