1,智能垃圾桶測量當前壓力,達到一定壓力值報警提示清空垃圾桶,通過ADC0832模塊轉(zhuǎn)換模擬量轉(zhuǎn)換成數(shù)字量。
2,距離傳感器通過測量當前人與垃圾桶的距離當在一定距離打開垃圾桶蓋,通過這些作為智能垃圾桶的檢測部分,蜂鳴器還有提示燈充當輔助作用。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (21.97 KB, 下載次數(shù): 74)
下載附件
2021-8-12 16:29 上傳
電路原理圖如下:
51hei.png (50.79 KB, 下載次數(shù): 58)
下載附件
2021-8-12 16:29 上傳
智能垃圾桶的51單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h> //包含NOP空指令函數(shù)_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延時函數(shù)------------------------------
- void delaynms(uint x)
- {
- while(x-->0)
- {
- unsigned char k;
- for(k=10;k>0;k--);
- }
- }
- //-------------------------------給GP2D12進行模數(shù)轉(zhuǎn)換----------------------------
- void ad0808()
- {
- P1=0xff;//input
- st=0;
- eoc=1;
- oe=1;//停止-----------
- st=1;//清0
- st=0;//啟動
- delaynms(1);
- while(!eoc); //eoc等于零的話,在這里等待直到eoc=1,結(jié)束循環(huán),向下執(zhí)行
- oe=0;//啟動-----------
- out=P1;
- oe=0;
- }
- //------------------------------顯示距離函數(shù)----------------------------
- 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延時函數(shù)(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轉(zhuǎn)換,返回結(jié)果
- {
- 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;//控制命令結(jié)束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收數(shù)據(jù)
- 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;//收數(shù)據(jù)
- 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;//拉高數(shù)據(jù)端,回到初始狀態(tài)
- 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.png (13.88 KB, 下載次數(shù): 67)
下載附件
2021-8-12 16:48 上傳
仿真代碼51hei附件下載,僅供參考,Proteus工程文件是7.5版本的:
完成.7z
(175.73 KB, 下載次數(shù): 212)
2021-8-12 16:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|