前言
提示:项目准备需要一定的C语言基础,具体内容请检索51单片机基础学习。
写这一篇推文的主要目的是记录项目实践以及一些创作过程中产生的想法,这个项目的立意是一位网友提供的,如果有侵权,请联系我删除。
车辆是当下出行的一种主流方式,越来越多的朋友拥有自己的爱车。但是也需要注意了解安全知识,比如车内的一氧化碳浓度、温度、湿度等等,一氧化碳浓度达到影响身体机能的程度,是十分危险的,而且,司机在驾驶过程中,容易因为疲劳而不注意车内气体参数变化情况,这个时候车内气体监测就扮演着重要作用。如果仅仅是监测,那么就显得很不智能,所以,计划在这里输出车窗控制信号。
此为总体架构图。
一、设计核心思路和可行性分析
首先,考虑到车窗控制器的成本很高,所以这里使用SG90代替,同时为了最大程度地利用单片机资源(别的控制器类似,这里选择单片机),选择STC89C52RC作为主控芯片。外围硬件都是常用的,所以驱动方面只用到了上拉电阻。采集方面用到了PCF8591AD转换模块。实际操作过程中,去耦合电容最好都加上。
实物图如下:
硬件电路如下:
二、设计流程及各要点简介
重点介绍main函数的逻辑处理:
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include "delay.h"
#include "DHT11.h"
#include "LCD.h"
#include "UART.h"
#include "I2C.h"
#include "AD.h"
#include "key.h"
#include "servos.h"
#define uchar unsigned char
#define uint unsigned int
sbit swt=P2^0; // 运行模式切换
void main ()
{
delay_ms(50);
TMOD=0X21;//根据器件手册选择想要的功能进行设置,我这里同时用了定时器0,1
TH0=(65536-100)/256; //100US
TL0=(65536-100)%256;
ET0= 1;
TR0= 1;//打开计数器
push_val_left = 15; //舵机归中 旋转到90°的地方
action();
LCD_Init();
UART_Init();
while(1)
{
key_mode_scan();
if (mode == 0)
{
change();
}
else
{
work1();
}
}
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
/***************************************************/
void time1()interrupt 1 using 2
{
if(swt == 0) //考虑六角开关,在开关瞬间的物理特性,使用定时器轮询。防止swt波形快速跳变引起的识别错误
{
mode = 0;
}
if(st == 1)
{
TH0=(65536-100)/256; //100US定时
TL0=(65536-100)%256;
pwm_val_left++;
pwm_Servomoto();
}
}
/***************************************************/
///*UART中断服务子函数读取并保存串口数据*/
/***************************************************/
void Usart() interrupt 4
{
uchar receiveData;
receiveData = SBUF;//出去接收到的数据
RI = 0;//清除接收中断标记位
if (receiveData == 0xff)
{
}
else
{
JIAQ[ind++] = SBUF; //把从串口读出的数存到数组
}
if(ind >= 6)
{
ind = 0;
}
TI = 0; //清除发送完成标志位
}
注意:便宜的按键开关可能有机械滞留,所以使用定时器来修改传参,防止切换模式失效;甲醛传感器的串口传输方式有固定格式,需要提前了解哟;舵机的转动模拟开关车窗的场景。
tips
- 电源管理推荐使用5V 15W/20W的电源适配器,电脑USB口驱动功率不够,主要是舵机驱动功率要求大一些。
- 每个元件最好都放一个 100nf 的去耦合电容,防止电压波动导致数据错乱。
- 舵机控制模块,如果你使用的是蓝色的小型舵机,可以不用上拉电阻,因为它的扭矩比较小,需要的输入电流不需要太大,但是如果使用的是黑色金属外壳的舵机MG995,那么最好使用上拉电阻,利用电源供电提高输入电流,驱动大扭矩的舵机。
总结
本次项目实践,使用到的内容基本是本科期间51单片机应用,主要的问题还有元件性能熟悉度不够(比如烟雾报警器与AD模块存在阻抗不匹配的问题,尚在解决,如果解决好了, 这句话就不会出现)、程序设计中的传参选择有些是多余的以及代码冗余度比较大,性能没能利用到最佳。对于推文有疑问或者需要这个工程,请联系QQ邮箱:207393236@qq.com。欢迎交流学习。