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

標題: 單片機按鍵異常的不靈敏,求各位大佬指教程序 [打印本頁]

作者: 雨人1212    時間: 2022-8-30 22:49
標題: 單片機按鍵異常的不靈敏,求各位大佬指教程序
單片機主程序:
#include "reg52.h"   
#include <intrins.h>   
#include<OLED.h>
#include "key.h"
#include"delay.h"
#include"show_num.h"
#include"light.h"

#define uchar unsigned char
#define uint unsigned int

uint key_scan();
void light_time();
void Math_Distance(uint distance);

sbit echo = P2^7;           
sbit trig = P2^3;                                                                              
sbit beep = P2^4;


bit flag = 0;                   //測量成功標志位全局參定義
uint time_H,time_L;           //暫存值,只用來存儲定時器的高低八位返回數值
uint time;                           //時間
uint max=2,min=1;                //單位為米

uint cm_table1[2]={0,0};
uint cm_table2[2]={0,0};          //儲存距離參數的數組
uint maxnum[2]={0,0};
uint minnum[2]={0,0};

void main()
{
        uint distance = 0;        //參數:距離
        uint save = 0;                //參數:(上一次的)距離保存。用于修正錯誤值
        uint i = 5;

        beep=0;                                //蜂鳴器上電后不響
        delay(1000);  
        OLED_Init();             // OLED初始化
        OLED_Fill(0x00);   
        trig = 0;                   //先關觸發信號               //指示燈

        while(1)
        {
     TMOD = 0x10;           //開定時器1-> 0001_0000  16位工作方式
         TH1 = 0;                   //定時器高八位初填裝值清空
         TL1 = 0;                    //定時器低八位初填裝值清空
         
         TF1=0;                           //T1溢出中斷標志位。可自動由硬件至高/清零
         ET1 = 0;                   //T1中斷使能
         EA = 1;                   //開總中斷

         flag = 0;                   //標志位清0
         trig = 1;                   //給觸發信號
         delay_20us();           //等那么一小段時間
         trig = 0;                   //關觸發信號  ————這樣就給了一小段高電平觸發信號,以至于不會一直觸發

         while(!echo);           //等待接收端出現高電平(如果是低,那就一直等)
         TR1 = 1;                   //T1運行控制位,開始計時
         while(echo);           //等待高電平結束(如果是高,那就一直等)
         TR1 = 0;                   //關定時器T1
         
         time_H = TH1;           //把T1的高低八位定時數據取出
         time_L = TL1;           //        ↑
         
          if(flag == 0)                //如果測距成功
        {
          time=time_H*256+time_L;        //將定時器的高低八位返回值賦給時間參數time
          distance = time*0.173;        //來回1/2*時間time*聲速346(m/s)*0.001(單位換算:mm)
          save = distance;                        //暫存正確的距離值
          if(distance > max*1000)
          {                  
                beep = 1;
          }
          if(distance <= max*1000 && distance >= min*1000)
          {
                  beep = 0;
                light_time();
          }
          if(distance < min*1000)
          {
                beep = 1;
                delay(50000);
                beep=0;
          }                                
      Math_Distance(distance);        
        }

          else if(flag == 1)        
        {
          distance =  save;                                
        }
        switch(key_scan())
        {
                case 0:
                        break;
                case 1:
                        if(max == 10)
                        {
                                max = 10;
                        }
                        else
                        {
                                max++;
                        }
                        break;
                case 2:
                        if(max == 0)
                        {
                                max = 0;
                        }
                        else
                        {
                                max--;
                        }
                        break;        
                case 3:
                        if(min == 10)
                        {
                                min = 10;
                        }
                        else
                        {
                                min++;
                        }
                        break;
                case 4:
                        if(min == 0)
                        {
                                min = 0;
                        }
                        else
                        {
                                min--;
                        }
                        break;               
                default:
                        break;
        }
         
         OLED_P6x8Str(0,1,"maximums:");
         Show_Number(8,2,maxnum,2);
         OLED_P8x16Str(26,2,"m");
         OLED_P6x8Str(74,1,"minimums:");
         Show_Number(82,2,minnum,2);
         OLED_P8x16Str(100,2,"m");
     OLED_P8x16Str(28,4,"distance:");  
         OLED_P8x16Str(78,6,"dm");                  
         Show_Number(32,6,cm_table1,2);
         OLED_P6x8Str(50,7,".");
         Show_Number(58,6,cm_table2,2);   
         delay(5000);                          

        }
}

/*******************************************************************************
* 函 數 名       : Math_Distance
*******************************************************************************/
void Math_Distance(uint distance)           //距離值數學轉換
{
  cm_table1[0]=distance/1000;           
  cm_table1[1]=distance/100;                 
  cm_table2[0]=distance%100/10;           
  cm_table2[1]=distance%100%10;           
  maxnum[0]=max/10;
  maxnum[1]=max%10;
  minnum[0]=min/10;
  minnum[1]=min%10;        
}

按鍵檢測:
#include"key.h"

#define uchar unsigned char
#define uint unsigned int

sbit A4 = P2^0;
sbit A5 = P3^3;
sbit A6 = P2^1;
sbit A7 = P2^2;

/**********************************
* 函數名:  鍵值函數
**************************************/
uint key_scan()
{
        uint keynum = 0;
        if(A4 == 0)
        {
                keynum = 1;
        }
        if(A5 == 0)
        {
                keynum = 2;
        }
        if(A6 == 0)
        {
                keynum = 3;
        }
        if(A7 == 0)
        {
                keynum = 4;
        }

        return keynum;

}

作者: yzwzfyz    時間: 2022-8-31 08:28
靈敏:是指在短時間內能響應你的事件。
這里理解為,你按下了鍵,CPU在短時間就發現了,且響應了一下。
為何不靈敏了呢?因為在這段時間時,CPU【干私活】不理采你的按鍵了。
查一查,有沒有CPU耗時長的程序部分。要想鍵靈敏,必須保CPU在短時間內能掃鍵一下。
作者: lkc8210    時間: 2022-8-31 09:00
不要用delay
OLED顯示常量只須在初始化時更新一次,如OLED_P6x8Str(0,1,"maximums:");
OLED顯示變量可以定時更新或變量有變化時更新
作者: xxxevery    時間: 2022-9-1 00:09
如果main函數里干的事情太多,就會影響到一些要求實時響應的工作,最好就把按鍵檢測放到定時中斷函數里去,可以設定個10ms中斷檢測一次按鍵情況,就不會有按鍵不靈敏的感覺了
作者: wufa1986    時間: 2022-9-1 08:07
使用非阻塞編程,或者直接上系統多個while
作者: starsphere    時間: 2022-9-2 23:36
掃描按鍵是否按下可以用定時器來掃描,這樣可以避免在執行其他耗時操作時,無法掃描按鍵




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1