停车场智能车位引导系统结题答辩支撑材.docx

上传人:b****6 文档编号:5677850 上传时间:2022-12-31 格式:DOCX 页数:18 大小:851.85KB
下载 相关 举报
停车场智能车位引导系统结题答辩支撑材.docx_第1页
第1页 / 共18页
停车场智能车位引导系统结题答辩支撑材.docx_第2页
第2页 / 共18页
停车场智能车位引导系统结题答辩支撑材.docx_第3页
第3页 / 共18页
停车场智能车位引导系统结题答辩支撑材.docx_第4页
第4页 / 共18页
停车场智能车位引导系统结题答辩支撑材.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

停车场智能车位引导系统结题答辩支撑材.docx

《停车场智能车位引导系统结题答辩支撑材.docx》由会员分享,可在线阅读,更多相关《停车场智能车位引导系统结题答辩支撑材.docx(18页珍藏版)》请在冰豆网上搜索。

停车场智能车位引导系统结题答辩支撑材.docx

停车场智能车位引导系统结题答辩支撑材

停车场智能车位引导系统结题答辩支撑材

我们的成果:

一、自己独立设计了一个CC2430模块PCB电路板:

巴伦设计描述

巴伦的目的是在TX模式下,把两个差分RF引脚的输出结合为一个单端50欧姆RF信号,以及在RX模式下把单端50欧姆天线信号分成一个差分RF信号。

提供给输出阶段的阻抗匹配以及DC也在巴伦中实现。

这个巴伦设计包括两个用于阻抗匹配的组件(L1和L3),一个RF块(L2),以及一个DC块(C2)。

除了上述四个分立组件,还有一个1/2波长的长传输线,用于保证正确的RF信号相位,以及一个70欧姆、23°的传输线用于阻抗匹配。

为了实现合适的性能,适当长度的传输线,以及图4和表1所定义的L2连接点是很重要的。

L3和1/2波长传输线之间的布线的适当尺寸也很重要。

选择这个布线的尺寸以确保合适的阻抗匹配。

巴伦布线的阻抗受第1层布线与下面接地平面之间距离的影响。

CC2420和CC2430EM

的参考设计都使用了1mm厚的两层FR4基板。

强烈建议使用相同的板厚度和基板类型,以达到合适的传输线阻抗。

如果这是不可行的,巴伦和下面接地平面之间的1mm距离可以通过使用一个内部接地层实现。

CC2420和CC243x的最佳阻抗略有不同。

为了获得与巴伦匹配的合适阻抗,除了L1的值之外,可以使用相同的布局和组件值。

对于CC2420,L1应为8.2nH,对于CC2430和CC2480,应为6.8nH。

图2和图3展示了CC2420EM和CC243xEM参考设计中巴伦的原理图。

我设计的PCB电路图:

原理图:

图1

图2

二、应用超声波实现粗略的测距

1、产品特点:

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

基本工作原理:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声

波从发射到返回的时间。

测试距离=(高电平时间*声速(340M/S))/2;

3、电气参数:

4、超声波时序图:

以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。

一旦检测到有回波信号则输出回响信号。

回响信号的脉冲宽度与所测的距离成正比。

由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。

公式:

uS/58=厘米或者uS/148=英寸;或是:

距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

注:

(1)此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响

模块的正常工作。

(2)测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的

结果

5、51单片机的测试程序:

//晶振=8M

//MCU=STC10F04XE

//P0.0-P0.6共阳数码管引脚

//Trig=P1^0

//Echo=P3^2

#include//包括一个52标准内核的头文件

#defineucharunsignedchar//定义一下方便使用

#defineuintunsignedint

#defineulongunsignedlong

//***********************************************

sfrCLK_DIV=0x97;//为STC单片机定义,系统时钟分频

//为STC单片机的IO口设置地址定义

sfrP0M1=0X93;

sfrP0M0=0X94;

sfrP1M1=0X91;

sfrP1M0=0X92;

sfrP2M1=0X95;

sfrP2M0=0X96;

//***********************************************

sbitTrig=P1^0;//产生脉冲引脚

sbitEcho=P3^2;//回波引脚

sbittest=P1^1;//测试用引脚

ucharcodeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9

uintdistance[4];//测距接收缓冲区

ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;//自定义寄存器

ucharSHZ[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

ucharWZH[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

ucharFZ[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

sbitdula=P2^6;

sbitwela=P2^7;

bitsucceed_flag;//测量成功标志

//********函数声明

voidconversion(uinttemp_data);

voiddelay_20us();

voiddelay(uintk);

voiddisplay(uchara,ucharb,ucharc);

//voidpai_xu();

voidmain(void)//主程序

{uintdistance_data,a,b;

ucharCONT_1;

CLK_DIV=0X03;//系统时钟为1/8晶振(pdf-45页)

P0M1=0;//将io口设置为推挽输出

P1M1=0;

P2M1=0;

P0M0=0XFF;

P1M0=0XFF;

P2M0=0XFF;

i=0;

flag=0;

test=0;

Trig=0;//首先拉低脉冲输入引脚

TMOD=0x11;//定时器0,定时器1,16位工作方式

TR0=1;//启动定时器0

IT0=0;//由高电平变低电平,触发外部中断

ET0=1;//打开定时器0中断

//ET1=1;//打开定时器1中断

EX0=0;//关闭外部中断

EA=1;//打开总中断0

while

(1)//程序循环

{

EA=0;

Trig=1;

delay_20us();

Trig=0;//产生一个20us的脉冲,在Trig引脚

while(Echo==0);//等待Echo回波引脚变高电平

succeed_flag=0;//清测量成功标志

EX0=1;//打开外部中断

TH1=0;//定时器1清零

TL1=0;//定时器1清零

TF1=0;//

TR1=1;//启动定时器1

EA=1;

while(TH1<30);//等待测量的结果,周期65.535毫秒(可用中断实现)

TR1=0;//关闭定时器1

EX0=0;//关闭外部中断

if(succeed_flag==1)

{

distance_data=outcomeH;//测量结果的高8位

distance_data<<=8;//放入16位的高8位

distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据

distance_data*=12;//因为定时器默认为12分频

distance_data/=58;//微秒的单位除以58等于厘米

}//为什么除以58等于厘米,Y米=(X秒*344)/2

//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58

if(succeed_flag==0)

{

distance_data=0;//没有回波则清零

test=!

test;//测试灯变化

}

a=distance_data;

if(b==a)CONT_1=0;

if(b!

=a)CONT_1++;

if(CONT_1>=3)

{CONT_1=0;

b=a;

conversion(b);

}

display(ge,shi,bai);

///i=0;

///}

}

}

//***************************************************************

//外部中断0,用做判断回波电平

INTO_()interrupt0//外部中断是0号

{

outcomeH=TH1;//取出定时器的值

outcomeL=TL1;//取出定时器的值

succeed_flag=1;//至成功测量的标志

EX0=0;//关闭外部中断

}

//****************************************************************

//定时器0中断,用做显示

timer0()interrupt1//定时器0中断是1号

{

TH0=0xfd;//写入定时器0初始值

TL0=0x77;

switch(flag)

{case0x00:

flag++;break;

case0x01:

flag++;break;

case0x02:

flag=0;break;

}

}

//显示数据转换程序

voidconversion(uinttemp_data)

{

ucharge_data,shi_data,bai_data;

bai_data=temp_data/100;

temp_data=temp_data%100;//取余运算

shi_data=temp_data/10;

temp_data=temp_data%10;//取余运算

ge_data=temp_data;

EA=0;

bai=bai_data;

shi=shi_data;

ge=ge_data;

EA=1;

}

//******************************************************************

voiddelay_20us()

{ucharbt;

for(bt=0;bt<100;bt++);

}

voiddelay(uintk)

{

uintx,y;

for(x=k;x>0;x--)

for(y=110;y>0;y--);

}

voiddisplay(uchara,ucharb,ucharc/*uchard,uchare,ucharf*/)

{

wela=1;

P0=WZH[0];

wela=0;

P0=0x00;

dula=1;

P0=SHZ[a];

dula=0;

P0=0xff;

delay

(1);

dula=1;

P0=0x00;

dula=0;

wela=1;

P0=WZH[1];

wela=0;

P0=0x00;

dula=1;

P0=SHZ[b];

dula=0;

P0=0xff;

delay

(1);

dula=1;

P0=0x00;

dula=0;

wela=1;

P0=WZH[2];

wela=0;

P0=0x00;

dula=1;

P0=FZ[c];

dula=0;

P0=0xff;

delay

(1);

dula=1;

P0=0x00;

dula=0;

}

三、能够用CC2430实现两点的通信和简单的两点之间的测距:

CC2430两点的通信和简单的两点之间的测距原理通过比较发射端的信号强度和接收短信号强度的衰减来进行测距

1、数据发送程序为:

staticvoidappTransmitter()

{

uint32burstSize=0;

uint32pktsSent=0;

uint8appTxPower,Sendflag=0;

uint8n;

chardataTransmitter[]="Sending:

";

//InitializeBasicRF

basicRfConfig.myAddr=TX_ADDR;

if(basicRfInit(&basicRfConfig)==FAILED){

HAL_ASSERT(FALSE);

}

//SetTXoutputpower

appTxPower=appSelectOutputPower();

halRfSetTxPower(appTxPower);

//Setburstsize

burstSize=appSelectBurstSize();

//BasicRFputsonreceiverbeforetransmissionofpacket,andturnsoff

//afterpacketissent

basicRfReceiveOff();

//ConfigtimerandIO

appConfigTimer(PACKET_RATE);

halJoystickInit();

//Initalisepacketpayload

txPacket.seqNumber=0;

txPacket.padding[0]=0x01;//我改的

/****************************我改的

for(n=0;n

txPacket.padding[n]=n;

}***************************************/

//halLcdClear();

//halLcdWriteLines("PERTester","JoystickPush","start/stop");

halLedClearAll();

halLedSet

(1);//appTransmitter模式LED1亮

SendStringData(0,dataTransmitter,sizeof(dataTransmitter),0);//我改的

//Mainloop

while(TRUE){

//Waitforusertostartapplication

while(!

halJoystickPushed());

appStartStop();

//halLcdClear();

//halLcdWriteLines("PERTester","Transmitter",NULL);

while(appStarted){

halLedSet(4);

if(halJoystickPushed()){

appStartStop();

}

if(pktsSent

if(appState==TRANSMIT_PACKET){

//Makesuresequencenumberhasnetworkbyteorder

UINT32_HTON(txPacket.seqNumber);

Sendflag=basicRfSendPacket(RX_ADDR,(uint8*)&txPacket,PACKET_SIZE);

//Changebyteorderbacktohostorderbeforeincrement

UINT32_NTOH(txPacket.seqNumber);

txPacket.seqNumber++;

pktsSent++;

#ifdefSRF04EB

halLcdDisplayValue(HAL_LCD_LINE_2,"Sent:

",(int32)pktsSent,NULL);

#else

halLcdDisplayValue(HAL_LCD_LINE_3,"Sent:

",(int32)pktsSent,NULL);

#endif

appState=IDLE;

}

}

else

{

appStarted=!

appStarted;

}

if(Sendflag==0)

{

halMcuWaitMs(100);

halLedClear(4);

halMcuWaitMs(100);

}

}

//Resetstatisticsandsequencenumber

pktsSent=0;

txPacket.seqNumber=0;

halLcdClear();

//halLedClear(3);

//halLcdWriteLines("PERTest","JoystickPush","start/stop");

}

}

2、接收程序:

staticvoidappReceiver()

{

uint32segNumber=0;

int16perRssiBuf[RSSI_AVG_WINDOW_SIZE]={0};//RingbufferforRSSI

uint8perRssiBufCounter=0;//Countertokeeptrackofthe

//oldestnewestbyteinRSSI

//ringbuffer

perRxStats_trxStats={0,0,0,0};

int16rssi;

chardataReceiver[]="Receiving:

";

#ifdefINCLUDE_PA

uint8gain;

//Selectgain(formoduleswithCC2590/91only)

gain=appSelectGain();

halRfSetGain(gain);

#endif

//InitializeBasicRF

basicRfConfig.myAddr=RX_ADDR;

if(basicRfInit(&basicRfConfig)==FAILED){

HAL_ASSERT(FALSE);

}

basicRfReceiveOn();

//halLcdClear();

//halLcdWriteLines("PERTester","Receiver","Ready");

halLedClearAll();

halLedSet(3);//appReceiver模式LED3亮

SendStringData(0,dataReceiver,sizeof(dataReceiver),0);//我改的

//Mainloop

while(TRUE){

while(!

basicRfPacketIsReady());

if(basicRfReceive((uint8*)&rxPacket,MAX_PAYLOAD_LENGTH,&rssi)>0){

//Changebyteorderfromnetworktohostorder

UINT32_NTOH(rxPacket.seqNumber);

segNumber=rxPacket.seqNumber;

//SubtractoldRSSIvaluefromsum

rxStats.rssiSum-=perRssiBuf[perRssiBufCounter];

//StorenewRSSIvalueinringbuffer,willaddittosumlater

perRssiBuf[perRssiBufCounter]=rssi;

//AddthenewRSSIvaluetosum

rxStats.rssiSum+=perRssiBuf[perRssiBufCounter];

if(++perRssiBufCounter==RSSI_AVG_WINDOW_SIZE){

perRssiBufCounter=0;//Wrapringbuffercounter

}

//Checkifreceivedpacketistheexpectedpacket

if(rxStats.expectedSeqNum==segNumber){

rxStats.expectedSeqNum++;

}

//Ifthereisajumpinthesequencenumberingthismeanssomepacketsin

//betweenhasbeenlost.

elseif(rxStats.expectedSeqNum

rxStats.lostPkts+=segNumber-rxStats.expectedSeqNum;

rxStats.expectedSeqNum=segNumber+1;

}

//Ifthesequencenumberislowerthanthepreviousone,wewillassumea

//newdatabursthasstartedandwewillresetourstatisticsvariables.

else{

//Updateourexpectationsassumingthisisanewburst

rxStats.expectedSeqNum=segNumber+1;

rxStats.rcvdPkts=0;

rxStats.lostPkts=0;

}

rxStats.rcvdPkts++;

//resetstatisticsifbutton1ispressed

if(HAL_BUTTON_1_PUSHED()){

rxStats.expectedSeqNum=segNumber+1;

rxStats.rcvdPkts=0;

rxStats.los

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1