標(biāo)題:
單片機(jī)智能垃圾桶的實(shí)現(xiàn)方案程序(人體感應(yīng)+金屬探測(cè)模塊實(shí)現(xiàn))
[打印本頁]
作者:
低調(diào)的黑馬
時(shí)間:
2019-5-5 13:32
標(biāo)題:
單片機(jī)智能垃圾桶的實(shí)現(xiàn)方案程序(人體感應(yīng)+金屬探測(cè)模塊實(shí)現(xiàn))
使用到的模塊有9g舵機(jī),步進(jìn)電機(jī)人體感應(yīng)模塊,金屬探測(cè)模塊,LCD1602顯示屏,原理圖如下:
}]H6`Q)]`7PDP8MI`Q4{Y5X.png
(99.67 KB, 下載次數(shù): 64)
下載附件
2019-5-5 13:29 上傳
單片機(jī)源程序如下:
#include "main.h"
#include "HX711.h"
#include "uart.h"
#include "LCD1602.h"
#include "temp.h"
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char u8;
typedef unsigned short int u16;
unsigned long HX711_Buffer = 0;
unsigned long Weight_Maopi = 0;
long Weight_Shiwu = 0;
unsigned long Weight_Maopi1 = 0;
long Weight_Shiwu1 = 0;
long Weight_Shiwu3 = 000;
long Weight_Shiwu4 = 10;
unsigned char flag = 0;
bit Flag_ERROR = 0;
bit Flag_send = 0;
sbit People= P3^6;
sbit JINSHU= P3^2;
unsigned char a;
char qingpin=0;
char shuju[]="0123456789";
int TEMP=0;
//校準(zhǔn)參數(shù)
//因?yàn)椴煌膫鞲衅魈匦郧不是很一致,因此,每一個(gè)傳感器需要矯正這里這個(gè)參數(shù)才能使測(cè)量值很準(zhǔn)確。
//當(dāng)發(fā)現(xiàn)測(cè)試出來的重量偏大時(shí),增加該數(shù)值。
//如果測(cè)試出來的重量偏小時(shí),減小改數(shù)值。
//該值可以為小數(shù)
#define GapValue 390
void Get_Maopi1();
void Get_Weight1();
char Key_Scan(char mode);
void TaoCan(void);
int LcdDisplay(int temp); //lcd顯示
void BuJing_Crole1(u16 j,u16 time);
void BuJing_Crole2(u16 j,u16 time);
//****************************************************
//主函數(shù)
//****************************************************
sbit CTRL = P3^7; //舵機(jī)控制端口
void delay_100ms(u16 x);
u16 TIME = 20000; //PWM周期時(shí)間(單位us)
u16 Min = 800; //高電平最小持續(xù)時(shí)間
u16 Max = 2200; //高電平最大持續(xù)時(shí)間
u16 aTime = 800; //高電平持續(xù)時(shí)間
u8 Degree = 200; //單位時(shí)間寬度
u8 R_TH0 = 0, R_TL0 = 0; //定時(shí)器0計(jì)數(shù)重載值
void main()
{
char flage=0;
CTRL = 0;
R_TL0 = 65536 - TIME;
R_TH0 = (65536 - TIME) >> 8;
//設(shè)置定時(shí)器0
TMOD = 0x01; //16位計(jì)數(shù)
TL0 = R_TL0;
TH0 = R_TH0;
ET0 = 1; //定時(shí)器0中斷開關(guān)打開
TR0 = 1; //定時(shí)器0計(jì)數(shù)開始
//設(shè)置定時(shí)器1
TMOD |= 0x10; //16位計(jì)數(shù)
TL1 = 65536 - aTime;
TH1 = (65536 - aTime) >> 8;
ET1 = 1; //定時(shí)器1中斷開關(guān)打開
TR1 = 0; //定時(shí)器1計(jì)數(shù)停止
EA = 1;
//中斷總開關(guān)打開
Init_LCD1602();//屏幕初始化
aTime=2300;//關(guān)垃圾桶蓋
Delay_ms(1000); //延時(shí),等待傳感器穩(wěn)定
Get_Maopi1(); //稱毛皮重量,誤差校驗(yàn)
while(1)
{
if(People==1&&flage==0)
{
flage=1;
aTime=1400;//開蓋
LCD1602_write_com(0x80);
LCD1602_write_word("People:Y");
BuJing_Crole1(2000,3);
Delay_ms(1500);
while(1)
{
while(1)
{
if(JINSHU==1)
{
LCD1602_write_word("JS:Y");
Delay_ms(1500);
LCD1602_write_com(0x89);
BuJing_Crole2(260,3);
}
else{
LCD1602_write_word("JS:N");
Delay_ms(1500);
LCD1602_write_com(0x89);
BuJing_Crole2(26
0,3);
}
while(1)
{
LCD1602_write_com(0x80+0x40);//1602位置命令
Get_Weight1(); //稱重
LCD1602_write_word("W:");
LCD1602_write_data(Weight_Shiwu1/1000 + 0X30);
LCD1602_write_data(Weight_Shiwu1%1000/100 + 0X30);
LCD1602_write_data(Weight_Shiwu1%100/10 + 0X30);
LCD1602_write_data(Weight_Shiwu1%10 + 0X30);
LCD1602_write_word("g");
Delay_ms(1000);
if(Weight_Shiwu1>=10)
{
LCD1602_write_com(0x01);
aTime=2300;//關(guān)垃圾桶蓋
break;
}
}
break;
}
break;
}
}else{
flage=0;
LCD1602_write_com(0x80);
aTime=2300;//關(guān)垃圾桶蓋
LCD1602_write_word("People:W");
}
}
}
//****************************************************
//稱重
//****************************************************
void Get_Weight()
{
Weight_Shiwu = HX711_Read();//讀取HX711AD采集值
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //獲取凈重
if(Weight_Shiwu > 0) //判斷采集值正負(fù)
{
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue); //計(jì)算實(shí)物的實(shí)際重量
}
else
{
Weight_Shiwu = 0;//
}
}
void Get_Weight1()
{
Weight_Shiwu1 = HX711_Read1();
Weight_Shiwu1 = Weight_Shiwu1 - Weight_Maopi1; //獲取凈重
if(Weight_Shiwu1 > 0)
{
Weight_Shiwu1 = (unsigned int)((float)Weight_Shiwu1/GapValue); //計(jì)算實(shí)物的實(shí)際重量
}
else
{
Weight_Shiwu1 = 0;
}
}
//****************************************************
//獲取毛皮重量
//****************************************************
void Get_Maopi()
{
Weight_Maopi = HX711_Read();
}
void Get_Maopi1()
{
Weight_Maopi1 = HX711_Read1();
}
//****************************************************
//MS延時(shí)函數(shù)(12M晶振下測(cè)試)
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
int LcdDisplay(int temp) //lcd顯示
{
unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
{
LCD1602_write_com(0x80); //寫地址 80表示初始地址
LCD1602_write_data('-'); //顯示負(fù)
//因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算由?.5,還是在小數(shù)點(diǎn)后面。
}
else
{
LCD1602_write_com(0x80); //寫地址 80表示初始地址
LCD1602_write_data('+'); //顯示正
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算加上0.5,還是在小數(shù)點(diǎn)后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LCD1602_write_com(0x82); //寫地址 80表示初始地址
LCD1602_write_data(datas[0]+0x30); //百位
LCD1602_write_com(0x83); //寫地址 80表示初始地址
LCD1602_write_data(datas[1]+0x30); //十位
LCD1602_write_com(0x84); //寫地址 80表示初始地址
LCD1602_write_data(datas[2]+0x30); //個(gè)位
LCD1602_write_com(0x85); //寫地址 80表示初始地址
LCD1602_write_data('.'); //顯示 ‘.’
LCD1602_write_com(0x86); //寫地址 80表示初始地址
LCD1602_write_data(datas[3]+0x30); //顯示小數(shù)點(diǎn)
LCD1602_write_com(0x87); //寫地址 80表示初始地址
LCD1602_write_data(datas[4]+0x30); //顯示小數(shù)點(diǎn)
temp=datas[1]*10+datas[2];
return temp;
}
void timer0() interrupt 1 using 1
{
TL0 = R_TL0;
TH0 = R_TH0;
TL1 = 65536 - aTime;
TH1 = (65536 - aTime) >> 8;
TR1 = 1;
CTRL = 1;
}
//定時(shí)器1中斷函數(shù)
void timer1() interrupt 3 using 1
{
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有參考資料51hei提供下載:
智能垃圾桶.7z
(1.94 MB, 下載次數(shù): 156)
2019-5-5 17:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
194940051
時(shí)間:
2020-4-5 14:36
寫的真的很好,我在其中學(xué)習(xí)到了很多知識(shí)
作者:
chinayanhui
時(shí)間:
2020-4-14 11:17
樓主的人體感應(yīng)模塊用的是哪一家的?
作者:
yinke-21
時(shí)間:
2020-5-28 21:49
樓主你好 人體感應(yīng)使用紅外?還是超聲波?
作者:
anjilong
時(shí)間:
2020-11-24 11:11
設(shè)計(jì)真的不錯(cuò),求proteus仿真圖
作者:
127095053
時(shí)間:
2021-4-27 12:42
這個(gè)設(shè)計(jì)很棒我覺得很有市場(chǎng)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1