找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6893|回复: 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, 下载次数: 152)

评分

参与人数 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 单片机教程网

快速回复 返回顶部 返回列表