本文为笔者团队协作作品,集外观设计、无线音频、无线视频传输技术,无线视频传输具有原创性,仅此一例,现共享方案设计参考。
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、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。