51项目——智能垃圾桶
项目需求
人靠近,垃圾桶开盖,投放垃圾,人离开,垃圾桶自动关盖。
并屏幕显示距离,和垃圾桶开关的状态。
项目材料(实物图可以百度看一看)
垃圾桶一个
杜邦线若干
sg90舵机一个
超声波测距一个
Nokia5110LCD屏幕一个 (Nokia5110使用和实例)
stc89c51最小系统单片机一个
USB转TTL(如果单片机已经集成可以忽略)
以上材料可更具自身模块条件更换使用,并不一定全部一样,例如:超声波可以用其他感应器件,比如人体感应模块,红外模块等等,当然可以用其他51开发板,亦可添加(删改)新的器件升级美化项目。
接线
P1^0——sg90舵机信号线
P1^1——超声波Trig端
P1^2——超声波Echo端
下面Nokia5110直接引用Nokia5110文章的接线
sbit SCLK = P2^5SCLK; // pin 2 header 5
sbit SDIN = P2^4; // pin 3 header 4
sbit LCD_DC = P2^3; // pin 4 header 3
sbit LCD_CE = P2^2; // pin 5 header 2
sbit LCD_RST = P2^1; // pin 9 header 1
实战编写
下面代码,没有设计到的可以看看,这俩篇文章
舵机使用
Nokia5110使用和实例
超声波太简单了,网上找找时序图,声音的传播速度,对应我下面的超声波看应该就明白了。
部分代码(需要打包好的代码可以私我)
main.c
#include <reg51.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "nokia5110.h"
#include "ultrasonic.h"
#include "sg90.h"
#include "delay.h"
void judgment_angle(double dis)
{
static char flag = 0;
static unsigned int time;
if(dis <= 5){
flag = 1;
time = 0;
// sg90(3); //90 angle
// //DelayMS(1000);
}else{
time++;
if(time > 10){
time = 0;
flag = 0;
}
}
if(flag) sg90(3);
else sg90(1);
if(flag)LCD_write_english_string(1,4," flag = ON ");
else LCD_write_english_string(1,4," flag = OFF ");
}
int main()
{
double dis;
char buf[32];
LCD_init();
LCD_clear();
sg90Init();
InitUltrasonic();
// LCD_write_chinese_string(0,0,12,7,0,0);
// LCD_write_chinese_string(0,2,12,7,0,0);
// LCD_write_chinese_string(0,4,12,7,0,0);
LCD_write_english_string(1,0,"--ShunGe51--");
LCD_write_english_string(1,1,"************");
// LCD_write_english_string(1,2,"distance is ");
LCD_write_english_string(1,3,"************");
// LCD_write_english_string(1,4," flag = off ");
while(1)
{
dis = GetDistance(); //get ultrasonic distance
sprintf(buf,"dis= %02.2fcm ",dis);
LCD_write_english_string(1,2,buf); //wirite for nokia5110
judgment_angle(dis);
DelayMS(100);
}
}
ultrasonic.c
#include <reg51.h>
#include "ultrasonic.h"
#include <delay.h>
#include "nokia5110.h"
sbit Trig = P1^1;
sbit Echo = P1^2;
void InitUltrasonic()
{
//1. 配置定时器0工作模式位16位计时
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01;
TH0 = 0;
TL0 = 0;
}
double GetDistance()
{
double distance = 0;
double time = 0;
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
while(!Echo); //波发出的一瞬间开启定时
TR0 = 1;
while(Echo);
TR0 = 0;
time = (TH0 * 256 + TL0) * 1.085; //单位us
// 距离 = 速度 (340m/s)* 时间/2
distance = time * 0.017;
TH0 = 0;
TL0 = 0;
return distance;
}
效果
视频
上传中……
结束
有问题欢迎提出,共同进步