久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7671|回復: 5
收起左側

單片機智能垃圾桶的實現方案程序(人體感應+金屬探測模塊實現)

  [復制鏈接]
ID:440534 發表于 2019-5-5 13:32 | 顯示全部樓層 |閱讀模式
使用到的模塊有9g舵機,步進電機人體感應模塊,金屬探測模塊,LCD1602顯示屏,原理圖如下: }]H6`Q)]`7PDP8MI`Q4{Y5X.png

單片機源程序如下:
  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. //校準參數
  27. //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
  28. //當發現測試出來的重量偏大時,增加該數值。
  29. //如果測試出來的重量偏小時,減小改數值。
  30. //該值可以為小數
  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. //主函數
  41. //****************************************************
  42. sbit CTRL = P3^7;                                                                //舵機控制端口

  43. void delay_100ms(u16 x);

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

  49. u8 R_TH0 = 0, R_TL0 = 0;                                //定時器0計數重載值
  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.         //設置定時器0
  59.         TMOD = 0x01;                                                                        //16位計數
  60.         TL0 = R_TL0;
  61.         TH0 = R_TH0;
  62.         ET0 = 1;                                                                                        //定時器0中斷開關打開
  63.         TR0 = 1;                                                                                        //定時器0計數開始
  64.         
  65.         //設置定時器1
  66.         TMOD |= 0x10;                                                                        //16位計數
  67.         TL1 = 65536 - aTime;
  68.         TH1 = (65536 - aTime) >> 8;
  69.         ET1 = 1;                                                                                        //定時器1中斷開關打開
  70.         TR1 = 0;                                                                                        //定時器1計數停止
  71.         
  72.         EA = 1;        
  73.         //中斷總開關打開
  74.         Init_LCD1602();//屏幕初始化
  75.         aTime=2300;//關垃圾桶蓋
  76.         Delay_ms(1000);                 //延時,等待傳感器穩定
  77.         Get_Maopi1();                                //稱毛皮重量,誤差校驗
  78.         
  79.         while(1)
  80.         {        
  81.                 if(People==1&&flage==0)
  82.                 {
  83.                         flage=1;
  84.                         aTime=1400;//開蓋
  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;//關垃圾桶蓋
  124.                                                         break;
  125.                                                 }
  126.                                         }
  127.                                         break;
  128.                                 }
  129.                                 break;
  130.                         }
  131.                 }else{
  132.                         flage=0;
  133.                         LCD1602_write_com(0x80);
  134.                         aTime=2300;//關垃圾桶蓋
  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)        //判斷采集值正負               
  148.         {        
  149.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue);         //計算實物的實際重量
  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);         //計算實物的實際重量
  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延時函數(12M晶振下測試)
  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}; //定義數組
  195.         float tp;  
  196.         if(temp< 0)                                //當溫度值為負數
  197.           {
  198.                   LCD1602_write_com(0x80);                //寫地址 80表示初始地址
  199.             LCD1602_write_data('-');                  //顯示負
  200.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  201.                 temp=temp-1;
  202.                 temp=~temp;
  203.                 tp=temp;
  204.                 temp=tp*0.0625*100+0.5;        
  205.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  206.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  207.                 //算由?.5,還是在小數點后面。

  208.           }
  209.          else
  210.           {                        
  211.                   LCD1602_write_com(0x80);                //寫地址 80表示初始地址
  212.             LCD1602_write_data('+');                 //顯示正
  213.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  214.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  215.                 temp=tp*0.0625*100+0.5;        
  216.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  217.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  218.                 //算加上0.5,還是在小數點后面。
  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); //個位
  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); //顯示小數點  

  240.         LCD1602_write_com(0x87);                 //寫地址 80表示初始地址
  241.         LCD1602_write_data(datas[4]+0x30); //顯示小數點
  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. //定時器1中斷函數
  256. void timer1() interrupt 3 using 1
  257. {
  258. ……………………

  259. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:722679 發表于 2020-4-5 14:36 | 顯示全部樓層
寫的真的很好,我在其中學習到了很多知識
回復

使用道具 舉報

ID:695961 發表于 2020-4-14 11:17 | 顯示全部樓層
樓主的人體感應模塊用的是哪一家的?
回復

使用道具 舉報

ID:761098 發表于 2020-5-28 21:49 | 顯示全部樓層
樓主你好  人體感應使用紅外?還是超聲波?
回復

使用道具 舉報

ID:840390 發表于 2020-11-24 11:11 來自手機 | 顯示全部樓層
設計真的不錯,求proteus仿真圖
回復

使用道具 舉報

ID:896436 發表于 2021-4-27 12:42 | 顯示全部樓層
這個設計很棒我覺得很有市場
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区在线视频 | 亚洲在线免费 | 国产免费播放视频 | 天天曰夜夜操 | 日韩在线免费视频 | 免费黄色av| 亚洲图片一区二区三区 | 日韩一二区| 伊人91在线 | 久久久入口 | 久久久久久久国产精品影院 | 欧美激情久久久 | 99成人 | 欧美一区2区三区3区公司 | 欧美黑人狂野猛交老妇 | 操视频网站 | 亚洲性人人天天夜夜摸 | 天天看天天爽 | 亚洲国产精品99久久久久久久久 | 一区天堂| 黄色a级一级片 | 国产一级片精品 | 欧美日韩国产在线观看 | 在线播放中文 | 欧美日韩高清在线观看 | 欧美性猛交一区二区三区精品 | 欧美性生活视频 | 蜜桃臀av一区二区三区 | 免费视频成人国产精品网站 | 久久国产精品视频 | 久久亚洲91| 久久久久中文字幕 | 久久久久久高潮国产精品视 | 欧美精品一区二区三区在线播放 | 国产精品电影网 | 日本特黄特色aaa大片免费 | 99精品一区二区 | 免费观看一级视频 | 久草免费在线视频 | 国产精品久久久久久久久久久久久 | 国产精品网址 |