硬件设计
链接:https://pan.baidu.com/s/1AqFk5gsMtW0Xf5shs_FLOw
提取码:styd
本系统由STC89C52单片机电路+1路按键点火模拟电路+路黄色指示灯电路+HX711称重传感器电路+1位拨动开关电路+1路绿色指示灯电路+1路红灯指示电路+语音模块ISD1820电路+电源电路。
具体功能:
1、点火按键按下后,黄色指示灯亮,表示点火;再按一次,黄色指示灯灭,表示熄火。
2、点火后,如果压力传感器没检测到压力,无任何操作;
3、点火后,如果检测到压力超过一定值,且拨动开关关上(系好了安全带),这时绿色指示灯闪烁。
如果开关拨下(没系好了安全带),这时红色指示灯闪烁报警,同时语音提示:“请系好安全带”。直到安全带系好后,语音停止同时红色指示灯灭,绿色指示灯闪烁。
4、不点火,上述功能无响应,必须点火有效。
原理图:
程序设计
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "delay.h"
#include "hx711.h"
#include "1602.h"
sbit key_dh=P1^0; //接口定义
sbit LED_R=P1^1;
sbit LED_Y=P1^2;
sbit LED_G=P1^3;
sbit CTRL_YY=P1^4;
sbit Key_aq=P1^5;
unsigned long time_20ms=0; // 系统定时计数
unsigned char Error1Num; //重量异常计数
unsigned char ReadFlag = 0; //读取标志
unsigned char WeithFlag = 0; //称重标志
unsigned char rekey_dh = 0; //按键防止重复
unsigned char blankFlag = 0; //指示灯是否闪烁
unsigned char reportYy = 0; //语音上报
bit startFlag =0; //点火标志
xdata long Weight_Shiwu=0; //实际重量
xdata unsigned long Weight_Maopi=0; //毛坯重量
void Init_Timer0(void); //函数声明
void main (void)
{
Init_Timer0(); //定时器0初始化
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
DelayMs(250); //延时有助于稳定
Weight_Maopi = HX711_Read(); //读取去皮重量
DelayMs(20);
Weight_Maopi = HX711_Read();
DelayMs(250);
LED_Y = 1; //初始化完成关闭灯
LED_G = 1;
LED_R = 1 ;
startFlag =0;
LCD_Write_String(0,0,"My Designer ");//显示
LCD_Write_String(0,1,"Fasten Seatbelt!");//显示
while (1) //主循环
{
if(key_dh == 0) //点火
{
if(rekey_dh == 0) //点火防止重复
{
DelayMs(10);
}
}
else
{rekey_dh = 0;}
if(ReadFlag==1) //读取称
{
ReadFlag=0;
Weight_Shiwu = HX711_Read(); //读取实物重量
if(Weight_Shiwu > 0) //称重大于零清空
{
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/430); //g计算实物的实际重量
else
{
Error1Num++;
if(Error1Num>=2) //有人坐下
{
WeithFlag=1;
if(startFlag==1) //点火后
{
if(Key_aq == 0) //安全带未系上
{
blankFlag = 1 ; reportYy =0; CTRL_YY =1 ; //红灯闪烁标志
LCD_Write_String(0,1,"Sit Ok ! ");//显示
}
else
{
blankFlag = 2 ; //绿灯闪烁只是
LCD_Write_String(0,1,"Fasten Seatbelt!");//显示
reportYy = 1;
}
}
else
{
blankFlag =0 ; //灯不闪烁
reportYy =0; //关闭语音
CTRL_YY =1 ;
}
}
}
}
else
{Error1Num=0;} //清空异常计数
}
}
}
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)
{
ReadFlag=1;
if(blankFlag == 1) //绿灯闪烁 红灯熄灭
{LED_G = !LED_G;LED_R = 1;}
else if(blankFlag == 2) //红灯闪烁 绿灯熄灭
{LED_R = !LED_R;LED_G = 1; CTRL_YY =!CTRL_YY;}
else
.
文件仅供参考:
.