STC杯单片机大赛车辆自动出入管理.docx
《STC杯单片机大赛车辆自动出入管理.docx》由会员分享,可在线阅读,更多相关《STC杯单片机大赛车辆自动出入管理.docx(25页珍藏版)》请在冰点文库上搜索。
![STC杯单片机大赛车辆自动出入管理.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/3c33a592-e904-4e91-acd0-159a86d02ca9/3c33a592-e904-4e91-acd0-159a86d02ca91.gif)
STC杯单片机大赛车辆自动出入管理
STC杯单片机系统设计大赛
车
辆
出
入
自
动
管
理
系
统
参赛人:
作品简介
开发背景
现代社会中,感应门的应用已经十分广泛,在人来人往的各大银行中使用最多,我们所设计的一个题目就是由感应门拓展而来。
经常有新闻报道某些学校由于车辆出入没有严格管理导致学生受伤,某些企业也因此造成不小的损失,因此,我们将在传统的大门上进行改进,让希望进入的车辆进入,而不能识别的车辆只允许停在门外,由此产生了我们的设计题目:
车辆出入自动控制系统。
结构说明
它是由四块模块组成:
两块均含STC系列单片机的开发板,一对无线接收装置,一块步进电机,一对红外对管。
功能与使用说明
每个司机将配备一个无线发送端的遥控开关,只需在靠近大门时按下开关,接收模块将接收到发送端发送的信号,它将信息输送给单片机进行匹配,如果匹配成功,单片机将控制步进电机带动栏杆运转,开启大门,这样车辆便可进入。
当车辆的车身挡住红外对管的时候,系统将进入等待车辆完全通过的状态,直到车辆完全通过红外对管时,红外对管将返还信息给单片机,再由单片机控制步进电机拖动栏杆,使大门关闭。
这样便实现了车辆出入的自动化管理。
视频中我们只演示了进入的状态,后期我们将红外对管安装的位置与大门的位置为统一垂直方向,这样车辆出去也就一样的了。
作品特色
我们所设计的项目主要用于像学校、私企等通常只希望本校或本企业的车辆进入,而外来车辆一般只允许停在门外,这样便于管理且安全。
我们有一个数据库,记录每辆车的号码信息,所以只有当车辆信息与数据库里的信息匹配时才允许其进入。
据我们所做的市场调查,现在的车辆出入要么是人工遥控,要么是打卡,而我们这样一款系统完全实现了自动化,节省了人力、财力。
我们后期工作是进一步完善这款系统各模块的耦合性,提高各部分的功能和外形塑造,还可将射频RFID技术运用在这款系统上,这样不仅实现了自动化,还可以清楚地知道每辆车的信息,确保了车辆的管理和安全。
图片
设计说明
设计方案
车辆的信息匹配(由无线收发模块连接,数据库在单片机存储器里)
↓(匹配成功)
开启大门(信息匹配成功后由单片机控制步进电机拖动栏杆运动)
↓
车辆是否完全进入(由一对红外对管检测车身是否完全通过)?
↓(完全通过)
关闭大门(红外对管将所测的信息结果返还给单片机,由单片机控制步进电机带动栏杆运动)
↓
实现功能
设计原理
开发板:
我们采用的STC公司的IAP15F2K61S2型号单片机来实现在P2.1口接入了光电开关的信号输入端,P1.3口到P1.7口接入了步进电机的驱动ULN2003通过这个驱动节步进电机。
达到控制通过单片机控制电机运转的目的。
NRF2401无线收发模块:
该模块中包含了2个模块,2个模块的结构完全相同,只是他们所选择的工作模式不同,一个是接收模式,一个是发送模式。
其接线方式和单片机的连线完全相同,完全由程序来控制其是否工作。
这个无线模块分为4个模式:
发送模式,接收模式,空闲模式,关机模式。
我们的程序中规定了每打开一次电源,就发送一次数据。
等待第二个司机打开电源发送数据。
而且每接收一次就进行数据匹配,如果匹配成功单片机就驱动步进电机带动栏杆打开大门。
步进电机:
主要用于控制栏杆转动角度,项目中,我们通过程序设置为90度。
当无线接收模块接收到信号时,程序中标志位置1,调用开门函数,电机正转90度,大门打开,当光电开关检测到车辆完全通过时,调用关门函数,电机反转90度,大门关闭。
其中P1.3接J17的D端、P1.4接J17的C端、P1.5接J17的B端、P1.6接J17的A端。
步进电机接右ULN2003的右下角的排针。
步进电机的红线对应VCC。
接线图
驱动方式选择
光电开关:
对射式光电开关包含在结构上相互分离且光轴相对放置的发射器和接收器,发射器发出的光线直接进入接收器。
当被检测物体经过发射器和接收器之间且阻断光线时,光电开关就产生了开关信号。
当检测物体是不透明时,对射式光电开关是最可靠的检测模式。
工作原理
原理图
NRF:
步进电机:
程序如下:
接收程序:
#include
#include
typedefunsignedcharuchar;
typedefunsignedcharuint;
ucharcodeF_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48};
ucharcodeB_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08};
voidDelay1(unsignedinti)
{
ucharx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
voidopendoor()
{uchari;
uchark=128;
while(k--)
for(i=0;i<8;i++)
{
P1=F_Rotation[i];
Delay1
(1);
}}
voidclosedoor()
{uchari;
uchark=128;
while(k--)
for(i=0;i<8;i++)
{
P1=B_Rotation[i];//逆时针转动
Delay1
(1);
}}
sbitMISO=P2^2;
sbitMOSI=P3^2;
sbitSCK=P2^6;
sbitCE=P2^5;
sbitCSN=P2^7;
sbitIRQ=P2^3;
sbitKEY=P2^1;
ucharTxBuf[32]=
{
0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
Ucharseg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
#defineTX_ADR_WIDTH5//5uintsTXaddresswidth
#defineRX_ADR_WIDTH5//5uintsRXaddresswidth
#defineTX_PLOAD_WIDTH32//20uintsTXpayload
#defineRX_PLOAD_WIDTH32//20uintsTXpayload
uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址
uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址
#defineREAD_REG0x00//读寄存器指令
#defineWRITE_REG0x20//写寄存器指令
#defineRD_RX_PLOAD0x61
#defineWR_TX_PLOAD0xA0
#defineFLUSH_TX0xE1
#defineFLUSH_RX0xE2
#defineREUSE_TX_PL0xE3
#defineNOP0xFF
#defineCONFIG0x00
#defineEN_AA0x01
#defineEN_RXADDR0x02
#defineSETUP_AW0x03
#defineSETUP_RETR0x04
#defineRF_CH0x05
#defineRF_SETUP0x06
#defineSTATUS0x07
#defineOBSERVE_TX0x08
#defineCD0x09
#defineRX_ADDR_P00x0A
#defineRX_ADDR_P10x0B
#defineRX_ADDR_P20x0C
#defineRX_ADDR_P30x0D
#defineRX_ADDR_P40x0E
#defineRX_ADDR_P50x0F
#defineTX_ADDR0x10
#defineRX_PW_P00x11
#defineRX_PW_P10x12
#defineRX_PW_P20x13
#defineRX_PW_P30x14
#defineRX_PW_P40x15
#defineRX_PW_P50x16
#defineFIFO_STATUS0x17
voidDelay(unsignedints);
voidinerDelay_us(unsignedcharn);
voidinit_NRF24L01(void);
uintSPI_RW(uintuchar);
ucharSPI_Read(ucharreg);
voidSetRX_Mode(void);
uintSPI_RW_Reg(ucharreg,ucharvalue);
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);
uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);
voidnRF24L01_TxPacket(unsignedchar*tx_buf);
voidDelay(unsignedints)
{
unsignedinti;
for(i=0;i
for(i=0;i
}
uintbdatasta;//状态标志
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
voidinerDelay_us(unsignedcharn)
{
for(;n>0;n--)
_nop_();
}
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0;
CSN=1;
SCK=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//写本地地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写接收端地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,0);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
}
uintSPI_RW(uintuchar)
{
uintbit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(uchar&0x80);
uchar=(uchar<<1);
SCK=1;
uchar|=MISO;
SCK=0;
}
return(uchar);
}
ucharSPI_Read(ucharreg)
{
ucharreg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);}
uintSPI_RW_Reg(ucharreg,ucharvalue)
{
uintstatus;
CSN=0;
SPI_RW(value);
CSN=1;
return(status);}
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)
{
uintstatus,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctrpBuf[uchar_ctr]=SPI_RW(0);
CSN=1;
return(status);}
uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)
{
uintstatus,uchar_ctr;
CSN=0;//SPI使能
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctrCSN=1;//关闭SPI
return(status);//
}
/*功能:
数据接收配置
voidSetRX_Mode(void)
{
CE=0;
CE=1;
inerDelay_us(130);
}
/*功能:
数据读取后放如rx_buf接收缓冲区中
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)
{
unsignedcharrevale=0;
sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况
if(RX_DR)//判断是否接收到数据
{
CE=0;//SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer
revale=1;//读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
returnrevale;
}
/*功能:
发送tx_buf中数据
voidnRF24L01_TxPacket(unsignedchar*tx_buf)
{
CE=0;//StandByI模式
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//装载数据
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//IRQ收发完成中断响应,16位CRC,主发送
CE=1;//置高CE,激发数据发送
inerDelay_us(10);
}
voidStartUART(void)
{//波特率4800
SCON=0x50;
TMOD=0x20;
TH1=0xFA;
TL1=0xFA;
PCON=0x00;
TR1=1;
}
voidR_S_Byte(ucharR_Byte)
{
SBUF=R_Byte;
while(TI==0);//查询法
TI=0;
}
voidmain(void)
{
ucharFB_flag=0;
uchari,temp=0;
ucharRxBuf[32];
init_NRF24L01();
StartUART();
Delay(6000);
while
(1)
{
SetRX_Mode();
if(nRF24L01_RxPacket(RxBuf))
{
SPI_RW_Reg(WRITE_REG+CONFIG,0x0d);
if(RxBuf[0]==TxBuf[0]&&RxBuf[1]==TxBuf[1]&&RxBuf[2]==TxBuf[2])
FB_flag=1;
while(FB_flag==0);
while(FB_flag==1)
{opendoor();
FB_flag=0;
}
while(KEY!
=0);
if(KEY==0)
{
while(KEY!
=1);
Delay1(2000);
closedoor();
}
}
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
Delay(200000);
for(i=0;i<32;i++)
RxBuf[i]=0;
}
}
发送程序:
#include
#include
typedefunsignedcharuchar;
typedefunsignedcharuint;
sbitMISO=P2^2;
sbitMOSI=P3^2;
sbitSCK=P2^6;
sbitCE=P2^5;
sbitCSN=P2^7;
sbitIRQ=P2^3;
#defineTX_ADR_WIDTH5//5uintsTXaddresswidth
#defineRX_ADR_WIDTH5//5uintsRXaddresswidth
#defineTX_PLOAD_WIDTH32//20uintsTXpayload
#defineRX_PLOAD_WIDTH32//20uintsTXpayload
uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址
uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址
#defineREAD_REG0x00//读寄存器指令
#defineWRITE_REG0x20//写寄存器指令
#defineRD_RX_PLOAD0x61
#defineWR_TX_PLOAD0xA0
#defineFLUSH_TX0xE1
#defineFLUSH_RX0xE2
#defineREUSE_TX_PL0xE3
#defineNOP0xFF
#defineCONFIG0x00
#defineEN_AA0x01
#defineEN_RXADDR0x02
#defineSETUP_AW0x03
#defineSETUP_RETR0x04
#defineRF_CH0x05
#defineRF_SETUP0x06
#defineSTATUS0x07
#defineOBSERVE_TX0x08
#defineCD0x09
#defineRX_ADDR_P00x0A
#defineRX_ADDR_P10x0B
#defineRX_ADDR_P20x0C
#defineRX_ADDR_P30x0D
#defineRX_ADDR_P40x0E
#defineRX_ADDR_P50x0F
#defineTX_ADDR0x10
#defineRX_PW_P00x11
#defineRX_PW_P10x12
#defineRX_PW_P20x13
#defineRX_PW_P30x14
#defineRX_PW_P40x15
#defineRX_PW_P50x16
#defineFIFO_STATUS0x17
voidDelay1(unsignedinti);
voidDelay(unsignedints);
voidinerDelay_us(unsignedcharn);
voidinit_NRF24L01(void);
uintSPI_RW(uintuchar);
ucharSPI_Read(ucharreg);
voidSetRX_Mode(void);
uintSPI_RW_Reg(ucharreg,ucharvalue);
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);
uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);
voidnRF24L01_TxPacket(unsignedchar*tx_buf);
voidDelay1(unsignedinti)
{
ucharx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
voidDelay(unsignedints)
{
unsignedinti;
for(i=0;i
for(i=0;i
}
uintbdatasta;//状态标志
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
voidinerDelay_us(unsignedcharn)
{
for(;n>0;n--)
_nop_();
}
voidinit_NRF24L01(void)