C51——添加震动开盖功能,使用外部中断优化

发布时间:2024-11-26 01:21

开启设备的自动优化功能,让系统自动优化游戏性能 #生活技巧# #数码产品使用技巧# #游戏设备优化建议#

最新推荐文章于 2024-11-21 15:53:33 发布

大旭242 于 2022-12-23 23:06:02 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

void main()

{

double dis;

Timer1Init();

Time0Init();

SG90_Init();

while(1){

dis = get_dis();

if(dis<10 || SW1 == 0||Vibrate == 0){

OpenTheLed5();

opengaizi();

}else{

CloseTheLed5();

closegaizi();

}

}

}

像这样只是简单的通过震动模块传给单片机一个让舵机转动,出来的现象使一卡一卡的,不是特别的灵敏,震动模块的反馈没有及时被捕获。

    if(dis<10 || SW1 == 0||Vibrate == 0){
        OpenTheLed5();
        opengaizi(); // 
    }else{
        CloseTheLed5();
        closegaizi();
    }

因为dis 大部分时间使大于0的,程序进行关盖的操作,并持续150ms后在进行下一步操作。

那为什么按键操作比震动模块操作的好呢?

因为按键的反馈的信号更加稳定持久。

持续的低电平更加容易钻到空子,而震动传感器发生震动的一瞬间 程序可能正在执行延迟。

因此 震动模块一但发生低电平,就触发中断,所以选用外部中断。

 

 外部中断一定要要接P3^2

要用外部中断 EX0 = 1 (打开外部中断),EA= 1 总开关也要打开

 中断的触发行为(这里我们用的使外部中断0)

 所以我们想要用外部中断

打开外部中断 

EX0 = 1;

触发中断

IT0 = 0; 

总体整合代码如下

#include "reg52.h"

sbit D5 = P3^7;

sbit D6 = P3^6;

sbit SW1 = P2^1;

sbit Trig = P1^5;

sbit Echo = P1^6;

sbit sg90_con = P1^1;

sbit Vibrate = P3^2;

int cnt;

int jd;

double time;

int mark_Vibrate = 0;

void Delay10us()

{

unsigned char i;

i = 2;

while (--i);

}

void Timer1Init()

{

TMOD &= 0x0F;

TMOD |= 0x10;

TL1 = 0;

TH1 = 0;

}

void startHC()

{

Trig = 0;

Trig = 1;

Delay10us();

Trig = 0;

}

double get_dis()

{

TL1 = 0;

TH1 = 0;

startHC();

while(Echo == 0);

TR1 = 1;

while(Echo == 1);

TR1 = 0;

time = (TH1*256 +TL1)*1.085 ;

return (0.017* time);

}

void OpenTheLed5()

{

D5 = 0;

D6 = 1;

}

void CloseTheLed5()

{

D5 = 1;

D6 = 0;

}

void Delay150ms()

{

unsigned char i, j, k;

i = 2;

j = 13;

k = 237;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

void Time0Init()

{

TMOD &= 0xF0;

TMOD |= 0x01;

TL0 = 0x33;

TH0 = 0xFE;

TR0 = 1;

TF0 =0;

ET0 = 1;

EA = 1;

}

void Delay2000ms()

{

unsigned char i, j, k;

i = 15;

j = 2;

k = 235;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

void opengaizi()

{

jd = 3;

cnt = 0;

Delay2000ms();

}

void closegaizi()

{

jd = 1;

cnt = 0;

Delay150ms();

}

void SG90_Init()

{

jd = 1;

cnt = 0;

sg90_con = 1;

}

void EX0_Init()

{

EX0 = 1;

EA = 1;

IT0 = 0;

}

void main()

{

double dis;

Timer1Init();

Time0Init();

EX0_Init();

SG90_Init();

while(1){

dis = get_dis();

if(dis<10 || SW1 == 0||mark_Vibrate==1){

OpenTheLed5();

opengaizi();

mark_Vibrate=0;

}else{

CloseTheLed5();

closegaizi();

}

}

}

void Time0ZD() interrupt 1

{

cnt++;

TL0 = 0x33;

TH0 = 0xFE;

if(cnt<jd){

sg90_con = 1;

}else{

sg90_con = 0;

}

if(cnt == 40){

cnt = 0;

sg90_con = 1;

}

}

void EX0_ZD() interrupt 0

{

mark_Vibrate =1;

}

网址:C51——添加震动开盖功能,使用外部中断优化 https://www.yuejiaxmz.com/news/view/274245

相关内容

如何开启iPhone地震预警功能
不懂千万别乱加!燃油添加剂使用指南
常见食品添加剂超量使用及危害
【优质多功能锅盖架】优质多功能锅盖架价格
食品添加剂的使用原则
食品添加剂到底能不能吃?用科学的打开方式认识它
苹果手机静音状态下如何设置震动提醒,让你不断线
常用家电安全使用年限大公开,判断电器是否老化看这些【家电攻略】
如何使用自动化工具编写测试用例?
5G网络深度覆盖提升感知优化案例

随便看看