链接:https://pan.baidu.com/s/1mK_tai2IM6hgg3_pV0ZhBQ
提取码:qwf2
硬件设计
系统功能分析
本设计由STC89C52单片机电路+红外避障传感器+HX711称重电路+蜂鸣器报警电路+继电器电路+电源电路组成。
1、避障红外传感器1检测到障碍物,继电器闭合,避障红外传感器检测到障碍物1没有检测到障碍物,继电器断开。
2、如果称重传感器检测到重量超过一定值,或者设备启动时间超过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; //重新赋值 20msTL0=(65536-20000)%256;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开 } void Timer0_isr(void) interrupt 1 {TH0=(65536-20000)/256; //重新赋值 20msTL0=(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.0592MHzTL1 = 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++; //下一个++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128.
文件仅供参考:
.