单片机在我们生活的各个领域随处可见,几乎没有电气设备不需要单片机的。飞机的导航装置,智能汽车的控制设备,计算机网络通信和数据传输,工业机器人以及工业生产的管理控制。微控制器被广泛用于在各个领域的智能管理和过程控制,例如仪器仪表,家电产品,医疗设备,航空航天等等。 本设计由STC89C52单片机电路+红外避障传感器+HX711称重电路+蜂鸣器报警电路+继电器电路+电源电路组成。避障红外传感器检测到障碍物,继电器闭合,避障红外传感器没有检测到障碍物,继电器断开。如果称重传感器检测到重量超过一定值,或者设备启动时间超过30秒,蜂鸣器鸣叫报警。该智能垃圾桶电路具有良好的稳定性和可靠性,性能优越。
单片机源程序如下:
- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #include<stdio.h>
- #include "delay.h"
- #include<intrins.h>
- #include "hx711.h"
- sbit redCheck=P1^2; //引脚定义
- sbit relay = P1^4;
- sbit buzzer = P1^3;
- char dis0[16]; // 显示暂存 方便调试
- unsigned long time_20ms=0; // 系统定时计数
- unsigned char readFlag=0; //定时读取标志
- long Weight_mp=0; //读取重量值
- long Weight_Shiwu=0; //实物重量
- unsigned long Weight_Maopi=0; //毛坯重量
- unsigned char time_ok =0; //定时时间到
- void Init_Timer0(void); //函数声明
- void SendStr(unsigned char *s,unsigned char length);
- void UART_Init(void);
- void SendByte(unsigned char dat);
- void main (void)
- {
- Init_Timer0(); //定时器0初始化
- UART_Init();
- DelayMs(200); //延时有助于稳定
- Weight_Maopi = HX711_Read(); //读取去皮重量
- DelayMs(10);
- Weight_Maopi = HX711_Read();
- Weight_mp = (unsigned int)((float)Weight_Maopi/430); //重量转化
- while (1) //主循环
- {
- if(readFlag==1)
- {
- readFlag=0;
- Weight_Shiwu = HX711_Read(); //读取实物重量
- Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重
- if(Weight_Shiwu > 10)
- {
- Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/430); //g计算实物的实际重量
- }
- else
- { Weight_Shiwu = 0;}
- sprintf(dis0,"ShiWu:%5dg",(int)Weight_Shiwu);//打印
- SendStr(dis0,13);//串口发送 调试用
- SendStr("\n",1);
- if(Weight_Shiwu>1000) //如果重量超过1000g
- {
- buzzer =0; //蜂鸣器报警
- }
- else
- {
- if(time_ok==0) //时间还没有到
- {buzzer =1;} //关闭蜂鸣器报警
- }
- if(redCheck == 0) //检测到有障碍
- {relay =0; } //打开继电器
- else
- {relay =1;} //关断继电器
- }
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- if(time_20ms%10==0) //定时200ms
- {
- readFlag=1;
- if(time_20ms>=1500) //定时3s
- {
- time_ok =1; //时间到进行蜂鸣器报警
- buzzer =0;
- }
- }
- }
- void UART_Init(void)
- {
- SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
- TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
- TL1 = TH1;
- TR1 = 1; // TR1: timer 1 打开
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- }
- void SendByte(unsigned char dat)//串口发送单字节数据
- {
- unsigned char time_out;
- time_out=0x00;
- SBUF = dat; //将数据放入SBUF中
- while((!TI)&&(time_out<100)) //检测是否发送出去
- {time_out++;DelayUs2x(10);} //未发送出去 进行短暂延时
- TI = 0; //清除ti标志
- }
- void SendStr(unsigned char *s,unsigned char length) //发送定长度字符串
- {
- unsigned char NUM;
- NUM=0x00;
- while(NUM<length) //发送长度对比
- {
- SendByte(*s); //放松单字节数据
- s++; //指针++
- NUM++; //下一个++
- }
- }
- void UART_SER (void) interrupt 4 //串行中断服务程序
- {
- if(RI) //判断是接收中断产生
- {
- RI=0; //标志位清零
- }
- if(TI) //如果是发送标志位,清零
- TI=0;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
Desktop.7z
(3.02 MB, 下载次数: 107)
|