1,智能垃圾桶测量当前压力,达到一定压力值报警提示清空垃圾桶,通过ADC0832模块转换模拟量转换成数字量。
2,距离传感器通过测量当前人与垃圾桶的距离当在一定距离打开垃圾桶盖,通过这些作为智能垃圾桶的检测部分,蜂鸣器还有提示灯充当辅助作用。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路原理图如下:
智能垃圾桶的51单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h> //包含NOP空指令函数_nop_
- #include <stdio.h>
- #include "LCD1602.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- //------------------------------ADC0808的引脚------------------------------
- sbit eoc=P3^0;
- sbit oe =P3^1;
- sbit st =P3^2;
- //------------------------------ADC0832的引脚------------------------------
- sbit ADCS =P2^3; //ADC0832 chip seclect
- sbit ADDI =P2^5; //ADC0832 k in
- sbit ADDO =P2^5; //ADC0832 k out
- sbit ADCLK =P2^4;
- sbit GREEN =P3^3;
- sbit RED =P3^4;
- sbit LOUD =P2^6;
- sbit Motor=P3^7;
- void delaynms(uint x);
- void ad0808(void);
- void display(void);
- void Delay_ms(unsigned int n);
- unsigned int Adc0832(unsigned char channel);
- void Display_weight(void);
- void Tishi(void);
- uint ad_0809,a1,a2,a3;
- uchar out,out1,weight1;
- unsigned int weight2;
- uchar table[]="distance: ";
- uchar table1[]="Weight: . g";
- void main()
- {
- Init_LCD1602();
- RED=0;
- GREEN=0;
- while(1)
- {
- ad0808();
- display();
- Display_weight();
- Tishi();
- }
- }
- //-------------------------------给ad8080延时函数------------------------------
- void delaynms(uint x)
- {
- while(x-->0)
- {
- unsigned char k;
- for(k=10;k>0;k--);
- }
- }
- //-------------------------------给GP2D12进行模数转换----------------------------
- void ad0808()
- {
- P1=0xff;//input
- st=0;
- eoc=1;
- oe=1;//停止-----------
- st=1;//清0
- st=0;//启动
- delaynms(1);
- while(!eoc); //eoc等于零的话,在这里等待直到eoc=1,结束循环,向下执行
- oe=0;//启动-----------
- out=P1;
- oe=0;
- }
- //------------------------------显示距离函数----------------------------
- void display()
- {
- int i;
- out1=out*0.7-4;
- ad_0809=90-out1;
- a1=(ad_0809)/100; //the highest bit
- table[9]=a1+0x30;
- a2=(ad_0809)/10%10;
- table[10]=a2+0x30;
- a3=(ad_0809)%100%10;
- table[11]=a3+0x30;
- LCD1602_write_com(0xc0);
- for(i=0;i<12;i++)
- {
- LCD1602_write_data(table[i]);
- }
- }
- //----------------MS延时函数(12M晶振下测试)--------------------------------
- void Delay_ms(unsigned int n)
- {
- unsigned int i,j;
- for(i=0;i<n;i++)
- for(j=0;j<123;j++);
- }
- //-------------------显示物体重量-------------------------------
- void Display_weight(void)
- {
- unsigned int i;
- float press;
- weight1=Adc0832(0);
- if(14<weight1<243)
- {
- int vary=weight1;
- press=((10.0/23.0)*vary)+9.3;
- weight2=(int)(press*10);
- }
- table1[7]=(weight2/1000)+0x30;
- table1[8]=(weight2%1000)/100+0x30;
- table1[9]=((weight2%1000)%100)/10+0x30;
- table1[11]=((weight2%1000)%100)%10+0x30;
- LCD1602_write_com(0x80);
- for(i=0;i<12;i++)
- {
- LCD1602_write_data(table1[i]);
- }
-
- }
- //--------------------采集并返回--------------------------------
- unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
- {
- unsigned char i=0;
- unsigned char j;
- unsigned int dat=0;
- unsigned char ndat=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令结束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高数据端,回到初始状态
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad k
- }
- //-----------------------------提升模块
- void Tishi()
- {
- if(weight2>=400)
- {
- RED=1;
- LOUD=~LOUD;
- Delay_ms(1);
- }
- else
- {
- RED=0;
- }
- if((table[10]-0X30)*10+(table[11]-0x30)<=15)
- {
- GREEN=1;
- Motor=1;
- }
- else
- {
-
- GREEN=0;
- Motor=0;
- }
- }
复制代码
仿真代码51hei附件下载,仅供参考,Proteus工程文件是7.5版本的:
完成.7z
(175.73 KB, 下载次数: 211)
|