基于51单片机的物联网安防系统(Proteus+Python脚本+阿里云)

news2024/9/19 9:50:03

        基于51单片机的物联网安防系统使用Proteus进行仿真,LCD12864进行数据显示,集成了温湿度传感器、烟雾、甲烷传感器,执行器件是风扇,采用L298进行驱动,按键实现用户交互,蜂鸣器报警,红外检测人员状态,同时虚拟串口连接到我们的Python脚本,实现数据上传。

一、硬件设计

1、TLC549

        TLC549是德州仪器(Texas Instruments)推出的一款高性能、低功耗的8位逐次逼近型模拟数字转换器(A/D Converter)。它采用串行接口,与微控制器的连接简单,特别适用于需要节省引脚数量和成本的单片机系统。TLC549以其卓越的转换速度、优秀的分辨率和低功耗特性,成为众多电子设计中的理想选择。

2、LCD12864

        CD12864是一种常见的液晶显示屏(Liquid Crystal Display)模块,具有128列和64行的点阵显示能力,总点数达到8192点。这种显示屏通常采用超扭曲向列(Super Twisted Nematic, STN)技术,适用于显示文本、图形以及简单动画。LCD12864模块通常内置有汉字和ASCII字符的字符库,支持多种接口方式,包括4位或8位并行接口以及2线或3线串行接口,使得它可以轻松地与不同的微控制器或其他数字系统连接。

3、温湿度传感器

        DHT11是一款常用的数字温湿度传感器,它能够提供经过校准的数字信号输出,适用于各种环境监测应用。DHT11传感器包含一个电阻式湿度传感元件和一个NTC温度传感元件,这些元件与一个高性能的8位单片机相连,确保了产品的可靠性和长期稳定性。

二、软件设计

1、TLC549驱动代码

#include "TLC549.h"
#include <REGX52.H>
#include <intrins.H>

sbit DI  = P2^4;
sbit CS  = P2^5;
sbit CLK = P2^6;

sbit DI2  = P2^0;
sbit CS2  = P2^1;
sbit CLK2 = P2^2;

//-----------------------------------------
//            TLC549模数转换
//-----------------------------------------
uchar TLC549_ADC(void)
{
	   uchar n, tmp;

        CS  = 1;                     //CS置高,片选无效
        CLK = 0;

        CS  = 0;                     //CS置低,片选有效,同时DO输出高位
        _nop_();
        _nop_();                     //适当延迟时间1.4us Setup Time

        for(n = 0; n < 8; n++) //串行数据移位输入
        { 
                tmp <<= 1;
                tmp |=  DI;

                CLK = 1;        //0.4us
                _nop_();        //延迟0.1us
                CLK = 0;        //0.4us
        }
        CS = 1;            //CS置高,片选无效
        for(n = 17; n != 0; n--) _nop_();  //下一次转换需要延迟17us
        return (tmp);

}

//-----------------------------------------
//            TLC549模数转换
//-----------------------------------------
uchar TLC549_ADC2(void)
{
	   uchar n, tmp;

        CS2  = 1;                     //CS置高,片选无效
        CLK2 = 0;

        CS2  = 0;                     //CS置低,片选有效,同时DO输出高位
        _nop_();
        _nop_();                     //适当延迟时间1.4us Setup Time

        for(n = 0; n < 8; n++) //串行数据移位输入
        { 
                tmp <<= 1;
                tmp |=  DI2;

                CLK2 = 1;        //0.4us
                _nop_();        //延迟0.1us
                CLK2 = 0;        //0.4us
        }
        CS2 = 1;            //CS置高,片选无效
        for(n = 17; n != 0; n--) _nop_();  //下一次转换需要延迟17us
        return (tmp);

}

2、LCD12864驱动代码

#include "12864.h"
#include "ziku.h"

void Delay_ms(unsigned int xms)  //@11.0592MHz
{
  unsigned int i,j;
	  for(i=xms;i>0;i--)    
		for(j=112;j>0;j--);  
}

static void LCD12864_Write(bit COM_Data,unsigned char  dat)  //12864操作函数 
{
  LCD12864_RS=COM_Data;   //指令 0 数据 1
	LCDData_Pro=dat;        //数据传输至P0扣
	LCD12864_EN=1;          //置1
	_nop_();
	LCD12864_EN=0;          //置0   产生下降沿
}

void LCD12864_Init(void)   //12864初始化
{
	Delay_ms(300);   //等待系统上电稳定
/******************************************************************************/
  LCD12864_EN=1;                       
  LCD12864_RS=1;                       
	LCD12864_CS1=1;  //仿真 0 实物 1   
	LCD12864_CS2=1;  //仿真 0 实物 1   
	Delay_ms(10);
/******************************************************************************/
	LCD12864_Write(LCD12864_COM,0x3f);   //开显示
	/*
	LCD12864_Write(LCD12864_COM,0xc0);   //这段不写也可以正常显示
	LCD12864_Write(LCD12864_COM,0xb8);
	LCD12864_Write(LCD12864_COM,0x40);
	*/
	LCD12864_Write(LCD12864_COM,0x30);   //打开基本指令
	LCD_Clear();                         //清屏
}
/*****************************************************************************
函数功能:清平函数
入口参数:空
说    明:清空整个屏幕数据
版    本:V1.0
时    间:2020年5月9日
*****************************************************************************/
void LCD_Clear(void)
{
	unsigned char  i,j; 
#if LCD_Mode
  LCD12864_CS1=1;   //选中左半屏
	LCD12864_CS2=1;   //选中右半屏
#else 
  LCD12864_CS1=0;   //选中左半屏
	LCD12864_CS2=0;   //选中右半屏
#endif
	LCD12864_Write(LCD12864_COM,0xc0);  //行
  for(i=0;i<8;i++)
	{
	  LCD12864_Write(LCD12864_COM,0xb8+i); //页
		for(j=0;j<64;j++)
		{
		  LCD12864_Write(LCD12864_COM,0x40+j); //列
			LCD12864_Write(LCD12864_DATA,0x00);
			Delay_ms(5);    //方便看清屏效果
		}
	}
}
/*****************************************************************************
函数功能:地址写入函数
入口参数:X,Y
说    明:根据地址自动切换左、右屏
版    本:V1.0
时    间:2020年5月9日
*****************************************************************************/
void LCD12864_X_Y(unsigned char X,unsigned char Y)
{
  Y=Y&0x7f;   //限定范围,列不能超过127     
	X=X&0x07;	  //限定范围,行不能超过7
	if(Y<64)
	{
#if LCD_Mode
		 LCD12864_CS1=1;   //选中左半屏
		 LCD12864_CS2=0;	 //关闭右半屏
#else
		 LCD12864_CS1=0;   //选中左半屏
		 LCD12864_CS2=1;	 //关闭右半屏
#endif
		 LCD12864_Write(LCD12864_COM,0x40+Y);  //选择列基地址+Y 一共64行
		 if(Y==63) Y=64;
	}
	else
	{
#if LCD_Mode
	  LCD12864_CS1=0;   //关闭左半屏
		LCD12864_CS2=1;	  //选中右半屏
#else
    LCD12864_CS1=1;   //关闭左半屏
		LCD12864_CS2=0;	  //选中右半屏
#endif
		Y&=0x3f;
	  LCD12864_Write(LCD12864_COM,0x40+Y);  //选择列基地址+Y   一共64列
	}
	  LCD12864_Write(LCD12864_COM,0xb8+X);  //选择页基地址+X   一共7页  
}
/*****************************************************************************
函数功能:6*16数值写入函数
入口参数:X,Y,num,*dat
说    明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
版    本:V1.5
修改时间:2022年7月10日
新    增:可实现跨左右屏
*****************************************************************************/
void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
{
	unsigned char  i; 
  for(i=0;i<6;i++)                
	{
	  LCD12864_X_Y(X,Y+i);                          //每写一个字节 更新一次Y 防止不能出现跨屏
		LCD12864_Write(LCD12864_DATA,dat[num*12+i]);  //写上半字 共写6个字节
	} 
  for(i=0;i<6;i++) 
	{
	  LCD12864_X_Y(X+1,Y+i);                         //同上
		LCD12864_Write(LCD12864_DATA,dat[num*12+6+i]); //写下半字 共写6个字节
	}
}
/*****************************************************************************
函数功能:变量显示函数
入口参数:X,Y,num,len
说    明:在第X行的第Y个位置显示len个num数值
版    本:V1.2
修改时间:2022年7月10日
新    增:自动计算变量长度 最大计数99999
*****************************************************************************/
void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num)
{
	unsigned char i; 
  unsigned char Len;	
  unsigned char Dis[5];
	unsigned char Buf[5];
	
	sprintf(Buf,"%d",num);   //将数值转换成字符串
	Len=strlen(Buf);         //计算字符串长度
	
  if(Len>4)Dis[Len-5]=num/10000     ;    //若数据更大 按照规律写即可
  if(Len>3)Dis[Len-4]=num%10000/1000;
  if(Len>2)Dis[Len-3]=num%1000/100  ;
  if(Len>1)Dis[Len-2]=num%100/10    ;
  if(Len>0)Dis[Len-1]=num%10        ;
	
  for(i=0;i<Len;i++) LCD12864_Write_Number(X,Y+(i*6),Dis[i],Num);
}

/*****************************************************************************
函数功能:12*16汉字写入函数
入口参数:X,Y,num,*dat
说    明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
版    本:V1.5
修改时间:2022年7月10日
新    增:左右跨屏
*****************************************************************************/
void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
{
	unsigned char  i;
  for(i=0;i<12;i++) 
	{
		LCD12864_X_Y(X,Y+i);                         //跨屏重要函数  勿删除
		LCD12864_Write(LCD12864_DATA,dat[num*24+i]); //写上半字 共写12个字节
	}
  for(i=0;i<12;i++) 
	{
	  LCD12864_X_Y(X+1,Y+i);                          //同上
		LCD12864_Write(LCD12864_DATA,dat[num*24+12+i]); //写下半字 共写12个字节
	}
}
/*****************************************************************************
函数功能:英文字母显示函数
入口参数:X,Y,*dat
说    明:X_横坐标 Y_纵坐标 *dat_需要显示的英文字母
版    本:V1.0
修改时间:2022年7月10日
注    明:带字库索引功能
*****************************************************************************/
void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat)
{
	unsigned char i,j;
	unsigned char Len;
	
	Len=strlen(dat);        //获取数据长度
		
  for(j=0;j<Len;j++)      
	{
	  for(i=0; ;i++)  if(English_Buf[i]==*dat) {dat++; break;}  //查找字库索引列表
	  LCD12864_Write_Number(X,Y+(j*6),i,English);               //写数据
	}
}
///*****************************************************************************
//函数功能:汉字显示函数
//入口参数:X,Y,*dat
//说    明:X_横坐标 Y_纵坐标 *dat_需要显示的汉字
//版    本:V1.0
//修改时间:2022年7月10日
//注    明:带字库索引功能

//注意:存在Bug 暂未修复
//*****************************************************************************/
//void LCD12864_Write_String(unsigned char X,unsigned char Y,unsigned char *dat)
//{
//	unsigned char i,j;
//	unsigned char Len;
//	
//	Len=(strlen(dat))/2;  //1个汉字2个字节  所以要除以2
//	
//   for(j=0;j<Len;j++) 
//	{
//	  for(i=0; ;i++)  if(Chinese_Buf[i]==*dat) {dat++; break;}   //存在Bug不能显示第4个汉字
//	  LCD12864_Write_Chinese(X,Y+(j*12),i,Chinese);
//	}
//}

3、DHT11驱动代码

#include "DHT11.h"

sbit Data=P3^2; //数据线
uchar rec_dat[9]; //储存数据
void DHT11_delay_us(uchar n)
{
    while(--n);
}
void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

/*
主机(单片机)发送起始信号:
1.主机先拉高data。
2.拉低data延迟18ms。
3.拉高data并延迟等待(通过此操作将单片机引脚设置为输入)。
*/
void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(25);   //拉低延时18ms以上
   Data=1;
   DHT11_delay_us(30);   //拉高 延时 20~40us,取中间值 30us
}

/*------------------------------------------------
              接收八位二进制
------------------------------------------------*/
uchar DHT11_rec_byte()      //接收一个字节
{
  unsigned char i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {          
      while(Data);   //等待进入低电平
      while(!Data);   //等待50us低电平过去
      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
      dat<<=1;//移位(低位补零)使正确接收8位数据,数据为0时直接移位
      if(Data==1)    //数据为1时,使dat加1来接收数据1
        dat+=1;
      while(Data);  //等待数据线拉低    
   }  
    return dat;
}


/*------------------------------------------------
              接收40bit数据(具体的温湿度)
1.主机先把data线拉高(io设置为输入)。
2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
  从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
3.继续重复上述1,2步骤累计40次。
------------------------------------------------*/
uchar T_H;
int tem, hum;
void DHT11_receive()      //接收40位的数据
{
    uchar R_H,R_L,T_L,RH,RL,TH,TL,revise; 
    DHT11_start();//发送起始信号:
    if(Data==0)
    {
        while(Data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时80us
			
        R_H=DHT11_rec_byte();    //接收湿度高八位  
        R_L=DHT11_rec_byte();    //接收湿度低八位  
        T_H=DHT11_rec_byte();    //接收温度高八位  
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位

        DHT11_delay_us(25);    //结束

        if((R_H+R_L+T_H+T_L)==revise)      //最后一字节为校验位,校验是否正确
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        } 
		
		tem	= TH;
		hum = RH;
        /*数据处理,转换为字符,方便显示*/
			  //湿度
		rec_dat[0]=(RH/10);
        rec_dat[1]=(RH%10);
				rec_dat[2]=' ';
				rec_dat[3]=' ';
				
				//温度
        rec_dat[4]=(TH/10);
        rec_dat[5]=(TH%10); 
		    rec_dat[6]=' ';
			
    }
}

三、项目演示

       (1) 首先运行仿真的Python脚本,可以看到如下:

此时设备已经在线

(2)按下布防按键,布防指示灯亮起,此时如果红外检测到人,报警灯亮起,否则报警灯熄灭,如下:

(3)按下调整切换,调整位置的数据持续闪烁,此时按加减可以操作数据,如下:

(4)当湿度超过阈值的时候,风扇转动,进行降湿,当Mq02超过阈值时,表示发生了火灾,此时蜂鸣器进行报警。

(5)同时,数据会上传到阿里云平台,如图:

四、项目总结

        本次项目使用温湿度、烟雾、甲烷、红外传感器,结合阿里云物联网平台设计了一个安防系统,系统通过我们的python脚本,利用电脑的网络资源,将仿真数据上传到阿里云平台,实现仿真上实现物联网安防系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2146042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将示波器输出的电压数据转换为频域数据,五句代码解决问题,详细分析五句代码

这四句代码是关于对电压数据&#xff08;voltage&#xff09;进行快速傅里叶变换&#xff08;FFT&#xff09;&#xff0c;并生成相应的频率向量&#xff0c;提取并计算频谱的幅度&#xff0c;同时只保留正频率部分。 五句代码如下图所示&#xff1a; % 计算采样频率dt mean(…

Python | Leetcode Python题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; class Solution:def numberOfArithmeticSlices(self, nums: List[int]) -> int:n len(nums)if n 1:return 0d, t nums[0] - nums[1], 0ans 0# 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for i in range(2, n):i…

Rust GUI框架 tauri V2 项目创建

文章目录 Tauri 2.0创建应用文档移动应用开发 Android 前置要求移动应用开发 iOS 前置要求参考资料 Tauri 2.0 Tauri 是一个构建适用于所有主流桌面和移动平台的轻快二进制文件的框架。开发者们可以集成任何用于创建用户界面的可以被编译成 HTML、JavaScript 和 CSS 的前端框架…

电源电压输入输出保护电路

输入正负极接反芯片损坏 解决方案&#xff1a;添加防反接电路(蓝色虚线框中电路)。 Q1:VDS≥1.5*VINMAX&#xff1b; DZ1:VDZ110V&#xff0c;500mW&#xff1b; R3:20K&#xff1b; R4:20K。 输入尖峰电压损坏芯片 ➢ 解决方案一&#xff1a;输入添加瞬态尖峰电压吸收电路…

【中国留学网-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

如何兼容性地开发响应式站点——WEB开发系列40

CSS在不同浏览器的支持历史中&#xff0c;有过多次变革。尽管现代浏览器逐步趋向一致&#xff0c;但仍有一些较旧的浏览器广泛使用&#xff0c;特别是在某些地区或特定环境中。 一、浏览器生态&#xff1a;了解你的网站用户 在设计和开发站点之前&#xff0c;了解目标用户所使…

多旅行商问题:鹈鹕优化算法(Pelican Optimization Algorithm,POA)求解多仓库多旅行商问题MD-MTSP(提供Matlab代码)

一、鹈鹕优化算法 鹈鹕优化算法(Pelican Optimization Algorithm,POA)由Pavel Trojovsk和Mohammad Dehghani 于2022年提出&#xff0c;该算法模拟了鹈鹕在狩猎过程中的自然行为。 鹈鹕很大&#xff0c;喙很长&#xff0c;喉咙里有一个大袋子&#xff0c;用来捕捉和吞咽猎物。…

记录一下ElementUI 3 在浏览器导入, table表格显示问题

当时问题忘了截图, 现在通过文字记录一下问题 我直接在html了引入 vue3 和 ElementUI 3 , 使用了table组件, 但是表格的td 总是只显示一列, 问题是我的 el-table-column 标签 没有结束标签 , 在vue文件模块化里写不需要结束标签, 在浏览器里无法直接识别出来, 所以他是渲染了第…

鸿蒙开发之ArkUI 界面篇 十 边框border

border语法格式如下&#xff1a; 要实现如下效果&#xff1a; 代码如下&#xff1a; Entry Component struct IndexTest {State message: string IndexTest;build() {Column(){Text(border实现).fontSize(30) .border({width:4,color:Color.Red,style:BorderStyle.Solid,ra…

进程的重要函数

进程的重要函数: fork函数 了解fork函数 通过调用fork()函数&#xff0c;则会产生一个新的进程。调用fork()函数的进程叫做 父进程&#xff0c;产生的新进程则为子进程。 其编码过程: 1.函数功能: 函数头文件 #include <sys/types.h> #include <unistd.h> 函数…

【FFT】信号处理——快速傅里叶变换【通俗易懂】

快速傅里叶变换&#xff08;Fast Fourier Transform, FFT&#xff09;是一种用于将信号从时间域转换到频率域的算法。 傅里叶变换的核心思想是&#xff1a;任何周期性信号都可以分解成多个不同频率的正弦波或余弦波的叠加。 简单来说&#xff0c;FFT可以帮助我们理解一个信号…

使用 Internet 共享 (ICS) 方式分配ip

设备A使用dhcp的情况下&#xff0c;通过设备B分配ip并共享网络的方法。 启用网络共享&#xff08;ICS&#xff09;并配置 NAT Windows 自带的 Internet Connection Sharing (ICS) 功能可以简化 NAT 设置&#xff0c;允许共享一个网络连接给其他设备。 打开网络设置&#xff1…

力扣之1075.项目员工I

文章目录 1. 1075.项目员工I1.1 题干1.2 准备数据1.3 解法1.4 结果截图 1. 1075.项目员工I 1.1 题干 项目表 Project&#xff1a; -------------------- | Column Name | Type | -------------------- | project_id | int | | employee_id | int | -------------------- 主键…

『小白可入』VSPD虚拟串口工具——从此告别硬件串口调试

一、下载VSPD工具 工具已上传至百度云&#xff0c;在以下地址下载&#xff1a; VSPD下载链接&#xff1a;通过百度网盘分享的文件&#xff1a;我的资源 链接&#xff1a;https://pan.baidu.com/s/1x2eoQYg6erqs__CQgT5j6Q?pwd4211 提取码&#xff1a;4211 二、安装 1.解压后的…

2024年Apple Search Ads(简称:苹果ASA):开展有效活动的秘诀

当谈到为应用程序启动广告活动时&#xff0c;许多人会立即想到Android。然而&#xff0c;这并不总是最好的选择&#xff0c;因为iOS设备在多个国家和地区占据市场主导地位。在这些地区&#xff0c;定位ios用户可以带来更大的成功。 您可以通过各种渠道在iOS上投放广告&#xff…

最低成本的游戏串流方案分享 如何自己打造云电脑?

今天教大家如何最低成本实现串流 出门在外也可以随时随地游玩端游大作 硬件准备&#xff1a;一台电脑 手机/平板一台 软件&#xff1a;Gameviewer远程 为啥不用moonlight等其他软件呢 因为设置公网穿透等复杂操作对小白来说不太友好 而GameViewer从安装到使用仅需一键 对比同类…

PostgreSQL技术内幕10:PostgreSQL事务原理解析-日志模块介绍

文章目录 0.简介1.PG日志介绍2.事务日志介绍3.WAL分析3.1 WAL概述3.2 WAL设计考虑3.2.1 存储格式3.2.2 实现方式3.2.3 数据完整性校验3.3 check ponit 4.事务提交日志&#xff08;CLOG&#xff09;4.1 clog存储使用介绍4.2 slru缓冲池并发控制 0.简介 本文将延续上一篇文章内容…

好用的网页翻译插件

软件介绍 「火山翻译&#xff0c;开箱即用免配置&#xff0c;完全免费无广告&#xff0c;开发的多语言翻译插件&#xff0c;基本涵盖众多小语种及国际通用语言的翻译&#xff0c;支持网页一键翻译、划词翻译、英语词典、生词本、吐司弹词记忆等丰富能力。 下载方式 请看文章…

【AprilTag】视觉定位实战 | 使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Matlab进行频率切片小波变换

Matlab进行频率切片小波变换(FSWT)源代码&#xff0c;将一维信号生成时频图。 输入信号可以是任何一维信号&#xff0c;心电信号、脑电信号、地震波形、电流电压数据等。 相比连续小波变换(CWT)&#xff0c;频率切片小波变换(Frequency Slice Wavelet Transform,FSWT)是一种更具…