#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include "DHT11.H"
#include "lcd1602.H"
#include "usart.h"
sbit LED0 = P3 ^ 5;
sbit LED1 = P3 ^ 6;
sbit LED2 = P3 ^ 7;
sbit LED3 = P2 ^ 6;
sbit KEY = P1 ^ 3;
sbit JG = P1 ^ 6;
sbit SG = P1 ^ 7;
sbit FQM = P2 ^ 5;
sbit ADCS = P3^4; //ADC0832 chip seclect
sbit ADDI = P1^5; //ADC0832 data in
sbit ADDO = P1^5; //ADC0832 data out
sbit ADCLK = P1^4; //ADC0832 clock signal
unsigned char setSec0 = 0, setSec1 = 0, setSec2 = 0, setSec3 = 0;
unsigned char setflag0 = 0, setflag1 = 0, setflag2 = 0, setflag3 = 0;
unsigned char buf[32];
unsigned int V_IN;
unsigned char Adc0832(unsigned char channel);
uchar UartRxBuffer[ 16 ] = { 0 }; //uart串口接收数据
uchar TX_Cnt = 0; //发送计数
uchar RX_Cnt = 0; //接收计数
bit TX_Busy = 0; //发送忙标志
char rec = 's';
bit rec_suc = 0;
//定时器0中断
void main(void)
{
uchar setSec_num = 10;
uchar sendDis;
FQM = 0;
LCD_Init(); //LCD初始化
LCDSendCmd(0X01); //LCD清屏
Timer0Init(); //定时器 外部中断相关初始化
P1 = 0;
P1 = 0XFF;
uart_init();
Delay_1(50);
uart_tx_string("start!\n");
while (1)
{
RH();
ChaoshengBoSimple();
if (setSec0 > 0)
{
setSec0--;
LED0 = 0;
}
else
LED0 = 1;
if (setSec1 > 0)
{
setSec1--;
LED1 = 0;
}
else
LED1 = 1;
if (setSec2 > 0)
{
setSec2--;
LED2 = 0;
}
else
LED2 = 1;
if (setSec3 > 0)
{
setSec3--;
LED3 = 0;
}
else
LED3 = 1;
if (Distance <= 100) //垃圾满了报警
{
FQM = 1;
LCDPrintString(0, 0, "Trash Warning");
}
else
{
FQM = 0;
LCDPrintString(0, 0, "Trash Normal ");
}
intToString(buf, U8RH_data_H, 2);
uart_tx_byte(U8RH_data_H);
LCDPrintString(0, 1, buf); //等待20ms
LCDPrintString(3, 1, "%RH"); //LCD 字符显示输出
intToString(buf, Distance / 10, 2); //数字转换成字符串
LCDPrintString(9, 1, buf); //LCD 字符显示输出
intToString(buf, Distance % 10, 1); //数字转换成字符串
LCDPrintString(11, 1, ".");
LCDPrintString(12, 1, buf); //LCD 字符显示输出
LCDPrintString(13, 1, "cm"); //LCD 字符显示输出
sendDis=Distance+100; //垃圾桶没有满才能开
uart_tx_byte(sendDis);
V_IN = Adc0832(0)*120;
if(V_IN>27540)
{
V_IN = V_IN - 27540;
}
else
{
V_IN =0;
}
//intToString(buf, V_IN, 5);
//uart_tx_string(buf);
//uart_tx_string(" \n");
if (V_IN>2295)
{
uart_tx_byte(100);
//LED0 = 0;
//Delay_1(50);
//LED0 = 1;
}
if (V_IN>1530&&V_IN<=2295)
{
uart_tx_byte(101);
//LED1 = 0;
//Delay_1(50);
//LED1 = 1;
}
if (V_IN>765&&V_IN<=1530)
{
uart_tx_byte(102);
//LED2 = 0;
//Delay_1(50);
//LED2 = 1;
}
if (V_IN<=765)
{
uart_tx_byte(103);
//LED3 = 0;
//Delay_1(50);
//LED3 = 1;
}
if (V_IN<=100)
{
uart_tx_byte(5);
//LED3 = 0;
//Delay_1(50);
//LED3 = 1;
}
if (Distance > 100)
{
//*********************************************************
if (JG == 0&&KEY ==0)
{
setSec0 = setSec_num;
if (setflag0 == 0)
{
MotorRun(0, 1, 6);
}
setflag0 = 1;
uart_tx_byte(1);
while (KEY ==0)
;
}
if (setSec0 == 0)
{
if (setflag0)
{
MotorRun(0, 0, 6);
setflag0 = 0;
uart_tx_byte(0);
}
}
//*********************************************************
if (JG == 1&& SG==1&&KEY ==0)
{
if (U8RH_data_H > 50)
{
setSec1 = setSec_num;
if (setflag1 == 0)
{
MotorRun(0, 1, 12);
}
setflag1 = 1;
uart_tx_byte(2);
}
else
{
setSec2 = setSec_num;
if (setflag2 == 0)
{
MotorRun(0, 1, 18);
}
setflag2 = 1;
uart_tx_byte(3);
}
while (KEY ==0)
;
}
if (setSec1 == 0)
{
if (setflag1)
{
MotorRun(0, 0, 12);
setflag1 = 0;
uart_tx_byte(0);
}
}
if (setSec2 == 0)
{
if (setflag2)
{
MotorRun(0, 0, 18);
setflag2 = 0;
uart_tx_byte(0);
}
}
//*********************************************************
if (SG == 0&&KEY ==0)
{
setSec3 = setSec_num;
if (setflag3 == 0)
{
MotorRun(0, 1, 24);
}
setflag3 = 1;
uart_tx_byte(4);
while (KEY ==0)
;
}
if (setSec3 == 0)
{
if (setflag3)
{
MotorRun(0, 0, 24);
setflag3 = 0;
uart_tx_byte(0);
}
}
if(rec_suc)
{
rec_suc = 0;
if(rec == 'j') //金属垃圾
{
setSec0 = setSec_num;
if (setflag0 == 0)
{
MotorRun(0, 1, 6);
}
setflag0 = 1;
uart_tx_byte(1);
while (KEY == 0)
;
}
if (setSec0 == 0)
{
if (setflag0)
{
MotorRun(0, 0, 6);
setflag0 = 0;
uart_tx_byte(0);
}
}
//*********************************************************
if(rec == 'c') //厨房湿垃圾
{
if (U8RH_data_H > 50)
{
setSec1 = setSec_num;
if (setflag1 == 0)
{
MotorRun(0, 1, 12);
}
setflag1 = 1;
uart_tx_byte(2);
}
while (KEY == 0)
;
}
if (setSec1 == 0)
{
if (setflag1)
{
MotorRun(0, 0, 12);
setflag1 = 0;
uart_tx_byte(0);
}
}
//*********************************************************
if(rec == 'q') //其他垃圾
{
setSec2 = setSec_num;
if (setflag2 == 0)
{
MotorRun(0, 1, 18);
}
setflag2 = 1;
uart_tx_byte(3);
while (KEY == 0)
;
}
if (setSec2 == 0)
{
if (setflag2)
{
MotorRun(0, 0, 18);
setflag2 = 0;
uart_tx_byte(0);
}
}
//*********************************************************
if(rec == 's') //塑料垃圾
{
setSec3 = setSec_num;
if (setflag3 == 0)
{
MotorRun(0, 1, 24);
}
setflag3 = 1;
uart_tx_byte(4);
while (KEY == 0)
;
}
if (setSec3 == 0)
{
if (setflag3)
{
MotorRun(0, 0, 24);
setflag3 = 0;
uart_tx_byte(0);
}
}
}
}
}
}
//采集并返回
unsigned char Adc0832(unsigned char channel)
{
uchar i=0;
uchar j;
uint dat=0;
uchar 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 data
}
/*
功能:将接收到的数据存入到UartRxBuffer
*************************************************/
void UART_INT (void) interrupt 4
{
EA = 0;
if(RI)
{
RI = 0;
UartRxBuffer[RX_Cnt] = SBUF;//将数据写入数组
rec = UartRxBuffer[RX_Cnt];
rec_suc = 1;
//防止溢出,当计数=16时,将计数清零
if(++RX_Cnt >= 64){
RX_Cnt = 0;
}
}
if(TI)
{
TI = 0;
TX_Busy = 0;
}
EA = 1;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源包括Keil完整工程代码、Proteus仿真以及Labview上位机,proteus和labview通过虚拟串口连接,可实现上位机联动仿真。智能垃圾分类箱,垃圾箱共设计四个分类,分别为:金属垃圾、透明塑料垃圾、厨余湿垃圾和其他垃圾。设置光电开关判断是否由垃圾投入,设置电感式接近开关用来检测是否为金属垃圾;设置红外对管模块用来检测投入垃圾的透明程度判断是否为透明塑料垃圾,设置湿度传感器来检测是否为厨房湿垃圾。
资源推荐
资源详情
资源评论
收起资源包目录
智能垃圾分类箱.zip (52个子文件)
智能垃圾分类箱
keil
frmain.OBJ 35KB
frmain.uvgui.Serendipity 73KB
usart.OBJ 4KB
frmain.uvopt 57KB
usart.LST 4KB
Last Loaded 仿真图.pdsbak 33KB
frmain_uvproj.bak 14KB
STARTUP.LST 14KB
LCD1602.H 7KB
frmain 34KB
main.LST 421B
frmain.uvgui.Cuthbert 85KB
frmain.uvgui.ht 71KB
usart.c 1KB
usart.h 270B
frmain.M51 43KB
frmain.uvproj 13KB
frmain.LST 24KB
Last Loaded 仿真图.fv8.14.pdsbak 34KB
frmain.uvgui_Serendipity.bak 73KB
STARTUP.A51 6KB
frmain.lnp 74B
DHT11.H 2KB
frmain.hex 9KB
frmain.plg 202B
STARTUP.OBJ 749B
frmain.c 8KB
frmain_uvopt.bak 57KB
protues
仿真图.pdsprj.DESKTOP-O9V4C91.Administrator.workspace 2KB
Last Loaded 仿真图.pdsbak 29KB
仿真图.pdsprj 31KB
仿真图.pdsprj.CUTHBERT-DESKTO.Cuthbert.workspace 2KB
Backup Of 仿真图.pdsbak 29KB
labview
Serial - XON-XOFF Characters.ctl 13KB
关闭本VI的程序.vi 6KB
Continuous Serial Write and Read.vi 62KB
修改用户密码VI.vi 25KB
Serial - ASCII Characters.ctl 13KB
main.vi 56KB
Serial - Settings.ctl 24KB
删除一条记录.vi 17KB
CDS.udl 392B
增加一条记录.vi 17KB
选出一条记录.vi 21KB
更新一条记录.vi 24KB
初始化一个数据库.vi 18KB
管理员界面.vi 43KB
管理主要操作控件.ctl 4KB
更新用户登陆次数.vi 28KB
CDS.mdb 300KB
量表.ctl 6KB
获取数据库路径.vi 7KB
共 52 条
- 1
琉璃碎影
- 粉丝: 4
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页