目录
一、方案流程及技术规格书设计
二、系统硬件电路设计
三、软件编写及调试
四、系统调试测试与分析
前言
为了解决重要物品丢失或遗忘的问题,达到找到丢失或遗忘的重要物品和报警提示,防止重要物品丢失或遗忘的目的,提出一种基于无线技术和51单片机的智能防丢失报警器设计与实现方案。
目前市场上的电子防丢器,大多是采用GPS技术、蓝牙技术,系统复杂、价格昂贵。本设计方案采用廉价的51单片机和2.4G无线通信模块,具有价格低廉、系统简单、使用方便等特点。
该智能防丢失报警器采用主机和子机方案,在一定较短距离内,主机和子机正常通信,当主机和子机距离较远时,通信失败,主机和子机会声光报警,从而达到物品查找、预防报警的功能,可有效找到重要物品,防止物品被盗,具有重要的市场价值。
软件工具准备
软件:
电路设计:protel99 se(up主使用版本) 或者其他版本,或者其他电路设计软件;
单片机开发:Keil5;
调试测试:串口调试助手,逻辑分析仪等;
工具:
电路焊接:电烙铁,SMT(有条件的);
调试:
万用表、示波器(基础入门即可,可以白嫖学校或者公司)USB转串口工具、仿真器;
一、方案流程及技术规格书设计
方案流程设计
技术规格书设计
主机
1.主机采用SI24L01无线通信模块收发约定的数据,正常收到子机数据,说明子机在范围内,没有收到数据说明子机不在范围内,声光报警。
2.采用DS1302时钟芯片计时,实现记录丢失时间。
3.LCD显示状态,如果有丢失报警,显示报警时间。
4、正常状态LED常亮,报警状态LED闪烁显示。
5、蜂鸣器实现声音报警。
6、4个按键设置时钟和取消报警状态。
子机
1.子机采用SI24L01无线通信模块收发约定的数据,正常收到主机数据,说明主机在范围内,没有收到数据说明主机不在范围内,声光报警。
2、正常状态LED灭,报警状态LED闪烁显示。
3、蜂鸣器实现声音报警。
二、系统硬件电路设计
2.1微处理控制电路
设计采用宏晶公司IAP15F2K61S2单片机芯片。LQFP32封装,电路图如图所示:
图中VCC为5V供电电压。C12瓷片电容,起滤波作用,J8是仿真烧录口。
单片机IO口连接介绍:
P00-P03(29-32脚):按键检测引脚。
P10-P17(1-8脚):LCD数据口。
P20(21脚): CE 无线模块片选脚。
P21-P24(22-25脚):SPI通讯口,连接无线模块。
P25-P27(26、27、28脚):RS、RW、E,LCD控制脚。
P30-P31(13、14脚):串口下载口。
P32-P34(15-17脚):DS1302控制脚。
P35(18脚): LED控制脚。
P36(19脚): 无线模块中断脚。
P37(20脚): 蜂鸣器控制脚。
2.2 主机Si24L1无线模块电路
无线通讯模块和单片机采用SPI通讯方式,W_CSN,W_SCK,W_MOSI,W_MISO是SPI通讯口,W_CE是片选信号,W_IRQ是中断引脚。电路图如图所示:
IAP15F2K61S2单片机输出是5V电压,不能和无线模块直接连接,所以采用电平转换电路。
2.3 主机LCD显示电路
LCD1602A显示电路如图:
R38是电位器,作用是调节显示对比度。C11是滤波电容。R66是背光限流电阻。
IO口连接介绍:
RS、RW、E(4、5、6脚):LCD读写控制脚。
D0-D7(7-14脚):数据线。
2.4主机按键电路
产品设计4个按键,没有按下按键,对应IO口是高电平,按键按下,对应IO口接地,是低电平。单片机检测各个按键IO口电平,判断按键状态。电路如图:
2.5 主机LED电路
LED通过单片机IO口控制,电路如图。
2.6蜂鸣器驱动电路
蜂鸣器模拟报警设备。由于IO口驱动能力有限,所以使用三极管放大电路,扩大驱动电流。电路如图。
2.7 主机时钟电路
时钟电路采用专用时钟芯片DS1302,电路如图:
Y2是32.768时钟晶振,SCLK、DIO、CE_1302是和单片机通信线。
2.8主机电源电路
系统采用外部9V电源适配器供电,9V直流经过DCDC降压,输出5V电压给芯片和其他电路供电。电路如图。
单片机等3.3V供电采用ASM1117线性稳压电路,电路如图。
无线通讯模块供电需要3.3V,通过3.3V稳压芯片ASM1117输出3.3V电压。电路如图。
2.9子机电路设计
无线防丢器子机电路和主机电路基本一样,只是少了液晶显示模块、时钟电路、按键电路。电路如图。
三、软件编写及调试
3.1主程序设计
主机使用单片机IAP15F2K61S2控制,控制设备有按键,液晶显示1602A,通信模块Si24L1,时钟芯片DS1302,LED灯,蜂鸣器。上电对单片机系统和控制设备初始化,正常工作有以下三种模式:
工作模式1:读取时钟芯片时间,通过无线模块发送“110”,接收子机信息正常,LCD显示正常信息,接收子机信息不正常,LCD显示报警信息,蜂鸣器鸣响,LED闪烁,显示报警时间。
工作模式2:长按设置按键,通过无线模块发送“find”,接收子机回复信息正常,停止发送,接收子机回复信息不正常,继续发送。
工作模式3:设置时间,按设置键,进入设置时间,小时闪烁,按上下键修改小时,按确认键分钟闪烁,按上下键修改,按确认键退出。
图是主程序流程图。
3.2主机无线通讯程序设计
图4-2无线通信流程图,报警模式时,发送“110”给子机,同时接收子机回复,接收正确不报警,接收错误报警。查找模式时,发送“find”给子机。
模块和单片机SPI通信。
SPI通信代码:
/*****************************************************
功能:SPI IO口初始化
***************************************************/
void drv_spi_init( void )
{
//引脚配置
//SCK MOSI NSS 配置为推挽输出
SPI_SCK_PxM0 = IO_OUT_PUT_PP_M0 << SPI_SCK_PIN_BIT;
SPI_SCK_PxM1 = IO_OUT_PUT_PP_M1 << SPI_SCK_PIN_BIT;
SPI_MOSI_PxM0 = IO_OUT_PUT_PP_M0 << SPI_MOSI_PIN_BIT;
SPI_MOSI_PxM1 = IO_OUT_PUT_PP_M1 << SPI_MOSI_PIN_BIT;
SPI_NSS_PxM0 = IO_OUT_PUT_PP_M0 << SPI_NSS_PIN_BIT;
SPI_NSS_PxM1 = IO_OUT_PUT_PP_M1 << SPI_NSS_PIN_BIT;
//MISO 配置为输入
SPI_MISO_PxM0 = IO_IN_PUT_ONLY_M0 << SPI_MISO_PIN_BIT;
SPI_MISO_PxM1 = IO_IN_PUT_ONLY_M1 << SPI_MISO_PIN_BIT;
//时钟置低
SPI_SCK = 0;
//MOSI MISO NSS置高
SPI_MOSI = 1;
SPI_MISO = 1;
SPI_NSS = 1;
}
/*****************************************************
功能:SPI 收发一个字节
***************************************************/
uint8_t drv_spi_read_write_byte( uint8_t TxByte )
{
uint8_t i = 0, Data = 0;
spi_set_clk_low( );
for( i = 0; i < 8; i++ )//一个字节8byte需要循环8次
{
/** 发送 */
if( 0x80 == ( TxByte & 0x80 ))
{
spi_set_mosi_hight( ); //发送的位为 1 则置高IO引脚
}
else
{
spi_set_mosi_low( );//发送的位为 0 则置低IO引脚
}
TxByte <<= 1; //数据左移一位,先发送的是最高位
spi_set_clk_high( ); //时钟线置高
_nop_( );
/** 接收 */
Data <<= 1; //接收数据左移一位,先接收到的是最高位
if( 1 == spi_get_miso( ))
{
Data |= 0x01; //如果接收时IO引脚为高则认为接收到 1
}
spi_set_clk_low( ); //时钟线置低
_nop_( );
}
return Data; //返回接收到的字节
}
/*****************************************************
功能:SPI 收发一个字节
***************************************************/
void drv_spi_read_write_string( uint8_t* ReadBuffer, uint8_t* WriteBuffer, uint16_t Length )
{
spi_set_nss_low( ); //片选拉低
while( Length-- )
{
*ReadBuffer = drv_spi_read_write_byte( *WriteBuffer ); //收发数据
ReadBuffer++;
WriteBuffer++; //读写地址加1
}
spi_set_nss_high( ); //片选拉高
}
3.3 主机 LCD 显示程序设计
LCD1602A字符液晶能显示2行,一行16个ASKII字符,共32个字符,LCD显示有写命令指令和写数据指令。写状态指令是设置显示状态,比如开显示,关显示,设置显示位置,设置显示模式等,写数据指令是把字符对应的编码写入数据寄存器,对应ASKII码就显示出来。图是LCD显示功能流程图。
LCD显示代码:
/*****************************************************
功能:IO口定义
***************************************************/
sbit E=P2^7;
sbit RW=P2^6;
sbit RS=P2^5;
/*****************************************************
功能:1ms延时
***************************************************/
void delay(uint k)
{
k=k*125;
while(k--);
}
/*****************************************************
功能:写命令
***************************************************/
void cmd_w(uchar cmd)
{
RW=0;
RS=0;
E=1;
P1=cmd;
delay(1);
E=0;
}
/*****************************************************
功能:写数据
***************************************************/
void dat_w(uchar dat)
{
RW=0;
RS=1;
E=1;
P1=dat;
delay(1);
E=0;
}
/*****************************************************
功能:清屏
***************************************************/
void lcd_clear(void)
{
cmd_w(0x01); //清屏
cmd_w(0x02); //清屏回到左上角
}
/*****************************************************
功能:初始化
***************************************************/
void Lcd1602_init(void)
{
cmd_w(0x38);
cmd_w(0x0c);
cmd_w(0x06);
cmd_w(0x01);
cmd_w(0x80);
}
/*****************************************************
功能:光标定位
***************************************************/
void gotoxy(uchar x,uchar y) //x是行数,y是列数
{
if(x==1)
{cmd_w(0x80+y);}
else
{cmd_w(0xc0+y);}
}
/*****************************************************
功能:显示字符
***************************************************/
void dsp_ch(uchar _ch)
{
dat_w(_ch);
}
3.4 主机时钟驱动程序设计
时钟芯片DS1302和主机是SPI串行通信,设计采用软件模拟SPI通信。
DS1302时钟芯片代码:
/**********************************************************
函数功能:发送数据1byte
***********************************************************/
void inputbyte(uchar dat)
{
uchar i;
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLKoff;
NOP;
NOP;
if(dat&0x01)
DIOon; //每次传输低字节
else
DIOoff;
NOP;
NOP;
dat >>= 1; //右移一位
SCLKon;
NOP;
NOP;
NOP;
NOP;
}
}
/**********************************************************
函数功能:读数据1byte
***********************************************************/
uchar outputbyte(void)
{
uchar i;
uchar dat=0;
for ( i=8; i>0; i-- ) //循环8次移位
{
dat >>= 1; //右移一位
NOP;
NOP;
SCLKoff;
NOP;
NOP;
if(P32)
dat|=0X80;
NOP;
NOP;
SCLKon;
NOP;NOP;NOP;NOP;
}
return(dat);
}
/******************************************************
函数功能:发送数据到对应地址
**********************************************************/
void write1302 (uchar addr,dat )
{
CEoff; //CE引脚为低,数据传送中止
NOP;
NOP;
SCLKoff; //清零时钟总线
NOP;
NOP;
CEon; //CE引脚为高,逻辑控制有效
NOP;NOP;NOP;NOP;
inputbyte(addr); //发送地址
inputbyte(dat); //发送数据
CEoff;
}
/**********************************************************
函数功能:读取时间
***********************************************************/
uchar read1302 (uchar addr)
{
uchar dat,data_buff;
CEoff;
NOP;
NOP;
SCLKoff;
NOP;
NOP;
CEon;
NOP;NOP;NOP;NOP;
inputbyte(addr); //发送地址
dat=outputbyte();//读取数据
SCLKon;
NOP;
NOP;
CEoff;
data_buff=dat;
data_buff/=16;
dat=dat%16;
dat=data_buff*10+dat;
return (dat);
}
4.5 子机程序设计
子机程序设计和主机类似,初始化定时器和无线模块,接收主机信息,接收正确,判断接收报警信号还是查找信号,如果报警信号,回复正常,如果查找信号,蜂鸣器和LED提示。程序流程图。
四、系统调试测试与分析
4.1电路焊接
用电烙铁将单片机、无线模块、DS1302时钟芯片、LED灯、蜂鸣器、液晶显示及电容、蜂鸣器、按键等器件焊接在电路板上,实物如图所示。
4.2系统调试
通过下载线连接电脑与单片机,将C程序下载到单片机内,上电后,主机子机通信正常,主机LCD显示正常,LED灯灭,蜂鸣器不响,子机LED灯灭,蜂鸣器不响。如图:
把子机拿到一定距离后,主机和子机报警,主机显示报警和报警时间,主机LED快速闪烁,蜂鸣器鸣响。子机LED快速闪烁,蜂鸣器鸣响。如图: