找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7883|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)智能垃圾桶的實(shí)現(xiàn)方案程序(人體感應(yīng)+金屬探測(cè)模塊實(shí)現(xiàn))

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
使用到的模塊有9g舵機(jī),步進(jìn)電機(jī)人體感應(yīng)模塊,金屬探測(cè)模塊,LCD1602顯示屏,原理圖如下:

單片機(jī)源程序如下:
  1. #include "main.h"
  2. #include "HX711.h"
  3. #include "uart.h"
  4. #include "LCD1602.h"
  5. #include "temp.h"
  6. #define   uchar unsigned char
  7. #define   uint unsigned int
  8. typedef unsigned char u8;
  9. typedef unsigned short int u16;

  10. unsigned long HX711_Buffer = 0;
  11. unsigned long Weight_Maopi = 0;
  12. long Weight_Shiwu = 0;

  13. unsigned long Weight_Maopi1 = 0;
  14. long Weight_Shiwu1 = 0;

  15. long Weight_Shiwu3 = 000;
  16. long Weight_Shiwu4 = 10;

  17. unsigned char flag = 0;
  18. bit Flag_ERROR = 0;
  19. bit Flag_send = 0;

  20. sbit People= P3^6;
  21. sbit JINSHU= P3^2;

  22. unsigned char a;
  23. char qingpin=0;
  24. char shuju[]="0123456789";
  25. int TEMP=0;
  26. //校準(zhǔn)參數(shù)
  27. //因?yàn)椴煌膫鞲衅魈匦郧不是很一致,因此,每一個(gè)傳感器需要矯正這里這個(gè)參數(shù)才能使測(cè)量值很準(zhǔn)確。
  28. //當(dāng)發(fā)現(xiàn)測(cè)試出來(lái)的重量偏大時(shí),增加該數(shù)值。
  29. //如果測(cè)試出來(lái)的重量偏小時(shí),減小改數(shù)值。
  30. //該值可以為小數(shù)
  31. #define GapValue 390

  32. void Get_Maopi1();
  33. void Get_Weight1();
  34. char Key_Scan(char mode);
  35. void TaoCan(void);
  36. int LcdDisplay(int temp);          //lcd顯示
  37. void BuJing_Crole1(u16 j,u16 time);
  38. void BuJing_Crole2(u16 j,u16 time);
  39. //****************************************************
  40. //主函數(shù)
  41. //****************************************************
  42. sbit CTRL = P3^7;                                                                //舵機(jī)控制端口

  43. void delay_100ms(u16 x);

  44. u16 TIME = 20000;                                                                //PWM周期時(shí)間(單位us)
  45. u16 Min = 800;                                                                        //高電平最小持續(xù)時(shí)間
  46. u16 Max = 2200;                                                                        //高電平最大持續(xù)時(shí)間
  47. u16 aTime = 800;                                                                //高電平持續(xù)時(shí)間
  48. u8 Degree = 200;                                                                //單位時(shí)間寬度

  49. u8 R_TH0 = 0, R_TL0 = 0;                                //定時(shí)器0計(jì)數(shù)重載值
  50. void main()
  51. {
  52.         char  flage=0;
  53.         CTRL = 0;
  54.         
  55.         R_TL0 = 65536 - TIME;
  56.         R_TH0 = (65536 - TIME) >> 8;
  57.         
  58.         //設(shè)置定時(shí)器0
  59.         TMOD = 0x01;                                                                        //16位計(jì)數(shù)
  60.         TL0 = R_TL0;
  61.         TH0 = R_TH0;
  62.         ET0 = 1;                                                                                        //定時(shí)器0中斷開(kāi)關(guān)打開(kāi)
  63.         TR0 = 1;                                                                                        //定時(shí)器0計(jì)數(shù)開(kāi)始
  64.         
  65.         //設(shè)置定時(shí)器1
  66.         TMOD |= 0x10;                                                                        //16位計(jì)數(shù)
  67.         TL1 = 65536 - aTime;
  68.         TH1 = (65536 - aTime) >> 8;
  69.         ET1 = 1;                                                                                        //定時(shí)器1中斷開(kāi)關(guān)打開(kāi)
  70.         TR1 = 0;                                                                                        //定時(shí)器1計(jì)數(shù)停止
  71.         
  72.         EA = 1;        
  73.         //中斷總開(kāi)關(guān)打開(kāi)
  74.         Init_LCD1602();//屏幕初始化
  75.         aTime=2300;//關(guān)垃圾桶蓋
  76.         Delay_ms(1000);                 //延時(shí),等待傳感器穩(wěn)定
  77.         Get_Maopi1();                                //稱毛皮重量,誤差校驗(yàn)
  78.         
  79.         while(1)
  80.         {        
  81.                 if(People==1&&flage==0)
  82.                 {
  83.                         flage=1;
  84.                         aTime=1400;//開(kāi)蓋
  85.                         LCD1602_write_com(0x80);
  86.                         LCD1602_write_word("People:Y");
  87.                         BuJing_Crole1(2000,3);
  88.                         Delay_ms(1500);
  89.                         while(1)
  90.                         {
  91.                         
  92.                                 while(1)
  93.                                 {
  94.                                         if(JINSHU==1)
  95.                                         {
  96.                                                 LCD1602_write_word("JS:Y");
  97.                                                 Delay_ms(1500);
  98.                                                 LCD1602_write_com(0x89);
  99.                                                 BuJing_Crole2(260,3);
  100.                                         }
  101.                                         else{
  102.                                                 LCD1602_write_word("JS:N");
  103.                                                 Delay_ms(1500);
  104.                                                 LCD1602_write_com(0x89);
  105.                                                 BuJing_Crole2(26
  106.                                                 0,3);
  107.                                         }
  108.                                         while(1)
  109.                                         {
  110.                                                 LCD1602_write_com(0x80+0x40);//1602位置命令
  111.                                                 Get_Weight1();                        //稱重
  112.                                                 LCD1602_write_word("W:");
  113.                                                 LCD1602_write_data(Weight_Shiwu1/1000 + 0X30);
  114.                                                 LCD1602_write_data(Weight_Shiwu1%1000/100 + 0X30);
  115.                                                 LCD1602_write_data(Weight_Shiwu1%100/10 + 0X30);
  116.                                                 LCD1602_write_data(Weight_Shiwu1%10 + 0X30);
  117.                                                 LCD1602_write_word("g");
  118.                                         Delay_ms(1000);
  119.                                                 
  120.                                                 if(Weight_Shiwu1>=10)
  121.                                                 {
  122.                                                         LCD1602_write_com(0x01);        
  123.                                                         aTime=2300;//關(guān)垃圾桶蓋
  124.                                                         break;
  125.                                                 }
  126.                                         }
  127.                                         break;
  128.                                 }
  129.                                 break;
  130.                         }
  131.                 }else{
  132.                         flage=0;
  133.                         LCD1602_write_com(0x80);
  134.                         aTime=2300;//關(guān)垃圾桶蓋
  135.                         LCD1602_write_word("People:W");
  136.                         
  137.                 }        
  138.         }
  139. }

  140. //****************************************************
  141. //稱重
  142. //****************************************************
  143. void Get_Weight()
  144. {
  145.         Weight_Shiwu = HX711_Read();//讀取HX711AD采集值
  146.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
  147.         if(Weight_Shiwu > 0)        //判斷采集值正負(fù)               
  148.         {        
  149.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue);         //計(jì)算實(shí)物的實(shí)際重量
  150.                                                                                                                                                                                                                                                                         
  151.         }
  152.         else
  153.         {
  154.                 Weight_Shiwu = 0;//
  155.         }
  156. }

  157. void Get_Weight1()
  158. {
  159.         Weight_Shiwu1 = HX711_Read1();
  160.         Weight_Shiwu1 = Weight_Shiwu1 - Weight_Maopi1;                //獲取凈重
  161.         if(Weight_Shiwu1 > 0)                        
  162.         {        
  163.                 Weight_Shiwu1 = (unsigned int)((float)Weight_Shiwu1/GapValue);         //計(jì)算實(shí)物的實(shí)際重量
  164.                                                                                                                                                                                                                                                                         
  165.         }
  166.         else
  167.         {
  168.                 Weight_Shiwu1 = 0;
  169.         }
  170. }
  171. //****************************************************
  172. //獲取毛皮重量
  173. //****************************************************
  174. void Get_Maopi()
  175. {
  176.         Weight_Maopi = HX711_Read();        
  177. }

  178. void Get_Maopi1()
  179. {
  180.         Weight_Maopi1 = HX711_Read1();        
  181. }

  182. //****************************************************
  183. //MS延時(shí)函數(shù)(12M晶振下測(cè)試)
  184. //****************************************************
  185. void Delay_ms(unsigned int n)
  186. {
  187.         unsigned int  i,j;
  188.         for(i=0;i<n;i++)
  189.                 for(j=0;j<123;j++);
  190. }

  191. int LcdDisplay(int temp)          //lcd顯示
  192. {
  193.    
  194.           unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  195.         float tp;  
  196.         if(temp< 0)                                //當(dāng)溫度值為負(fù)數(shù)
  197.           {
  198.                   LCD1602_write_com(0x80);                //寫地址 80表示初始地址
  199.             LCD1602_write_data('-');                  //顯示負(fù)
  200.                 //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
  201.                 temp=temp-1;
  202.                 temp=~temp;
  203.                 tp=temp;
  204.                 temp=tp*0.0625*100+0.5;        
  205.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  206.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  207.                 //算由?.5,還是在小數(shù)點(diǎn)后面。

  208.           }
  209.          else
  210.           {                        
  211.                   LCD1602_write_com(0x80);                //寫地址 80表示初始地址
  212.             LCD1602_write_data('+');                 //顯示正
  213.                 tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  214.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  215.                 temp=tp*0.0625*100+0.5;        
  216.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  217.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  218.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。
  219.         }
  220.         datas[0] = temp / 10000;
  221.         datas[1] = temp % 10000 / 1000;
  222.         datas[2] = temp % 1000 / 100;
  223.         datas[3] = temp % 100 / 10;
  224.         datas[4] = temp % 10;

  225.         LCD1602_write_com(0x82);                  //寫地址 80表示初始地址
  226.         LCD1602_write_data(datas[0]+0x30); //百位
  227.         
  228.         
  229.         LCD1602_write_com(0x83);                 //寫地址 80表示初始地址
  230.         LCD1602_write_data(datas[1]+0x30); //十位
  231.         

  232.         LCD1602_write_com(0x84);                //寫地址 80表示初始地址
  233.         LCD1602_write_data(datas[2]+0x30); //個(gè)位
  234.         

  235.         LCD1602_write_com(0x85);                //寫地址 80表示初始地址
  236.         LCD1602_write_data('.');                 //顯示 ‘.’
  237.         

  238.         LCD1602_write_com(0x86);                 //寫地址 80表示初始地址
  239.         LCD1602_write_data(datas[3]+0x30); //顯示小數(shù)點(diǎn)  

  240.         LCD1602_write_com(0x87);                 //寫地址 80表示初始地址
  241.         LCD1602_write_data(datas[4]+0x30); //顯示小數(shù)點(diǎn)
  242.         
  243.     temp=datas[1]*10+datas[2];        
  244.         return temp;
  245. }


  246. void timer0() interrupt 1 using 1
  247. {
  248.         TL0 = R_TL0;
  249.         TH0 = R_TH0;        
  250.         TL1 = 65536 - aTime;
  251.         TH1 = (65536 - aTime) >> 8;
  252.         TR1 = 1;        
  253.         CTRL = 1;
  254. }


  255. //定時(shí)器1中斷函數(shù)
  256. void timer1() interrupt 3 using 1
  257. {
  258. ……………………

  259. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有參考資料51hei提供下載:
智能垃圾桶.7z (1.94 MB, 下載次數(shù): 156)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:722679 發(fā)表于 2020-4-5 14:36 | 只看該作者
寫的真的很好,我在其中學(xué)習(xí)到了很多知識(shí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:695961 發(fā)表于 2020-4-14 11:17 | 只看該作者
樓主的人體感應(yīng)模塊用的是哪一家的?
回復(fù)

使用道具 舉報(bào)

地板
ID:761098 發(fā)表于 2020-5-28 21:49 | 只看該作者
樓主你好  人體感應(yīng)使用紅外?還是超聲波?
回復(fù)

使用道具 舉報(bào)

5#
ID:840390 發(fā)表于 2020-11-24 11:11 來(lái)自觸屏版 | 只看該作者
設(shè)計(jì)真的不錯(cuò),求proteus仿真圖
回復(fù)

使用道具 舉報(bào)

6#
ID:896436 發(fā)表于 2021-4-27 12:42 | 只看該作者
這個(gè)設(shè)計(jì)很棒我覺(jué)得很有市場(chǎng)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表