欧美极品高清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