【IoT】产品模型:智能设备之火情侦查智能车

简介: 智能车

本文为笔者团队协作作品,集外观设计、无线音频、无线视频传输技术,无线视频传输具有原创性,仅此一例,现共享方案设计参考。

1.引言
1.1研究本课题的目的和意义

在消防现场,人身安全是一个很大的问题。本项目致力于研究一种实用的能替代救援人员进入易燃易爆、有毒有害、缺氧等室内外危险灾害现场进行探测的火情侦察智能车,解决有关消防人员人身安全、数据采集量不足和不能实时反馈等问题,并将采集的图像信息及数据实时处理和实时无线传输。

通过查看消防小车发送回来的图像信号以及其他数据信息,消防人员可以了解到火灾现场环境。消防人员可以根据这些信息决定是否需要进入火灾现场和采取相应的措施。小车实现了用于消防现场侦察的目的,能代替人进入火灾现场采集火灾现场数据和察看现场情况,人身安全得到了保障,相信通过不断测试可以实现更高的实用价值。

本设计结合实际环境恶劣的特点,通过摄像头采集现场图像数据,借助无线模块将图像数据传送至手持终端显示,通过FM模块采集现场声音数据,并使声音在终端实时播放同时可以与现场对话,通过温度传感器和超声波等模块采集现场基本数据,借助无线模块将数据传送至终端显示,从而可以通过手持终端全面实时了解现场情况。
1.2研究结果:

系统主要由中低档ARM处理器STM32、STC单片机、FM模块、TFT彩屏、1602显示液晶、短距离无线数传模块NRF905和NRF24L01等构成。可实现实时图像数据传输、语音对讲和环境数据传输的功能。本系统可以满足恶劣环境下数据搜集,如果换用更大功率的无线模块有效距离可以达百米。图像部分通过CMOS摄像头OV7670采集现场图像并进行简单压缩处理,在STM32微处理器的控制下,通过nRF24L01无线发送;终端将接收到的整帧无线数据先暂存于外部SRAM,再将数据送入TFT彩屏显示。语音部分采用FM立体声收发芯片RDA5820,终端采用1602液晶实现友好人机交互界面,通过nRF905控制车体部分语音收发模式的转换。车体采用铝合金外观设计并安装温度传感器和超声波等模块,可以实现一定的防火和现场部分数据的采集功能,接收端可以在液晶上实时显示现场温度等信息。本装置灵活性强、实用性强、重量轻、易携带,可以广泛的应用在环境监控、数据采集以及消防等领域。

2.研究方法或过程
2.1系统整体结构

此系统主要由中低档ARM处理器STM32、STC单片机、FM模块、LCD彩屏、1602显示液晶、短距离无线数传模块NRF905和NRF24L01等构成。图像数据由OV7670摄像头模组采集,通过NRF24L01模块无线传输至手持终端,并在LCD彩屏上实时显示;语音采集由FM模块RDA5820实现,通过调频广播方式将语音传输至终端;现场温度等数据由相应模块采集,通过NRF905传输至终端并在1602液晶上实时显示。系统的总体框图如图2-1所示。

图2-1系统总体框图

2.2 图形传输系统

图形传输系统是用ST公司的ARM系列芯片STM32做为发射和接收端的主控。图形数据由ov7670采集,考虑到摄像头的数据采集的速度远大于无线的传输速度,先把一帧的数据暂存在帧缓存芯片AL433B中,然后由STM32控制有无线模块nRF24l01发往接收端;接收端接收到数据后先暂存于IS61WV25616BLL中,接收完一整帧后由STM32控制在TFT液晶屏上显示。

图形传输系统框图如图2-2所示:

发送端:

接收端:

2.2.1 图形传输系统主控芯片STM32的选择和论证

主控芯片的概述

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;

本次设计中接收端选用的是stm32系列中“增强型”的STM32F103 ZET6,他是STM32系列中功能最全引脚最多的一款。我们主要是应用了它两个FSMC接口和SPI接口。因为接收端没有用到FSMC接口,用到的I/O接口也相对较少,我们使用的是STM32系列里面的100引脚的STM32F103VET6,主要运用的是他的快速处理速度和快速的SPI接口。

FSMC(FlexibleStatic Memory Controller,可变静态存储控制器)是STM32系列采用一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。STM32通过FSMC可以与SRAM、ROM、PSRAM、NOR Flash和NANDFlash存储器的引脚直接相连,而且支持对NOR/PSRAM/NAND存储器的同步突发访问方式。我们外设扩展的SRAM和TFT液晶配置到STM32的FSMC接口,这样STM32对他们的访问和访问内部的RAM是一样的,再配合STM32的快速处理速度,就可以完成对扩展的SRAM和TFT液晶屏的读写。

接收端和发射端的NRF24l0无线模块都是通过SPI接口和STM32进行连接,STM32的SPI接口能够达到18Mbit/s,NRF24l01的SPI接口最快是8Mbit/s,这样可以使无线模块达到最大速度。图像通过无线传输的更快。

STM32F103ZET6单片机主要功能如表2-1所示:

表2-1 STM32F103ZET6主要功能

ARM 32位的Cortex -M3 CPU

512K字节的闪存程序存储器

高达64K字节的SRAM

带4个片选的静态存储器控制器

多达11个定时器、13个通信接口

最高72MHz工作频率

多达112个快速I/O端口

12通道DMA控制器

低功耗睡眠、停机和待机模式

LQFP144封装

STM32F103ZET6、STM32F103VET6引脚介绍

STM32F103ZET6引脚结构如图2-3所示:

 图2-3  STM32F103ZET6引脚图

STM32F103VET6引脚结构如图2-4所示:

图2-4 STM32F103VET6引脚图

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。复位电路通常采用上电自动复位和手动按钮复位两种方式,本设计系统采用的是手动按钮复位。系统复位电路如图2-5所示。

图2-5 复位电路

晶振是用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。晶振的作用是为系统提供基本的时钟信号。系统振荡电路如下图2-6所示:

图2-6 晶振电路

下载电路

STM32自带JTAG仿真接口,可以实现下载和在线调试功能。系统振荡电路如下图2-7所示:

图2-7 下载电路

2.2.2 摄像头和帧缓冲芯片的选择和电路设计

摄像头ov7670

OV7670,图像传感器,体积小,工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输入整帧、子采样、取窗口等方式的各种分辨率8位影像数据。该产品VGA图像最高达到30帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、饱和度、色度等都可以通过SCCB接口编程。实物如图2-8:

图2-8 Ov7670摄像头

帧缓冲芯片AL422B

AL422B是AverLogic公司推出的一个存储容量为393 216字节×8位的FIFO存储芯片。其所有的寻址、刷新等操作都由集成在芯片内部的控制系统完成。

AL422B主要特点是:

  ◆AL422B的存储体为3 Mb(393 21 6字节×8位);

  ◆可以存储VGA、CCIR、NTSC、PAL和HDTV等制式一帧图形的信息;

  ◆独立的读写操作,可以接受不同的I/O速率;

  ◆高速异步串行存取;

  ◆读写周期为20 ns;

  ◆存取时间为15 ns;

◆内部DRAM自刷新。

实物如图2-9:

图2-9 AL422B

电路设计

因为ov7670采集的速度是30帧/秒,我们的图形传输系统没有这么快的速度,所以采集来的图形信号先在缓冲芯片内暂存。缓冲芯片的写入有摄像头和主控芯片一起控制。具体电路如图2-10:

图2-10 摄像头和缓冲芯片的连接电路图

2.2.3 发射端的整体电路图

如图2-11:

图2-11 语音发射端总体电路图

2.2.4 接收端缓冲芯片的选择和论证

接收端扩展的缓冲芯片是IS61WV25616BLL,256K x 16高速异步CMOS静态RAM,高速存储时间为20ns。18条地址线,16条数据线,5条控制线。当其和STM32的FSMC接口正确连接并配置和,STM32就可以像对内部RAM一样的读写它。大大加快了对图形的暂存速度。实物如图2-12:

图2-12 IS61WV25616BLL

2.2.5 LCD液晶屏的选择和论证

接收端选择的是3寸LCD显示模块,采用的是基于ILI9325驱动的 TFT显示器,显示规格是400x240,颜色显示方式是RGB565。下面是模块的接口电路如图2-13:

图2-13 TFT液晶接口电路

2.2.6 图形传输系统接收端的电路图

如图2-14:

图2-14 接收端总体电路图

2.3 语音传输系统

语音传输系统是通过IIC协议配置RDA5820实现,可以通过按键选择接收模式和发射模式。

STC89C52单片机主要功能如表2-1所示:

表2-2 STC89C52主要功能

兼容MCS51指令系统

8K可反复擦写Flash ROM

32个双向I/O口

256x8bit内部RAM

3个16位可编程定时/计数器中断

时钟频率0-24MHz

2个串行中断

2个外部中断源

低功耗空闲和掉电模式

2.3.1 STC89C52引脚介绍

引脚结构如图2-15所示:

 图2-15  STC89C52引脚图

2.3.2 复位电路

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。当系统处于正常工作状态时, 且振荡器稳定后, 如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期), 则CPU就可响应并且将系统复位。当STC89C52进行复位时,PC初始化为0000H,使STC89C52单片机从程序存储器的0000H单元开始执行程序。复位电路通常采用上电自动复位和手动按钮复位两种方式,本设计系统采用的是手动按钮复位。系统复位电路如图2-16所示。

图2-16 复位电路

2.3.3 晶振电路

晶振是用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。晶振的作用是为系统提供基本的时钟信号,STC89C52内部有一个用于构成片内振荡器的高增益反相放大器, 振荡器产生的信号送到CPU, 作为CPU的时钟信号,驱动CPU产生执行指令功能的机器周期。引脚XTAL1和XTAL2是此放大器的输人端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如下图所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,外接石英晶体时, C1和C2一般取5pF-30pF, 本设计中C1、C2选择标称值30pF,晶振为11.0592MHZ。系统振荡电路如下图2-17所示:

图2-17 晶振电路

2.3.4 FM模块的选择和论证

语音模块可以实现FM立体声收发功能。该模块采用RDAMicroelectronics公司研发的RDA5820 IC。此模块外围组件少、噪声系数极小且具有体积小、低功耗、低成本、应用简单、使用范围广等优点。主要应用于高档游戏机及无线音频电子玩具、无线音响及无线立体声耳机、PDAS及Notebook PCd等周边应用。实物如图2-18所示:

图2-18 RDA5820模块外视图

该模块和单片机的连接方式如图2-19所示:

图2-19 RDA5820接口示意图

同时由于语音信号较弱,此模块驱动能力有限,为驱动喇叭和增强语音输入强度,增加音频功放电路:

语音输入端电路如图2-20所示:

图2-20 语音输入电路

语音输出电路如图2-21所示:

图2-21 语音输出电路

2.3.5 语音部分电路设计

原理图:

图2-22语音部分电路图

2.4 无线控制系统

此系统主要由STC单片机、超声波测距模块、DS18B20温度采集模块、1602LCD液晶、nRf905无线模块等构成。车载端和手持端通过nRf905无线模块进行无线数据传输,从而使手持终端可以显示小车端的温度、距离信息等,并且可以控制小车的运行方向同时在1602LCD液晶显示运行状态。系统的总体框图如图2-23所示。

无线发送

无线发送

图2-23 控制系统总体框图

2.4.1无线模块的选择和论证

无线模块(RF wireless module)是利用无线技术进行数据传输的一种模块。它广泛地应用于电脑无线网络,无线通讯,无线控制等领域。无线模块主要由发射器,接收器和控制器组成。

我们设计手持端的通信距离为100-200米,属于小型无线网络。我们比较和使用了两种常用的无线模块。

1.nRF905

如图2-24所示,nRF905是工作在433MHz、868MHz和915MHz频段的GFSK调制模式的无线数传芯片,最高发射功率可达+10dBm,接收灵敏度为-100dBm,支持512个通讯频率。使用ShockBurst™传输模式,数据在空中的传输速率为50kbps。使用SPI接口与MCU完成数据通讯与通讯控制等功能。

图2-24 NRF905模块

2 .nRF24L01

如图2-8所示,nRF24L01是工作在2.4GHz的国际通用ISM免申请频段GFSK调制的无线数传芯片。最高发射功率0dBm,接收灵敏度为-85dBm,支持125个通讯频率。使用增强型的 Enhanced ShockBurst™传输模式,支持6个数据通道(共用FIFO)。支持1Mbps和2Mbps的空中数据传输速率。使用SPI接口与MCU完成数据通信与控制通信等功能。

图2-25 NRF24L01模块

由于相对于NRF24L01,NRF905传输数据量较小,不适合图像类大数据量传输,同时为防止同频段干扰和提高无线效率,我们手持端与小车的控制类通信通过NRF905来实现,

图像数据传输采用nRF24L01。

NRF905连接方式如图2-26所示:

图2-26 nRF905接口示意图

发送端的nRF905需要设置发送地址和发送模式,将单片机处理后的数据无线发送到接收部分的nRF905。接收端的nRF905需要设置接收地址和接收模式,它收到的数据经过单片机处理后,通过串口传递给PC机,实现发送部分和PC机的无线通信。

2.4.2系统供电电源选择:

我们比较了两种常用的开关稳压电源芯片:AMS1117-3.3与LM2596。

单片机的工作电压为+5V,与GPS模块及液晶屏相同。因为单片机、GPS及液晶需5V供电,而无线模块需要+3.3v左右电压供电,故系统供电需要两个电压。

AMS1117-3.3是一个正向低压降稳压器,在1A电流下压降为1.2V。AMS1117有两个版本:固定输出版本和可调版本,固定输出电压为1.5V、1.8V、2.5V、2.85V、3.0V、3.3V、5.0V,AMS1117内部集成过热保护和限流电路,是电池供电和便携式计算机的最佳选择。因此选择此芯片为电压转换芯片用于输出3.3V电压。典型电路如图2-27所示。

图2-27 AMS1117-3.3典型电路

MC34063A(MC33063)集成电路芯片器件简介:该器件本身包含了DC/DC变换器所需要的主要功能的单片控制电路且价格便宜。它由具有温度自动补偿功能的基准电压发生器、比较器、占空比可控的振荡器,R—S触发器和大电流输出开关电路等组成。该器件可用于升压变换器、降压变换器、反向器的控制核心,由它构成的DC/DC变换器仅用少量的外部元器件。主要应用于以微处理器(MPU)或单片机(MCU)为基础的系统里典型电路如下图2-28所示。

图2-28 MC34063A典型电路

从电路设计的简便角度考虑,系统电源部分采用5V电压供单片机和超声波测距模块,采用AMS1117-3.3模块将5V电压转换为3.3V电压为NRF905无线模块供电。

2.4.3测量温度模块的选取

通过对多种温度传感器的对比,最终采用DS18B20作为温度采集传感器 特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 测温范围 -55℃~+125℃,固有测温分辨率0.5℃。

                图2-29 DS18B20模块实物图

支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温

工作电源: 3~5V/DC,使用中不需要任何外围元件,测量结果以9~12位数字量方式串行传送

图2-30 DS18B20接口图

2.4.4测量距离模块的选取

超声波测距模块采用HC-SR04模块,该模块使用比较简单,精度已经达到要求,且比较便宜,优点有:

图2-31 超声波实物图

1、典型工作用电压:5V。

2、超小静态工作电流:小于2mA。

3、感应角度:不大于15 度。

4、探测距离:2cm-400cm

5、高精度:可达0.3cm。

6、盲区(2cm)超近。

图2-32 超声波测距模块接口示图
2.4.5 无线控制部分电路设计

如图2-33:

图2-33 无线控制系统电路图
3 系统软件设计
软件部分设计采用Keil C语言编程环境实现,其中主要涉及到OV7670图像采集、FM语音模块的IIC模式控制、TFT彩屏显示、1602液晶显示、nRF24l01无线图像收发的SPI模式控制、nRF905无线数据收发模块的SPI模式控制等的编程及调试工作。

3.1 图像部分主要子函数

void RCC_Configuration(void); //系统时钟配置为72MHZ, 外设时钟配置

voidSPI_NRF_Init(void); // SPI_NRF_Init:SPI的 I/O配置

void NRF_TX_Mode(void); // NRF_TX_Mode :配置发送模式

void FIFO_GPIO_Configuration(void); //完成摄像头接口的配置

int Sensor_Init(void);// 完成摄像头的初始化,摄像头配置成功返回1

void NVIC_Configuration(void);//帧同步检测中断源配置

u8 NRF_Rx_Dat(u8 *rxbuf);// 用于从NRF的接收缓冲区中读出数据

void EXTI4_IRQHandler(void);// 帧同步检测中断

void FSMC_LCD_Init(void);// LCD接口和FSMC初始化

void LCD_Init(void);// LCD初始化函数

void FSMC_SRAM_Init(void);// IS61WV25616BLL FSMC初始化函数

3.2.语音部分主要子函数

void FM_WriteReg(uchar a,uint b);    //写FM寄存器

    uint  FM_ReadReg(uchar temp);       //读FM寄存器

voidkaiji(void); //液晶开机界面显示

voidlcd_wcom(uchar a);//写液晶命令

voidlcd_wdat(uchar a);//写液晶数据

void rssi(uchar a,uint b);//显示信号强度

3.3 无线控制部分主要函数

void nRF905Init();//初始化NRF905
void Config905();//配置NRF905
void Init_INT0();//单片机中断0初始化
void SetTxMode();//设置发射模式
4 实验及测试结果
4.1 完整系统效果图

焊接完成系统电路,车体以及终端组装完成效果图,

如图4-1所示。

图4-1 LCD显示模块测试效果

4.2 车体部分电路及实际效果图

车体部分采用铝合金外壳,铁链式履带,组装有FM天线、NRF905天线、NRF24L01天线和摄像头,实际电路如图4-2:

图4-2 车体部分实际效果图

4.3 手持终端实际效果图

手持终端集合图像显示、语音控制显示和采集数据显示模块组成,

终端总体效果图,如图4-3所示:

图4-3 终端总体效果图

手持终端测试效果图:

图1:TFT液晶开机界面

图2:图像采集界面

图3:语音控制界面

图4:数据采集显示界面

图4-4 手持终端

经过以上几项测试,本设计的各部分工作正常,基本实现了设计要求。

六 结论及应用
经过将近一年的学习努力与设计,该设计课题功能已经实现。设计中采用了ARM微处理器和STC单片机作为主控芯片,经过不断调试,最终完成了对硬件设备的操作与控制,单片机的资源也得到了合理的配置和较好的利用,同时对单片机的认识和应用有了进一步加深。

本作品主要由中低档ARM处理器STM32配合OV7670摄像头和TFT彩屏实现实时图像数据传输与显示,STC单片机配合RDA5820和1602显示液晶实现语音对讲和环境数据传输及显示的功能,由短距离无线数传模块NRF905和NRF24L01实现无线图像及数据的传输与接收。

本项目的优势在于在实现便捷高效的设计目的的同时采用低成本的解决方案。TFT彩屏显示图像清晰、1602显示屏界面友好,nRF24L01和nRF905无线模块的使用使得数据可以得到及时更新,且安装起来更加方便,这也是整个设计中实际应用性较强的一个方面。综上所述,该设计具有较完善的功能、较大的实用价值、高的性价比等特点,将会有比较好的市场应用前景。

七 未来展望

随着未来智能化技术的发展和研究,智能消防机器人的设计一定会有更好的发展。学海无涯,就本设计来讲,其本身还有更多需要完善的地方,如图像压缩技术,语音处理技术,代码效率的优化等。

总体来看,虽然系统的细节部分还存在诸多有待完善的地方,但是未来短距离无线视频监控技术、数字语音技术和智能机器人技术发展前景广阔,是值得我们去研究和探索的。同时,我们的项目研究成果可以轻松应用于其他领域,比如:通过短距离无线视频监控技术,我们可以研制智能无线相机;通过数字语音技术,我们可以研制智能语音防盗系统;智能机器人技术可以应用于智能控制设备的研发。

参考文献

[1] 谭浩强.C语言程序设计.北京:清华大学出版社,2006

[2] 李瀚荪.电路分析基础.北京:高等教育出版社,2005

[3] 肖玲妮.Protel 99SE印刷电路板设计教程[M].北京:清华大学出版社,2003

[4] 李朝青.单片机原理及接口接口技术.北京:北京航空航天大学出版社,2005.9 [5] 张俊谟.单片机中级教程(原理与应用)[M].北京航空航天大学出版社,2000

[6] 贾吉庆.基于DM642的单兵无线视频采集系统的研究和实现[D].青岛:中国海洋大学,2008

[7] 谢龙汉等.Altium Designer原理图与PCB设计及仿真.北京:电子工业出版社

[8] 杭州金龙电子有限公司.KL-nRF24L01开发指南V1.8[R].杭州:杭州金龙电子有限公司,2010

[9] OKI Preliminary. ML86410 User’s Manual [M].OKI Preliminary,2006

[10] Nordic Semiconductor. nRF24L01 Single Chip 2.4GHz TransceiverProduct Specification[M].Norway:Nordic Semiconductor,2007

附 录

图形传输系统主要源代码

图形采集发射端主要源代码

主程序:

void main(void)

{

u8 txbuf[32]; //发送图形数据缓存数组

u8 ci=0;

uint32_t count;

RCC_Configuration(); //系统时钟设置及外设时钟使能

SPI_NRF_Init(); //NRF24l01初始化程序

NRF_TX_Mode(); //设置NRF24l01为发送模式

if (SysTick_Config(72000)) //时钟节拍中断时1ms一次 用于定时

{

 while (1);

}

Delay_ms(1000);

FIFO_GPIO_Configuration(); //摄像头引脚定义

FIFO_WE_H();

while( 1 != Sensor_Init() ); //摄像头初始化程序

NVIC_Configuration(); //帧同步检测中断源配置

Delay_ms(50);

Vsync = 0;

   while(1)

   {

if( Vsync == 2 )

{   

    FIFO_RRST_L();                                             //AL422B读地址指针复位

    FIFO_RCLK_L();  

    FIFO_RCLK_H();

    FIFO_RRST_H();

    FIFO_RCLK_L();

    FIFO_RCLK_H();

  

      for( count = 0; count< 2400; count++ )

    {

            for(ci=0;ci< 32; ci++)                                             //发送一包数据32个字节

            {

                  FIFO_RCLK_L();

                  txbuf[ci]=(u8) ((GPIOC->IDR) & 0x00ff);

                  FIFO_RCLK_H();

                  FIFO_RCLK_L();

                  FIFO_RCLK_H();

            }

           NRF_Tx_DatK(txbuf);                                             //发送数据

     }

     Vsync = 0;                                                               //发送完成

      Delay_ms(200);                                              //延时等待接收方显示完成

   }

   }

}

图像接收端主要源代码

主程序

void main(void)

{

uint16_t CMOS_Data=0;

u16 i;

SystemInit(); //系统时钟初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

NVIC_Configuration(); //中断源配置函数

GPIO_Configuration(); //I/O接口配置函数

FSMC_LCD_Init(); //LCD FSMC总线配置

LCD_Init(); //液晶初始化函数

FSMC_SRAM_Init(); //IS61WV25616BLL FSMC接口初始化

LCD_test(); //液晶初始显示函数

SPI2_NRF24L01_Init(); //NRF24L01初始化函数

NRF24L01_RX_Mode(); //设置NRF24L01为接收模式

WriteAddr2=0;

zhen14[0]=0;

while(1)

{

    if(zhen>=76800)                                         //把外部RAM缓存的图形数据显示到LCD

    {

    zhen=0;

    LCD_WR_CMD(0x0003,0x1018);       //图像显示方向为左下起 行递增  列递减

  LCD_WR_CMD(0x0210, 0);                               //水平显示区起始地址 0-239

   LCD_WR_CMD(0x0211, 239);                         //水平显示区结束地址 0-239

   LCD_WR_CMD(0x0212, 0);                     //垂直显示区起始地址 0-399

   LCD_WR_CMD(0x0213, 319);                    //垂直显示区结束地址 0-399           

     LCD_WR_CMD(0x200, 0);                        //水平显示区起始地址

   LCD_WR_CMD(0x201, 319);                        //垂直显示区起始地址

   LCD_WR_REG(0x0202);                               //写数据到显示区

for(i=0;i<38400;)

     { CMOS_Data=((zhen14[i]<<8) & 0xff00);

          i++;

          CMOS_Data |= (zhen14[i]& 0x00ff);

           *(__IO uint16_t*) (Bank1_LCD_D) = CMOS_Data;

           *(__IO uint16_t*) (Bank1_LCD_D) = CMOS_Data;

           i++;

}

          for(i=0;i<38400;)                     

          {                                               //从图像数组的第9位开始递增

           CMOS_Data=((zhen141[i]<<8)& 0xff00);

           i++;

           CMOS_Data |=(zhen141[i]& 0x00ff);

           *(__IO uint16_t*) (Bank1_LCD_D) = CMOS_Data;

         *(__IO uint16_t *) (Bank1_LCD_D) = CMOS_Data;

           i++;

           }

   //刷新左侧没有图像的区域

LCD_WR_CMD(0x0003,0x1018); //图像显示方向为左下起 行递增 列递减

LCD_WR_CMD(0x0210, 0);                                   //水平显示区起始地址 0-239

 LCD_WR_CMD(0x0211,239);                      //水平显示区结束地址 0-239

 LCD_WR_CMD(0x0212,320);                     //垂直显示区起始地址 0-399

 LCD_WR_CMD(0x0213,399);                 //垂直显示区结束地址 0-399               

   LCD_WR_CMD(0x200, 0);                      //水平显示区起始地址

 LCD_WR_CMD(0x201,320);                             //垂直显示区起始地址

 LCD_WR_REG(0x0202);                                    //写数据到显示区

for(i=0;i<19200;)

   {                                               //从图像数组的第9位开始递增

    *(__IO uint16_t *)(Bank1_LCD_D) = 0x5500;

    i++;

   }

   //显示“河北大学”

   lcd_wr_zf(10,340,35,40,0xff,0,he);

   lcd_wr_zf(60,340,35,40,0xff,0,bei);    

   lcd_wr_zf(110,340,35,40,0xff,0,da);

   lcd_wr_zf(160,340,35,40,0xff,0,xue); 

}

}

}

语音传输系统主要源代码

void main()

{

    uint z_1,Tune;

    FM_WriteReg(2,0x0002);     

    DelayIT(50);

    FM_WriteReg(2,0xC001);    

    DelayIT(50);                                       

    FM_WriteReg(5,0X884F);   

 FM_WriteReg(2,0xd281);

 FM_ReadReg(0x0b);

    FM_WriteReg(0X07,0X7800);           

    FM_WriteReg(0X13,0X0008);           

    FM_WriteReg(0X15,0x1420);            

    FM_WriteReg(0X16,0XC000);          

    FM_WriteReg(0X1C,0X3126);          

    FM_WriteReg(0X22,0X9C24);           //fm_true

    FM_WriteReg(0X47,0XF660);          //tx rds               

kanji();

while(1)

{

  if(KEY==1)

  {

                        p=0;

    for(;p>0;p--) FM_SetFreq__RX(0x00);

    lcd_wcom(0x80+0x46);  

    for(m1=0;m1<8;m1++)   

    {

      lcd_wdat(table_[m1]);                  

    } ;

    lcd_wcom(0x80+0x40);  

    for(m1=0;m1<1;m1++)    

    {

      lcd_wdat(table_1[m1]);                  

    } ;

   if(KEYu==0&&KEY2==0&&vol<0xf)vol+=0x1;

    else if(KEYd==0&&KEY2==0&&vol>0x0)vol-=0x1;

    elseif(KEYu==0&&Tune<20)a1++,Tune+=1;

    elseif(KEYd==0&&Tune>0)a1--,Tune-=1;       

                        FreqTune=150;

                        for(;l1>0;l1--)

    {       

     l2=1,FM_WriteReg(0x40,0x0000),FM_SetFreq__RX(FreqTune);

                        }

    z_1=0xff&(FM_ReadReg(0x0a));

    FM_SetVolume(vol); 

    show(0x80+0x41,65+((double)z_1)/10);

    show_(0x80+0x4e,((double)vol)); 

   rssi(0x8d,(uint)((FM_ReadReg(0x0b)>>10)/5));

    if( ((FM_ReadReg(0x0b)>>10)/5))

    {

      lcd_wcom(0x8f);

      for(m1=6;m1<7;m1++)   

      {

        lcd_wdat(table10[m1]);                  

      } ;

   };

   if( !((FM_ReadReg(0x0b)>>10)/5))

   {

      lcd_wcom(0x8f);

      for(m1=0;m1<1;m1++)    

      {

        lcd_wdat(table10[m1]);                  

      } ;

   };                 

      DelayIT(10);// 10ms * del

  };

  if(KEY==0)

  {

    for(;l2>0;l2--)

    {      

     l1=1,FM_WriteReg(0x40,0x0001),FM_SetFreq__RX(FreqTune),

     lcd_wcom(0x80+0x40);  

     for(m1=0;m1<16;m1++)    

     {

       lcd_wdat(tabletp[m1]);                  

     } ;

  };

                        FM_WriteReg(0x40,0x0001) ;

                        z_1=0xff&(FM_ReadReg(0x0a));

                        show(0x80+0x44,65+((double)z_1)/10);

                        lcd_wcom(0x80+0x43);  

             for(m1=1;m1<2;m1++)    

                                       {

                                             lcd_wdat(table_1[m1]);                  

                                       } ;

                        if(KEYu==0&&KEY==0&&r_i<0x043b)r_i+=0x000c;

                        if(KEYd==0&&KEY==0&&r_i>0x0405)r_i-=0x000c;

                        FM_WriteReg(0x42,r_i); 

                        rssi(0x80+0x4d,(uint)((r_i&0xff)/0x0c));

                        DelayIT(10);//?? 10ms * del

                        };                                 

};

}

无线控制系统主要源代码

void main(void)
{
char i,j;
char temperature[5];
char distance[6];
//char displaytemp[16];//定义显示区域临时存储数组
LCD_Init();
LCD_Clear();//清屏
nRF905Init();
Config905();
Init_INT0();
SetTxMode();
while (1)
{

SetRxMode();

if(DR)
{
RxPacket();
Delay_ms(100);
Delay_ms(100);

for(i=0;i<4;i++)
{

 temperature[i]=RxBuf[i];
    temperature[4]=0;

}

for(i=0,j=4;i<6;i++,j++)
{

 distance[i]=RxBuf[j];
    distance[5]=0;

}
LCD_Write_String(10,1,temperature);//显示第二行
LCD_Write_Char_quan();
LCD_Write_Char(15,1,'C');
LCD_Write_String(6,0,distance);

  }                                                                                        

LCD_Write_Char_xia();
LCD_Write_Char_shang();
LCD_Write_Char_zuo();
LCD_Write_Char_you();
Delay_ms(100);
// anjian();
LCD_clear_char(x,y);
Delay_ms(100);
//anjian();

}

}

卫朋

人人都是产品经理受邀专栏作家,CSDN 嵌入式领域新星创作者、资深技术博主。2020 年 8 月开始写产品相关内容,截至目前,人人都是产品经理单渠道阅读 56 万+,鸟哥笔记单渠道阅读200 万+,CSDN 单渠道阅读 210 万+,51CTO单渠道阅读 180 万+。

卫朋入围2021/2022年人人都是产品经理平台年度作者,光环国际学习社区首批原创者、知识合作伙伴,商业新知 2021 年度产品十佳创作者,腾讯调研云2022年达人榜第三名。

文章被人人都是产品经理、CSDN、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
物联网 Linux C#
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
微软的开源跨平台框架 Uno Platform 支持使用 C# 和 XAML 一次性编写代码并部署至多个平台,如 Windows、macOS、Linux、WebAssembly 及 iOS/Android,这使其成为 IoT 设备开发的理想选择。本文通过创建控制网络 LED 灯的应用,详细介绍了 Uno Platform 的环境搭建及 MQTT 客户端配置过程,实现了 LED 状态订阅与控制指令发送功能。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
1025 58
|
物联网 Linux Android开发
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
本文通过具体案例介绍了如何使用微软的开源框架 Uno Platform 实现与 IoT 设备的集成。Uno Platform 支持一次编写、多平台部署,适用于 Windows、macOS、Linux、WebAssembly 及 iOS/Android。本例创建了一个控制网络 LED 灯的应用,详细说明了环境搭建、MQTT 客户端配置、主题订阅及控制指令发送等步骤。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
679 0
|
传感器 开发框架 物联网
揭开.NET在IoT领域的神秘面纱:如何构建智能设备,让未来生活触手可及?
【8月更文挑战第28天】随着物联网技术的发展,智能设备正深入我们的生活。.NET作为跨平台开源框架,在IoT领域应用广泛。本文介绍如何利用.NET构建智能设备,通过实例展示从环境搭建到项目创建、代码编写及运行的全过程,帮助开发者快速实现IoT解决方案,开启智能设备开发的新篇章。
505 0
|
监控 物联网 Java
|
物联网 API 开发工具
|
JSON JavaScript 物联网
阿里云物联网IOT平台使用案例教程(模拟智能设备)
阿里云物联网IOT平台使用案例教程(模拟智能设备)
|
安全 物联网
更强交互,阿里云IoT发布屏显智能产品
阿里云推出了三大全新产品,帮助设备快速完成智能化升级。
783 2
更强交互,阿里云IoT发布屏显智能产品
|
存储 监控 物联网