产品概述

光标 单片机 单片机控制的防盗系统设计

小编 2025-07-02 产品概述 23 0

单片机控制的防盗系统设计

方案设计

防盗报警系统是以51单片机为核心构成防盗报警系统,当热释电红外传感器检测到人体时,LED灯发光,单片机接收到信号后,通过外接报警电路立即发出报警信号,达到预期报警效果。电源模块供电,时钟模块设定好时间和日期,通过LCD1602液晶显示器显示时间和日期。

系统硬件与软件设计

(一)报警电路设计

报警电路采用的是蜂鸣器报警,当红外感应源在接收到人体红外辐射时后续电路经检测处理后就能产生报警信号。接收到报警信号,LED灯变亮,蜂鸣器鸣叫报警,当报警延迟10s一段时间后自动解除,也可以人工手动解除报警信号。当警报解除,复位电路复位系统,或报警10s,自动取消报警定时器。如果人体进入检测区域,它不会移动,则温度没有变化,传感器也没有信号输出,51单片机没有接收到信号,LED灯变暗,蜂鸣器不鸣叫,不会发生报警现象。

报警电路原理图如图2.1所示,蜂鸣器用一个三极管Q4来驱动。单片机引脚P1.1接三极管的基极输入端。当P1.1输出高电平1时,三级管导通,蜂鸣器两端获得约+5V的电压而鸣叫;当P1.1输出低电平0时,三级管截止,蜂鸣器停止发生。

(二)显示模块设计

LCD1602液晶显示器的显示原理:字符的显示:在LCD上显示字符很复杂,因为一个字符由6×8或8×8点阵组成。它必须找到并显示与屏幕上某些位置相对应的显示RAM区域的8个字节,并创建每个字。该部分的不同位为“1”,其余为“0”,“1”亮起,“0”熄灭。这形成了一个标志。但是,由于字符发生器的控制,显示字符比较容易,因此控制器可以根据LCD上显示的行数和列数以及文本模式下每行的列数来操作,以找到相应的显示RAM。设置地址,光标,发送字符的代码。

(三)单片机控制的防盗系统总体设计

单片机控制的防盗系统总体设计是由AT89C52控制DS1302芯片,通过显示模块LCD1602液晶显示器显示日期和时间。有热释电红外传感器,LED灯,按键,蜂鸣器和其他一些微控制器外设应用,以及微控制器复位电路。其中D1是绩效指标,从P10口输入信号,P11口和P12口输出信号。当热释电红外传感器接收到信号,P10口接收到信号为高电平时,P12口为高电平,LED灯亮,同时P11口也为高电平,蜂鸣器鸣叫,达到报警效果。当热释电红外传感器没有接收到信号,接收到信号为低电平,P12口为低电平,LED灯灭,同时P11口也为低电平,蜂鸣器不发出鸣叫就不会报警,系统不反应继续检测。

单片机控制的防盗系统总体设计实物图如图2.4所示。它是由AT89C52控制时钟模块DS1302芯片,通过显示模块LCD1602液晶显示器显示日期和时间。热释电红外传感器检测到人体时,LED灯发光,由于人体温度和环境温度之间的差异,约10微米。通过菲涅耳透视滤光器放大从人体发射的红外线辐射的m微米,然后集中在红外线感应源上。当红外感应源接收到人体的红外辐射时会失去电荷平衡。释放电荷,然后产生一个高电平和高电平输出到外围电路,报警电路检测和处理可以产生一个报警信号,蜂鸣器发出声音以达到预期的报警效果。

(四)防盗报警系统程序设计流程

当人体感应器开始检测到信号,这意味着有人进入检测区域。51单片机内部处理后,51芯片微控制器外围电路蜂鸣器被激活以启动警报。闹钟在10秒后自动停止。然后程序开始循环。它检查是否有下一个触发信号。等待警报。让闹钟继续工作。当人体感应器开始检测不到信号时,系统不反应,继续检测。

测试结果及分析

首先对上面制作的电路板按照原理图用数字万用表进行逐一测试排除虚焊,短路等情况同时观察极性原件是否焊反,然后采用接触式上电的方法对电路进行上电测试,上电后用手触摸芯片表面看是否发热,一旦有发热的情况立即关闭电源,然后排查解决,待触摸测试结束后对电路板进行较长时间的供电,与此同时在单片机里面装入预先设定好的功能测试程序对电路进行功能测试,一直到电路板各项功能都达到预期为止。下面是LCD1602液晶显示器和热释电红外传感器的测试结果。

当人体进入检测区域时,LED灯发光。由于人体温度和环境温度之间的差距,约10微米。从人体发出的红外辐射被菲涅耳透视滤光器放大,然后会聚到红外传感器源。红外传感器源接收人体的红外光束。当辐射损失时,电荷平衡失去,电荷输出到外部,然后产生高电平,高电平输出到外部电路。报警电路在检测和处理后可能会产生报警信号。时钟模块设定好时间,LCD1602液晶显示器显示时间和日期,达到预期报警效果。

当无人进入检测区,温度没有变化,当红外传感器没有接收到来自人体的红外辐射时,它将保持电荷平衡,并且不会将电荷传送到外部,然后产生低电平并向外围电路输出低电平。传感器也没有信号输出,LED灯变暗,报警电路检测处理后就没有产生报警信号。时钟模块设定好时间,LCD1602液晶显示器显示时间和日期,达到预期报警效果。

STM32F0单片机快速入门三 MCU启动过程

1. MCU 代码如何启动

首先我们需要澄清一个问题,什么是 Startup Code,什么是 Bootloader?因为总看到有同学混用这两个概念。

Bootloader 可以译为引导程序。早期的单片机是没有 Bootloader 这种概念的。如大家熟悉的 MCS51,最初芯片内是不能存储代码的,需要外挂EPROM,就是下面这种带个小玻璃窗的存储器。擦除 EPROM 中的代码需要用紫外线照射几分钟才行。

后来出现了 Flash 这种可电擦写的存储器,并集成在了单片机内部。但出厂的时候单片机的程序存储区仍然是空白的,没有任何代码。用户编译程序后,下载到单片机后才能运行。那么在产品发给用户后,如果发现有Bug怎么办呢?就得用编程器把新代码重新下载一次。这实在是有点儿麻烦,特别是如果客户距离很远的话。于是有聪明的程序猿想了一个办法,写一小段特殊的代码放在程序里,这段代码可以通过一定方式,比如用按键触发进入运行,它可以通过串口(早期的 PC 串口是标配)接收新的代码并写入Flash,从而在没有硬件编程器的情况下也能完成代码的更新。

程序猿们也是现代历史前进的重要推动力啊!

后来,有芯片厂商把这种代码在出厂时就固化在芯片里,极大的方便了代码下载和程序更新。STM32F030内部就固化了Bootloader。当我们把一个引脚 BOOT0 拉高的同时,重新给芯片上电或复位,就会触发Boootloader进入运行。此时我们通过单片机的串口就可以把新程序发送给单片机,发送完后把 BOOT0 拉低,再复位单片机,新程序就会运行起来。

Startup Code 可以译为启动代码。单片机上电或复位后最先执行的一段代码。一般主要会完成堆栈指针的设置,复位向量的获取和加载,然后初始化变量,最后跳转到用户代码。在详细看启动代码之前,我们先看一下 STM32F030 的内存映射。

2. STM32F030内存映射(Memory Map)

下面是 STM32F030 的内存映射,其它芯片会因为 Flash,SRAM 空间大小不同而略有不同。

因为是32位机,所以可寻址从 0x0000_0000 到 0xFFFF_FFFF 的总共 4G 空间。

这是采用32位机的好处,地址空间足够用。不像8位或16位机,很容易出现地址空间不够用,动不动就需要用 Page 来间接寻址。

我们从低地址到高地址逐段看一下:

0x0000 0000 Virtual memory

这段地址空间,会因为不同的 BOOT 模式而映射到不同的物理内存。

当芯片复位,或从 Standby 低功耗模式唤醒时:

如果引脚 BOOT0 是被拉低的,将映射到 Flash memory。这是最常用的代码运行模式;

如果引脚 BOOT0 是被拉高的,且nBOOT1为 1 ,将映射到 System memory。进入bootloader模式;

如果引脚 BOOT0 是被拉高的,且nBOOT1为 0 ,将映射到 SRAM。

注:nBOOT1 为Flash寄存器中的一位,用户何以设置。

0x0800 0000 Flash memory

存放用户代码

0x1FFF EC00 System memory

存放 bootloader, 片内集成温度传感器的校正数据,和片内集成电压参考的校正数据

这些代码和数据是在工厂固化好的。

0x2000 0000 SRAM

存放用户变量,堆(Heap)和栈(Stack)。也可以把代码加载到 SRAM 运行。

0x4000 0000 Pheriperals

芯片集成的外设,如 USART, SPI, GPIO等的寄存器地址在这一区域。

0xE000 0000 Cortex-M0 internal pheriperals

M0内核的外设映射到此区域。如 systick (System Tick),NVIC,Debug Registers。这些寄存器在芯片手册里是查不到的,需要到 ARM 的手册里查找。

3. 启动代码(Startup Code)

我们还是以下面这个最简单的GPIO翻转代码为例:

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\

Examples\GPIO\GPIO_IOToggle\MDK-ARM\Project.uvprojx

把此工程下载到单片机后,用调试器观察下面两个地址的内容:

我们会发现0x0000_0000开始的区域, 和0x0800_0000开始的区域,内容完全相同。这说明 Flash 区的内容映射到了 0x0000_0000起始的这一段地址区域。

注意STM32F030使用的是小端模式(Litlle Edian)。

不同于 MCS51 在 0x0000 放的是复位向量,STM32F030 还有其它 ARM 芯片在零地址存放的是初始堆栈指针地址。

0x0000 0000: (0x2000 0428) 初始堆栈指针

0x0000 0004: (0x0800 00C9) 复位向量,上电或复位后最先加载入PC

注:单片机上电或复位后,堆栈指针初始化和 PC 初始值的加载总是从地址 0x0000_0000,0x0000_0004获取。在上面这种用户模式下,实际是从 Flash 区的 0x0800_0000,0x0800_0004 获取的。

我们可以通过调试器观察一下芯片复位后 M0 内核的寄存器:

细心的同学这时可能发现了一个问题。

堆栈指针 SP 的内容和前面存储器中的内容是对的上的。但是 PC 里的内容好像对不上啊?PC 里的值是 0x0800_00C8,存储器里明明是 0x0800_00C9 啊!

这里牵涉到了 ARM 体系里的两种工作状态 ARM 和 Thumb。ARM 状态下执行32位指令,Thumb状态下执行16位指令。那么如何在这两者之间切换呢,一个方法就是靠跳转地址的最低位(Bit0), 当 Bit0 设为 1 时进入 Thumb 状态,当 Bit0 设为 0 时进入 ARM 状态。

对于单片机来说,16位的 Thumb 指令就足够了,而且16位指令比32位指令能节省存储器空间。所以 M0 内核只支持 Thumb 指令。

到这里我们就可以理解复位向量为什么是 0x0800_00C9 了。

接下来我们来看复位向量 0x0800_00C8 指向的第一条指令:

单片机将要执行的第一条指令 0x4804,这是什么意思呢?

先说结论:它就是下图中,单片机复位后光标指向的这条指令:

LDR R0, =SystemInit

在这里详细解释一下 0x4804 这条指令:

它对应的机器码是 0100100000000100

Bit15 to Bit11 (01001)为LDR(literal)指令,既从PC偏移地址取数据送至寄存器Rt。

Bit10 to Bit8 (000)表明目的寄存器Rt为 R0

Bit7 to Bit0 (00000100)表明相对于 PC 的偏移量为 0b10000,既0x10。

注意PC的值是当前地址+4。

那么从 0x080000C8 + 0x4 + 0x10 = 0x080000DC 取出数据 0x0800092D 送至寄存器 R0。此地址是 SystemInit( )函数的地址。下一条语句 BLX R0 就是调用此系统初始化函数。

SystemInit( ) 这个函数在 system_stm32f0xx.c 这个文件里,主要完成系统时钟的初始化。可以点进去看一下具体的内容。

函数 SystemInit( ) 执行完之后,程序跳转回来,取得 __main( ) 函数的地址,跳转到 __main() 函数执行。需要注意,这个函数不是我们用户代码里的 main( ) 函数。

__main() 函数是 Keil 的库提供的,我们看不到代码,它主要完成变量的初始化。这里不用太纠结,如果想进一步深究可以看一下 ARM Compiler User Guide 的 Reset and initialization 这一节。

__main() 函数执行完,基本工作就做完了,这才跳转到用户代码的 main( ) 函数。

参考资料:

STM32F030 Datasheet

STM32F030 Reference Manual

ARM Compiler User Guide

ARM®v6-M Architecture Reference Manual

相关问答

单片机 怎么打开液晶屏的 光标 ?

安装光标驱动程序,用鼠标连接即可。安装光标驱动程序,用鼠标连接即可。

求用C写一个61 单片机 8位单独按键程序,每个键控制一个发光二...

请问我的按键不是特别灵敏,有的时候需要按两次才出现字母,而且,打快了,常掉字母,而且光标老跑。840浏览6回答虚拟按键和物理按键的具体区别是什么?3665浏...

有初学者学习python实用的编辑器吗?

最近看到学习群里面的小伙伴,对于PythonIDE都比较纠结,希望找到一些适合自己的、Python开发工具。小编向企业级大佬请教之后,给大家分享几款Python开发工具,...

什么是微机输入设备?

微机一般指的就是电脑有可能还是单片机系统输入设备是人向计算机输入信息的设备,常用的输入设备有:(1)键盘---人向计算机输入信息最基本的设备;(2)鼠标器-...

先科电视机按键锁怎么办锁?-ZOL问答

使用频道加减键来移动光标至“童锁”,然后使用音量加减键将童锁设置为“关”,即关闭童锁功能。2.按屏显键解锁:按下遥控器上的“DISPLAY”(频道号显示)键并持...

proteus中wireslabel怎么用_作业帮

[回答]在连线(引脚)上可以添加标号,在整个电路图中只要是相同标号的线路即可视为相连,使用方法:点击LBL按钮然后移动到相应线路上出现X型光标点击更改标号...

FBT−9全自动比表面积测定仪水位怎么调整?

FBT-9型全自动比表面积测定仪使用说明书FBT-9型全自动比表面积测定仪主要特点:自动化操作,操作界面人性化,简单易学;通过采用合资或进口零配件,大大提高了...

求电视机解锁方法?-设计本有问必答

3).密码解锁:按“LOCK”键或童锁键然后输入4位您设定的密码按P/-来移动光标移动到“童锁”字样处,按V/-键将童锁设置为“关”,即将童锁功能关闭。...

stc500e5按键说明?

1STC500E5有多个按键2STC500E5的按键包括:开机/关机键、复位键、扫描键、输入切换键、长扫描键、保存键、调整键、静音键等,每个按键都有不同的功能作用。3...

大佬们 在线等 比较靠谱的电缆故障测试仪怎么样,电缆故障...

[回答]电缆故障智能测试仪采用电子测量,综合了脉冲反射原理,智能电桥测试原理和的单片机。实用于多种市话电缆、高频电缆、同轴电缆的断线、混线、地气、...

猜你喜欢