找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5342|回复: 2
打印 上一主题 下一主题
收起左侧

单片机智能垃圾桶程序设计 GP2D12红外测距+MPX4115压力传感器 Proteus仿真原理图

[复制链接]
跳转到指定楼层
楼主
1,智能垃圾桶测量当前压力,达到一定压力值报警提示清空垃圾桶,通过ADC0832模块转换模拟量转换成数字量。

2,距离传感器通过测量当前人与垃圾桶的距离当在一定距离打开垃圾桶盖,通过这些作为智能垃圾桶的检测部分,蜂鸣器还有提示灯充当辅助作用。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


电路原理图如下:


智能垃圾桶的51单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h> //包含NOP空指令函数_nop_
  3. #include <stdio.h>
  4. #include "LCD1602.h"

  5. #define uchar unsigned char
  6. #define uint  unsigned int


  7. //------------------------------ADC0808的引脚------------------------------
  8. sbit eoc=P3^0;
  9. sbit oe =P3^1;
  10. sbit st =P3^2;

  11. //------------------------------ADC0832的引脚------------------------------
  12. sbit ADCS =P2^3;  //ADC0832 chip seclect
  13. sbit ADDI =P2^5;  //ADC0832 k in
  14. sbit ADDO =P2^5;  //ADC0832 k out
  15. sbit ADCLK =P2^4;

  16. sbit GREEN =P3^3;
  17. sbit RED =P3^4;
  18. sbit LOUD =P2^6;
  19. sbit Motor=P3^7;


  20. void delaynms(uint x);
  21. void ad0808(void);
  22. void display(void);
  23. void Delay_ms(unsigned int n);
  24. unsigned int Adc0832(unsigned char channel);
  25. void Display_weight(void);
  26. void Tishi(void);

  27. uint ad_0809,a1,a2,a3;
  28. uchar out,out1,weight1;
  29. unsigned int weight2;
  30. uchar table[]="distance:   ";
  31. uchar table1[]="Weight:   . g";

  32. void main()
  33. {
  34.   Init_LCD1602();
  35.     RED=0;
  36.     GREEN=0;
  37. while(1)
  38. {
  39.   ad0808();
  40.     display();
  41.     Display_weight();
  42.      Tishi();
  43. }
  44. }

  45. //-------------------------------给ad8080延时函数------------------------------
  46. void delaynms(uint x)   
  47. {
  48. while(x-->0)
  49.     {
  50.       unsigned char k;
  51.       for(k=10;k>0;k--);
  52.     }
  53. }
  54. //-------------------------------给GP2D12进行模数转换----------------------------

  55. void ad0808()
  56. {
  57.   P1=0xff;//input
  58.   st=0;
  59.     eoc=1;
  60.   oe=1;//停止-----------
  61.   st=1;//清0
  62.   st=0;//启动
  63.   delaynms(1);
  64.   while(!eoc);       //eoc等于零的话,在这里等待直到eoc=1,结束循环,向下执行
  65.   oe=0;//启动-----------
  66.   out=P1;
  67.   oe=0;
  68. }

  69. //------------------------------显示距离函数----------------------------

  70. void display()
  71. {
  72.     int i;
  73.     out1=out*0.7-4;
  74.     ad_0809=90-out1;
  75.   a1=(ad_0809)/100;  //the highest bit
  76.     table[9]=a1+0x30;
  77.   a2=(ad_0809)/10%10;
  78.     table[10]=a2+0x30;
  79.   a3=(ad_0809)%100%10;
  80.     table[11]=a3+0x30;
  81.     LCD1602_write_com(0xc0);
  82.     for(i=0;i<12;i++)
  83.     {
  84.         LCD1602_write_data(table[i]);
  85.     }
  86. }

  87. //----------------MS延时函数(12M晶振下测试)--------------------------------

  88. void Delay_ms(unsigned int n)
  89. {
  90.     unsigned int  i,j;
  91.     for(i=0;i<n;i++)
  92.         for(j=0;j<123;j++);
  93. }

  94. //-------------------显示物体重量-------------------------------

  95. void Display_weight(void)
  96. {
  97.   unsigned int i;
  98.   float  press;
  99.     weight1=Adc0832(0);
  100.      if(14<weight1<243)                           
  101.          {   
  102.         int    vary=weight1;
  103.             press=((10.0/23.0)*vary)+9.3;
  104.             weight2=(int)(press*10);     
  105.         }
  106.         table1[7]=(weight2/1000)+0x30;
  107.         table1[8]=(weight2%1000)/100+0x30;
  108.         table1[9]=((weight2%1000)%100)/10+0x30;
  109.         table1[11]=((weight2%1000)%100)%10+0x30;
  110.     LCD1602_write_com(0x80);
  111.     for(i=0;i<12;i++)
  112.     {
  113.         LCD1602_write_data(table1[i]);
  114.     }
  115.    
  116. }
  117. //--------------------采集并返回--------------------------------
  118. unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
  119. {
  120.     unsigned char i=0;
  121.     unsigned char j;
  122.     unsigned int dat=0;
  123.     unsigned char ndat=0;

  124.     if(channel==0)channel=2;
  125.     if(channel==1)channel=3;
  126.     ADDI=1;
  127.     _nop_();
  128.     _nop_();
  129.     ADCS=0;//拉低CS端
  130.     _nop_();
  131.     _nop_();
  132.     ADCLK=1;//拉高CLK端
  133.     _nop_();
  134.     _nop_();
  135.     ADCLK=0;//拉低CLK端,形成下降沿1
  136.     _nop_();
  137.     _nop_();
  138.     ADCLK=1;//拉高CLK端
  139.     ADDI=channel&0x1;
  140.     _nop_();
  141.     _nop_();
  142.     ADCLK=0;//拉低CLK端,形成下降沿2
  143.     _nop_();
  144.     _nop_();
  145.     ADCLK=1;//拉高CLK端
  146.     ADDI=(channel>>1)&0x1;
  147.     _nop_();
  148.     _nop_();
  149.     ADCLK=0;//拉低CLK端,形成下降沿3
  150.     ADDI=1;//控制命令结束
  151.     _nop_();
  152.     _nop_();
  153.     dat=0;
  154.     for(i=0;i<8;i++)
  155.     {
  156.         dat|=ADDO;//收数据
  157.         ADCLK=1;
  158.         _nop_();
  159.         _nop_();
  160.         ADCLK=0;//形成一次时钟脉冲
  161.         _nop_();
  162.         _nop_();
  163.         dat<<=1;
  164.         if(i==7)dat|=ADDO;
  165.     }  
  166.     for(i=0;i<8;i++)
  167.     {
  168.         j=0;
  169.         j=j|ADDO;//收数据
  170.         ADCLK=1;
  171.         _nop_();
  172.         _nop_();
  173.         ADCLK=0;//形成一次时钟脉冲
  174.         _nop_();
  175.         _nop_();
  176.         j=j<<7;
  177.         ndat=ndat|j;
  178.         if(i<7)ndat>>=1;
  179.     }
  180.     ADCS=1;//拉低CS端
  181.     ADCLK=0;//拉低CLK端
  182.     ADDO=1;//拉高数据端,回到初始状态
  183.     dat<<=8;
  184.     dat|=ndat;
  185.     return(dat);            //return ad k
  186. }

  187. //-----------------------------提升模块
  188. void Tishi()
  189. {
  190.     if(weight2>=400)
  191.     {
  192.     RED=1;
  193.     LOUD=~LOUD;
  194.     Delay_ms(1);
  195.     }
  196.     else
  197.     {
  198.         RED=0;
  199.     }
  200.     if((table[10]-0X30)*10+(table[11]-0x30)<=15)
  201.     {
  202.         GREEN=1;   
  203.         Motor=1;            

  204.     }
  205.     else
  206.     {
  207.         
  208.         GREEN=0;
  209.         Motor=0;
  210.     }
  211. }

复制代码


仿真代码51hei附件下载,仅供参考,Proteus工程文件是7.5版本的:
完成.7z (175.73 KB, 下载次数: 198)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:247623 发表于 2021-12-16 10:10 | 只看该作者
大家不要下载,这个程序不对的,红外测距不能实现测距功能。
回复

使用道具 举报

板凳
ID:980899 发表于 2021-12-22 16:39 | 只看该作者
yilinghai 发表于 2021-12-16 10:10
大家不要下载,这个程序不对的,红外测距不能实现测距功能。

老哥,这个测距你会弄吗,能不能教一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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