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

news2024/11/19 5:46:24
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()		//@11.0592MHz
{
	unsigned char i;

	i = 2;
	while (--i);
}


void Timer1Init()		//100??@11.0592MHz
{
	
	TMOD &= 0x0F;		//ÉèÖö¨Ê±Æ÷ģʽ
	TMOD |= 0x10;		//ÉèÖö¨Ê±Æ÷ģʽ
	TL1 = 0;		//ÉèÖóõÖµ
	TH1 = 0;		//ÉèÖóõÖµ
}

void startHC()
{
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;
}
double get_dis()
{
	TL1 = 0;		//ÉèÖóõÖµ
	TH1 = 0;		//ÉèÖóõÖµ
 //1.¸øTrig ¶Ë¿ÚÖÁÉÙ10us µÄ¸ßµçƽ
	startHC();
	//2.EchoÐźţ¬Óɵ͵çƽ±äΪ¸ßµçƽ¿ªÊ¼Ê±·¢ÐźÅ
	while(Echo == 0);
	  TR1 = 1;		//¿ªÊ¼¼Æʱ
	//3.EchoÐźţ¬Óиߵçƽ±äΪµÍµçƽ½áÊø·¢ÐźÅ
	while(Echo == 1);
	 TR1 = 0;		//½áÊø¼Æʱ
	
	//4.¼ÆËãʱ¼ä
	time = (TH1*256 +TL1)*1.085 ;
	//5.¼ÆËã¾àÀë
	return (0.017* time);
}
void OpenTheLed5()
{
		D5 = 0;
		D6 = 1;
}
void CloseTheLed5()
{
		D5 = 1;
		D6 = 0;
}

void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	//_nop_();
	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Time0Init()
{
		//ÅäÖö¨Ê±Æ÷0 ¹¤×÷ģʽΪ16λ¼Æʱ
	TMOD &= 0xF0;		//ÉèÖö¨Ê±Æ÷ģʽ
	TMOD |= 0x01;		//ÉèÖö¨Ê±Æ÷ģʽ 
	//¸ø³õÖµ£¬¶¨³öÒ»¸ö0.5msÀ´
		TL0 = 0x33;
		TH0 = 0xFE;
	//¿ªÊ¼¼Æʱ
	TR0 = 1;
	//Çå³ý±êʶλ
	TF0 =0;
	// ´ò¿ª¶¨Ê±Æ÷0 ÖжÏ
	ET0 = 1;
	//´ò¿ª×ÜÖÐ¶Ï EA
	EA = 1;
}
 void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	//_nop_();
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void opengaizi()
{
		jd = 3;  //90¡ã
		cnt = 0;
		Delay2000ms();
}
void closegaizi()
{
		jd = 1; //  0¶È
		cnt = 0;
		Delay150ms();
}
void SG90_Init()
{
	jd = 1;     // ³õʼ½Ç¶ÈÊÇ 0 ¶È£¬0.5ms£¬Òç³ö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  //±¬±íÖ®ºó£¬²»ÔÚÓÃÈí¼þÇåÁ㣬Õâ¸öÖжϽ«±êʶλTF0 
{
	cnt++;
	
	TL0 = 0x33;
	TH0 = 0xFE;
	// ¿ØÖÆPWM²¨
	if(cnt<jd){
		 sg90_con = 1;
	}else{
		sg90_con = 0;
	}
	if(cnt == 40){ // ËÄÊ®´Î±¬±í£¬¾­¹ýÁË20ms£¬Íê³ÉÁËÒ»¸öÖÜÆÚ£
		cnt = 0;
		sg90_con = 1;
	}
}
void EX0_ZD() interrupt 0
{
	mark_Vibrate =1;   // µ±´¥·¢ÖжϵÄʱºò ÈÃÕâ¸öÖÃ1£»
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lvm 制作

壹&#xff1a; 创建LVM 逻辑卷 1&#xff0c;将物理盘格式为pv卷&#xff08;物理卷&#xff09;&#xff0c;使用pvcreate 命令 pvcreate /dev/sdc 或则是 pvcreate /dev/sdc /dev/sdb pvdisplay 或pvs 命令查看 PV 物理卷得创建情况 2,创建卷组 VG 通过vgcreate 命令,将pv加…

《图解TCP/IP》阅读笔记(第六章 6.3、6.4)—— 鼎鼎大名的UDP、TCP

前言&#xff1a; 本篇将要介绍UDP和TCP&#xff0c;篇幅略长&#xff0c;主要是TCP的内容较为复杂 6.3 UDP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09; 根据此前的了解&#xff0c;UDP不提供复杂的控制机制&#xff0c;其是一种利用IP提…

JavaSE(类和对象、this用法、构造方法)

1. 面向对象 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 面向过程注重的是…

2005-2020年全国及31省绿色信贷水平原始数据及测算

2005-2020年各省绿色信贷水平原始数据及测算 1、时间&#xff1a;2005-2020年 2、来源&#xff1a;整理自统计NJ、工业NJ、2018年经济普查&#xff0c;其中2017年采用插值法填补 3、范围&#xff1a;包括全国及31省市 4、数据内容&#xff1a;包含计算过程和原始数据 5、具…

动态规划——线性dp

基于数字三角形问题扩展 参考闫氏dp分析法参考闫氏dp分析法参考闫氏dp分析法 方格取数 f[i1][j1][i2][j2]表示&#xff08;1,1&#xff09;到&#xff08;i1,j1&#xff09;和&#xff08;1,1&#xff09;到(i2,j2)和的最大值f[i1][j1][i2][j2]表示&#xff08;1,1&#xff09…

ubuntu小技巧29--frp实现通过公网访问内网服务

ubuntu小技巧29--frp实现通过公网访问内网服务1 介绍2 方法步骤3 注意事项4 说明1 介绍 很多时候我们需要在外部网络中访问局域网或者个人家庭主机&#xff0c;以便于实现一个机器在多个地方都能用&#xff0c;此时我们就可以使用 frp 或者其竞品来实现该功能。 frp 是一个专…

11Python面相对象基础语法

面相对象基础语法 01. dir 内置函数 在 Python 中 对象几乎是无所不在的&#xff0c;我们之前学习的 变量、数据、函数 都是对象 在 Python 中可以使用以下两个方法验证&#xff1a; 使用内置函数 dir 传入 标识符 / 数据&#xff0c;可以查看对象内的 所有属性及方法 提示…

基于 UWB 数字孪生钢厂人员安全定位

钢铁冶炼从原料采购、焦化烧结、炼铁、炼钢、轧钢、到产出成品&#xff0c;其冗长的生产工序、复杂的作业场景&#xff0c;更应加以重视生产现场的人员作业安全&#xff0c;将安全防范监管贯穿日常作业全过程&#xff0c;打通安全生产责任“最后一公里”。 随着近几年钢厂信息…

电源管理芯片|“小方寸”大作为—TMI3191直击智能穿戴电源痛点!

随着移动通信、人工智能等技术的不断发展和融合, 智能终端产业正在加速裂变&#xff0c;智能穿戴迅速成为人们日常生活和工作中的新宠。 根据IDC最新数据显示&#xff0c;2016年~2020年出货量从1.02亿台增长至4.45亿台&#xff0c;预测2020-2025年全球智能可穿戴设备出货量复合…

手写B+树

1.特点 https://blog.csdn.net/weixin_57128596/article/details/127030901?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167176442416800188598723%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id167176442416800…

springboot mybatis大学生校园宿舍管理系统源码含文档

摘 要&#xff1a;宿舍是大学生学习与生活的主要场所之一&#xff0c;宿舍管理是高校学工管理事务中 尤为重要的一项。随着我国高校招生规模的进一步扩大&#xff0c;学生总体人数的不断增加&#xff0c; 宿舍管理工作变得愈加沉重和琐碎&#xff0c;学生宿舍信息的采集、汇总…

Classifier Guided Diffusion

前言 上次已经学习了open AI的 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析), 以及 斯坦福的 DDIM DDIM原理及代码(Denoising diffusion implicit models). 这次来看openAI的另一个作品 Diffusion Models Beat GANs on Image Synthesis github: https://github.com…

操作系统(4)页面替换策略算法模拟实现

1. 效果展示 2. 程序流程图 &#xff08;1&#xff09; 程序总流程 &#xff08;2&#xff09; FIFO策略 &#xff08;3&#xff09; LRU策略 &#xff08;4&#xff09; OPT策略 3. 数据结构设计 //页面数据结构struct PageInfo {int id;int visit;};PageInfo* Block; // 物…

我国电力物流行业发展现存问题及解决策略分析 企业应加强信息化建设

电力物流是电力发、输、配、售流程的一部分&#xff0c;是为了满足终端用户需求&#xff0c;对电力从发电到终端用户的高效率、高效益的流动以及流程各环节相互提供的服务和相关信息在此过程中的正、反向流动所进行的计划、实施与控制过程。 根据观研报告网发布的《中国电力物流…

nginx反向代理ssl配置

nginx反向代理是各大应用环境最重要的环节&#xff0c;今天我们来说说如何配置反代理SSL这书&#xff0c;首先配置准备好&#xff1a;nginx环境、SSL证书、确定需要设置的端口防火墙开放&#xff08;尤其是云服务器需要单独设置&#xff0c;windows防火墙单独设置&#xff09;。…

电巢:上海半导体投资浪潮的前奏、高潮与转折

朱旭东是上海半导体投资界的开创性人物&#xff0c;他带领浦科投资投出了中微半导体、盛美半导体等当下的「国之重器」&#xff0c;并控股了万业企业、上工申贝等A股上市公司。随后又在国内率先发起设立并管理了上海半导体装备材料产业投资基金&#xff0c;推动旗下上市公司万业…

前端开发--JavaScript Bom和Dom

JavaScript Bom和Dom这一篇就够啦JavaScript Bom和Dom1、Web API 基本认知2、DOM -- 基础2.1 DOM简介2.2 获取元素2.3 事件基础2.4 操作元素2.5 节点操作2.6 DOM重点核心3、DOM -- 事件高级3.1 注册事件(绑定事件)3.2 删除事件(解绑事件)3.3 DOM事件流3.4 事件对象3.5 事件委托…

如何理解UML2.5.1(05篇)

标记subsets和redefines可以说是UML2.5.1中最重要的一对标记。标记subsets相对要好理解一些&#xff0c;但是redefines的含义就没有那么直白。先看一下目前已知的subsets和redefines的效果&#xff1a; 假定图一中A1和B1的关联两端的标记都是subsets&#xff0…

Torch计算方法

Torch 中的计算方法与 Numpy 的计算方法很类似&#xff1b;Torch中带 “下划线 ” 的操作&#xff0c;都是in-place的。 求和&#xff1a; torch.sum() 对输入的 tensor 数据的某一维度求和&#xff1b; &#xff11;&#xff0e;torch.sum(input, dtypeNone) &#xff12;&…

硬盘 / 硬盘控制器主要端口寄存器 / Controller Register

文章目录IDE 与 SATA硬盘分区表结构硬盘控制器主要端口寄存器data 寄存器Error && FeaturesErrorFeaturesSector countLBA low | mid | highdevice 寄存器StatusCommandIDE 与 SATA 很久以前&#xff0c;硬盘控制器和硬盘是分开的&#xff0c;后面开发了一个新接口&am…