基于stc51单片机的智能垃圾桶

本文介绍了使用STM8微控制器设计的垃圾桶控制系统,包括元器件选择(如sg90舵机、震动传感器和超声波模块)、功能需求(如自动开盖、震动感应)、程序设计(定时器、中断处理)和模块化结构。项目旨在锻炼初学者的编程和调试能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、元器件的需求

 小型垃圾桶、sg90舵机、震动传感器、超声波模块、蜂鸣器。

二、项目功能需求

1、利用超声波进行测距,当检测靠近时,让舵机转90度来控制垃圾桶盖的打开并伴随滴一声。

2、发生震动时,同样让舵机转90度来控制垃圾桶盖的打开并伴随滴一声。

3、按下按键时,同样让舵机转90度来控制垃圾桶盖的打开并伴随滴一声。

三、程序设计:

#include "reg52.h"
#include <intrins.h>

sbit led1     =P3^7;
sbit led2     =P3^6;
sbit Trig     =P1^5;
sbit Echo     =P1^6;
sbit sg90_con =P1^1;
sbit SW1      =P2^1;
sbit vibrate  =P3^2;
sbit beep     =P2^0;

int jd;
int cnt =0;
int mark_vibrate=0;
int jd_bak;

void Delay10us()		//@11.0592MHz
{
	unsigned char i;

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

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 Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

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

void Time0Init()
{
	//1.配置定时器0工作模式位16位计时
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;
	//2.给初值,定一个0.5出来
	TL0=0x33;
	TH0=0xFE;
	//3.开始计时
	TR0=1;
	TF0=0;
	//4.打开定时器0中断
	ET0=1;
	//5.打开总中断EA
	EA=1;
}
void Time1Init()
{
	
  TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;
	TH1=0;
	TL1=0;
}
//设置定时器0工作模块1,初始值设定0开始数数,不着急启动定时器
void startHC()
{
	Trig=0;
	Trig=1;
	Delay10us()	;
	Trig=0;
}
double get_distance()
{
	  double time;
		//定时器清零,以便下一次计算
		TH1=0;
		TL1=0;
	//1.Trig给Trig端口至少10us的高电平
		startHC();
		//2.echo由低电平跳转到高电平,表示开始发送波
		while(Echo==0);
		//波发出的那一下,我们开始启定时器
		TR1=1;
		while(Echo==1);
		//波回来的那一下,我们开始停止计时下
		TR1=0;
		//4.计算出中间经过多少时间。配16位TH0左移8位
		time=(TH1*256+TL1)*1.085;//单位为us
		//5.距离=340m/s(速度)*时间/2
		return (time*0.017);
}
void openstatusLight()
{
	
			led1=0;
			led2=1;
}

void closestatusLight()
{
	    led1=1;
			led2=0;
}
void initSG90_0()
{
	jd =1;      //初始角度是0度,0.5ms,溢出1就是0.5,高电平
	cnt =0;
	sg90_con =1;//一开始从高电平开始
}
	
void openDusbin()
{
	char n;
	
	//舵机开盖
	jd=3;//90度 1.5ms高电平
	if(jd_bak!=jd){
	cnt=0;
	beep=0;
	for(n=0;n<2;n++)
	Delay150ms();
	beep=1;
  Delay2000ms();
}
	jd_bak=jd;
}
void closeDusbin()
{
	jd=1;
	jd_bak=jd;
	cnt=0;
  Delay150ms();
}
void EX0_Init()
{
	//打开外部中断
  EX0=1;
	//低电平触发
	IT0=0;
}



void main()
{
	double dis;
	
	Time0Init();
	Time1Init();
	//舵机初始位置
	initSG90_0();
	EX0_Init();
	
	while(1)
	{
		//超声波测距
		dis=get_distance();
		if(dis<10||SW1==0||mark_vibrate==1)
		{
			//开盖,状态灯,led2亮
			openstatusLight();
			//舵机开盖,
			openDusbin();
			mark_vibrate=0;
		}
		else
		{
			//关盖,状态灯,led1亮
			closestatusLight();
			closeDusbin();
		}
		
	}
}

void Time0Handler() interrupt 1
{
	cnt++;//统计爆表的次数,cnt=1的时候,报表了1
	//重新给初值
	TL0=0x33;
	TH0=0xFE;
	
	//控制PWM波
	if(cnt<jd)
	{
		sg90_con=1;
	}
	else{
		sg90_con=0;
	}
	if(cnt==40)//爆表40次,经过了20ms
	{
		cnt=0;//当40次表示1s,重新让cnt从0开始,计算下一次的20ms
		sg90_con=1;
	}
}
			
void EX0_Handler() interrupt 0
{
	mark_vibrate=1;
}
四、代码分析

1、每一个模块都用函数独立起来,这样便于改错且逻辑性较强 。

2、代码用到两次中断,一个时钟中断一个外部中断,外部中断函数主要是检测震动传感器是否发生震动,时钟中断函数主要是控制PWM波。

五、总结

     这个项目比较简单,适合我们刚学习的时候进行拿来练手,在学习知识时就不会枯燥乏味,在此项目中,我们可以进行对模块的实践,把几个模块放在了一个整体的代码中,这样能够锻炼我们的代码调试能力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值