电子设计大赛-汽车行车时间检测器.doc_第1页
电子设计大赛-汽车行车时间检测器.doc_第2页
电子设计大赛-汽车行车时间检测器.doc_第3页
电子设计大赛-汽车行车时间检测器.doc_第4页
电子设计大赛-汽车行车时间检测器.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

哈尔滨工业大学(威海)第四届电子设计大赛汽车行车时间检测器作者:队员学号联系方式摘要:本作品通过stc89c52单片机和必要外围电路实现一个驾驶员的防疲劳,检测连续行车时间系统。作品主要由两部分组成:警车的接收端和普通车的客户端。接受和发射部分使用由nrf24l01组成的发射电路,通过api总线与单片机通讯。作品中涉及单片机的io口模拟api总线、无线双机通讯,数码管显示,键盘控制,18b20数字温度芯片,iic总线操作等部分。发送和接受采用间歇通讯方式,降低能耗。abstract:this works by stc89c52 microcontroller and external circuitry necessary to implement a pilot anti-fatigue, test driving a continuous-time systems. works mainly consists of two parts: the receiving end of police vehicles and ordinary vehicles client. receive and transmitter used by nrf24l01 consisting of transmitter, through the api bus with mcu. works involved in the scm api bus io port simulation, wireless communication between two computers, digital display, keyboard control, 18b20 digital temperature chip, iic bus operators and other parts. send and receive intermittent communication, reduce energy consumption.关键词:无线 计时 报警 2.4ghz工作频率 spi总线目录前言4总体方案设计4编码方式如下4单片机内程序的设计6用户车端6警车端6使用方法7理论分析与计算7电路与程序设计8发射和接收电路8部分接收程序8部分发射程序9测试数据9调试方法与仪器9测试方法和步骤10测试结果分析10参考文献10总结10附录11nrf24l01引脚11nrf24l01在altium designer里面的原理图11nrf24l01引脚图12全部程序12警车程序12用户车程序2812864i.h里面所包含的程序42前言:汽车运行超时检测报警器的实际应用非常广泛,现在由于驾驶员疲劳驾驶出现的交通事故越来越多,所以这样一个记录驾驶员连续行车时间并发送给交通警察的系统有广泛的应用价值。总体方案设计作品主要以stc89c52为核心,通过nrf24l01无线通讯芯片实现双机通讯。通讯过程中双机间每次发送24位(3字节)数据。其中包括车牌信息、车型信息和指令。在警车端回馈的信息里面还包括所要设定的时间信息。由于每次发送数据和接受数据里面都包含车牌位,所以警车端程序可以识别发来车的车牌,用户车端也可以分辨是否发送的数据是发至本车牌的,实现主机可以分辨多机同时发送数据的情况和用户id可变。计时器采用单片机的定时器0,使计时比较准确。编码方式如下:00111111第一字节01001102五位时间11111031101004车型位车型位车型位车型位车型位车型位567车牌位车牌位车牌位车牌位车牌位车牌位车牌位89第二字节1011121314151617第三字节18192021222324警车回馈时间信号警车回馈取消警报信号用户车短暂停车信号(即通过收费站或者交通岗)用户车停车休息信号用户车正常信号用户车超时信号用户车启动信号单片机内程序的设计单片机程序设计分为两部分:用户车端和警车端。用户车端:主要由spi总线模拟程序的无线发射和计时报警部分组成。即使部分使用51单片机内所带的定时器0计时,比较准确。还包括用6位数码管显示行车时间的显示函数和键盘扫描函数。开机自动向主机发送车辆启动信号,当接到警车回复的允许的行车时间后,开始计时。在正常行车时间内,每隔20秒向警车发送一次正常行车信号,间断的信号可以降低能耗。当行车超时后,作品发出蜂鸣器报警(即题目所要求的声音提示),提示停车,并像警车端发送超时信号,接到警车的回馈信号后,作品停止报警。如果警车发回信号后,1分钟后仍然没有停车休息,系统将继续报警。如果驾驶员短暂停车,用户车发送指令至警车,说明该车短暂停车。如果驾驶员停车时间超过设定时间,认为其停车休息,发送指令至警车,说明停车休息,并停止计时。警车端:警车端先于用户车端启动,并初始化后进入接收模式,当接到有车发送启动信号后,读取其车的车型和车牌号并显示在12864液晶屏幕上,要求警察输入该车的行车时间(以秒计)。确认后发送至用户车。此处时间为以秒记,以便测试效果时间较短,在实际应用时应改为以小时为单位,警车可以设定的最大时间为32小时(即上面编码的5个时间位)。当接到用户车正常行车时在12864液晶屏幕上显示车牌号极其车型。当接到有车超时时引发蜂鸣器报警,并发送回馈停车信号。使其在一分钟内停车休息。警车端还可以实时查询用户车行车时的温度。发送信息至用户车端,使其通过18b20读取温度数据并传输回警车端。使用方法:警车端应先开机,当有用户车启动时,用户车向警车发送信号,说明启动,信号包括车型和车牌号码和4位指令位。警车接到启动信息后,为该车设定行车时间,发送给该用户车,用户车接到行车时间后开始计时。在没有超时的情况下,每隔20秒给警车发送一次正常行车信号。超时后发送超时信号给警车并用蜂鸣器发出警告,直到警车收到信号,并发送回反馈信号,警报结束。如果1分钟内,驾驶员仍然没有停车休息,蜂鸣器再次发出警报。作品可以实现对于用户车暂短停车和长时间停车的判断。由于每个车在发送信号的时候都会包括指令位和车型、车牌位。这样警车在每次接到信号的时候都会区分发信号的车辆,排除多机同时向警车端发信号的干扰问题。在警车端处理一个车发来信号的时候,如果有其他车辆发送信号,信号会先被存储在nrf24l01芯片中,在警车端发出当前车时间信号后,读取并处理等待车发来的信号。理论分析与计算无线通信(wireless communication)是利用电磁波信号可以在自由空间中传播的特性进行信息交换的一种通信方式,近些年信息通信领域中,发展最快、应用最广的就是无线通信技术。无线部分采用nrf24l01,有四种发射功率,作品在做的时候选用的最高功率。供电可以在1.9v和3.3v之间。待机模式电流为22ua,符合题目要求。采用2.4ghz的频率进行通讯,全球开放ism频段免许可使用。单片机与无线模块间采用spi总线进行串行通讯。spi是英文serial peripheral interface的缩写,中文意思是串行外围设备接口,spi是motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,因其硬件功能很强,与spi有关的软件就相当简单,使cpu有更多的时间处理其他事务。电路与程序设计发射和接收电路:部分接收程序void rx_mode(void)ce=0; spi_write_buf(write_reg + rx_addr_p0, tx_address, tx_adr_width); / use the same address on the rx device as the tx device spi_rw_reg(write_reg + en_aa, 0x01); / enable auto.ack:pipe0 spi_rw_reg(write_reg + en_rxaddr, 0x01); / enable pipe0 spi_rw_reg(write_reg + rf_ch, 40); / select rf channel 40 spi_rw_reg(write_reg + rx_pw_p0, tx_pload_width); / select same rx payload width as tx payload width spi_rw_reg(write_reg + rf_setup, 0x07); / tx_pwr:0dbm, datarate:2mbps, lna:hcurr spi_rw_reg(write_reg + config, 0x0f); / set pwr_up bit, enable crc(2 bytes) & prim:rx. rx_dr enabled. ce = 1; / set ce pin high to enable rx device / this device is now ready to receive one packet of 16 bytes payload from a tx device sending to address / 3443101001, with auto acknowledgment, retransmit count of 10, rf channel 40 and datarate = 2mbps.部分发射程序void tx_mode(void)ce=0; spi_write_buf(write_reg + tx_addr, tx_address, tx_adr_width); / writes tx_address to nrf24l01 spi_write_buf(write_reg + rx_addr_p0, tx_address, tx_adr_width); / rx_addr0 same as tx_adr for auto.ack spi_write_buf(wr_tx_pload, tx_buf, tx_pload_width); / writes data to tx payload spi_rw_reg(write_reg + en_aa, 0x01); / enable auto.ack:pipe0 spi_rw_reg(write_reg + en_rxaddr, 0x01); / enable pipe0 spi_rw_reg(write_reg + setup_retr, 0x1a); / 500us + 86us, 10 retrans. spi_rw_reg(write_reg + rf_ch, 40); / select rf channel 40 spi_rw_reg(write_reg + rf_setup, 0x07); / tx_pwr:0dbm, datarate:2mbps, lna:hcurr spi_rw_reg(write_reg + config, 0x0e); / set pwr_up bit, enable crc(2 bytes) & prim:tx. max_rt & tx_ds enabled.ce=1;测试数据:调试方法与仪器:用假负载耦合线圈测发射功率。测试方法和步骤:在50米距离上测通讯效果、能耗以及功能实现情况。测试结果分析:作品可以在50米以上的距离进行通讯,电源采用5v供电,工作电流不超过20ma。天线长度超过5cm。发射功率不超过20mw。双机无线通讯最快速度为2mbit/s 在低能耗下满足题目要求,并可以识别多个用户端,对不同用户机发送数据时互不干扰。可以准确计时,并且可识别用户车的暂短停车和长时间停车。参考文献: 郭天祥,电子工业出版社,新概念51单片机c语言教程 杜振民,电子工业出版社,无线通讯原理与应用总结:本产品是由nrf24l01组成的发射电路和stc89c52单片机构成的驾驶员连续行车时间检测系统,并可识别多用户冲突和短暂停车干扰等问题。涉及单片机的io通过spi总线、无线双机通讯,数码管显示,键盘控制,温度读取,iic总线io口模拟,12864液晶的显示控制等部分。达到题目要求。 这次电子设计大赛让我们收获了很多,对单片机编程,外围电路通讯,spi总线通讯,无线通讯等很多知识有了一个深入的了解。附录:1 gnd2 vcc3 ce4 csn5 sck6 mosi7 miso8 irqnrf24l01引脚:nrf24l01在altium designer里面的原理图:nrf24l01引脚图:全部程序:警车程序:/*此程序为警车程序 /*/#include #include #include #include api.h/*this file is distributed in the hope that it will be useful, but without any warrantyt; *uart:9600bps*/*/#define uchar unsigned char#define uint unsigned int#define tx_adr_width 5 / 5 bytes tx(rx) address width#define tx_pload_width 20 / 20 bytes tx payloaduchar const tx_addresstx_adr_width = 0x34,0x43,0x10,0x10,0x01; / define a static tx addressuchar rx_buftx_pload_width;uchar tx_buftx_pload_width;uchar flag;/*/sbit ce = p10;sbit csn= p11;sbit sck= p12;sbit mosi= p13;sbit miso= p14;sbit irq = p15;sbit dula=p26;sbit wela=p27;sbit key=p22;sbit key1=p20;sbit key3=p21;sbit key2=p24;sbit bell=p23;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code qidong=有车启动;uchar code paizhao=车牌号为:;uchar code xing=车型为:;uchar code shijian=key1输入限制时间;uchar code shi=输入的时间为:;uchar code fasong=已发送 ;uchar code kaishijishi=用户车开始计时;uchar code chaoshi=的车超时行驶!;uchar code quxiao=按key3取消警报!;uchar code quxiaoyonghu=用户车警报取消!;uchar code ok=的车未超时!;uchar code xiu=的车停车休息!;uchar code guo=的车短暂停车!;uchar code fa=key4发送;uchar code ke1=key1增加key2减小;/*/uchar bdata sta;sbitrx_dr=sta6;sbittx_ds=sta5;sbitmax_rt=sta4;unsigned int time=0;uchar numt0,num;/*数码管显示函数/*/void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*输入一个六位整数*/*function: init_io();description: flash led one time,chip enable(ready to tx or rx mode), spi disable,spi clock line init high/*/#define key 0xaavoid init_io(void)p0=key;/ led lightce=0;/ chip enablecsn=1;/ spi disablesck=0;/ spi clock line init highp0=0xff;/ led close/*/*function: inituart();description: set uart working mode /*/void inituart(void)tmod = 0x20;/timer1 working mode 1tl1 = 0xfd;/f7=9600 for 16mhz fosc,and . th1 = 0xfd;/.fd=19200 for 11.0592mhz foscscon = 0xd8;/uart mode 3,ren=1pcon = 0x80;/smod=0tr1 = 1;/start timer1/*/*function: init_int0();description: enable int0 interrupt;/*/void init_int0(void)ea=1;ex0=1;/ enable int0 interrupt./*/ /*/void delay_ms(unsigned int x) unsigned int i,j; i=0; for(i=0;ix;i+) j=108; ; while(j-); /*/*function: spi_rw();description: writes one byte to nrf24l01, and return the byte read from nrf24l01 during write, according to spi protocol/*/uchar spi_rw(uchar byte)uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit mosi = (byte & 0x80); / output byte, msb to mosi byte = (byte 1); / shift next bit into msb. sck = 1; / set sck high. byte |= miso; / capture current miso bit sck = 0; / .then set sck low again return(byte); / return read byte/*/*function: spi_rw_reg();description: writes value value to register reg/*/uchar spi_rw_reg(byte reg, byte value)uchar status; csn = 0; / csn low, init spi transaction status = spi_rw(reg); / select register spi_rw(value); / .and write value to it. csn = 1; / csn high again return(status); / return nrf24l01 status byte/*/*function: spi_read();description: read one byte from nrf24l01 register, reg/*/byte spi_read(byte reg)byte reg_val; csn = 0; / csn low, initialize spi communication. spi_rw(reg); / select register to read from. reg_val = spi_rw(0); / .then read registervalue csn = 1; / csn high, terminate spi communication return(reg_val); / return register value/*/*function: spi_read_buf();description: reads bytes #of bytes from register reg typically used to read rx payload, rx/tx address/*/uchar spi_read_buf(byte reg, byte *pbuf, byte bytes)uchar status,byte_ctr; csn = 0; / set csn low, init spi tranaction status = spi_rw(reg); / select register to write to and read status byte for(byte_ctr=0;byte_ctrbytes;byte_ctr+) pbufbyte_ctr = spi_rw(0); / perform spi_rw to read byte from nrf24l01 csn = 1; / set csn high again return(status); / return nrf24l01 status byte/*/*function: spi_write_buf();description: writes contents of buffer *pbuf to nrf24l01 typically used to write tx payload, rx/tx address/*/uchar spi_write_buf(byte reg, byte *pbuf, byte bytes)uchar status,byte_ctr; csn = 0; / set csn low, init spi tranaction status = spi_rw(reg); / select register to write to and read status byte for(byte_ctr=0; byte_ctr10us) on ce will now send this packet and expext an acknowledgment from the rx device./*/void tx_mode(void)ce=0; spi_write_buf(write_reg + tx_addr, tx_address, tx_adr_width); / writes tx_address to nrf24l01 spi_write_buf(write_reg + rx_addr_p0, tx_address, tx_adr_width); / rx_addr0 same as tx_adr for auto.ack spi_write_buf(wr_tx_pload, tx_buf, tx_pload_width); / writes data to tx payload spi_rw_reg(write_reg + en_aa, 0x01); / enable auto.ack:pipe0 spi_rw_reg(write_reg + en_rxaddr, 0x01); / enable pipe0 spi_rw_reg(write_reg + setup_retr, 0x1a); / 500us + 86us, 10 retrans. spi_rw_reg(write_reg + rf_ch, 40); / select rf channel 40 spi_rw_reg(write_reg + rf_setup, 0x07); / tx_pwr:0dbm, datarate:2mbps, lna:hcurr spi_rw_reg(write_reg + config, 0x0e); / set pwr_up bit, enable crc(2 bytes) & prim:tx. max_rt & tx_ds enabled.ce=1;/*/*function: check_ack();description: check if have data sent tx fifo interrupt,if tx_ds=1, all led light and after delay 100ms all led close/*void check_ack()uchar test;test=spi_read(read_reg+status);/ read register statusstest=test&0x20;/ check if have data sent tx fifo interrupt (tx_ds=1)if(test=0x20)/ tx_ds =1p0=0x00;/ turn on all led delay100();/ delay 100msp0=0xff;/*/*function: txdata();description: write data x to sbuf/*/void txdata (uchar x)sbuf=x;/ write data x to sbufwhile(ti=0);ti=0;/*/*function: checkbuttons();description: check buttons ,if have press,read the key values, turn on led and transmit it; after transmition, if received ack, clear tx_ds interrupt and enter rx mode; turn off the led/*/*/void sent(unsigned long int xx)int a1,a2,a3;a1=xx/65536;a2=(xx%65536)/256;a3=xx%256;tx_buf0=a3;/ save to tx_buf0tx_buf1=a2;tx_buf2=a1;tx_mode();/ set tx mode and transmittingtxdata(a1);/ send data to uart/check_ack();/ if have acknowledgment from rx device,turn on all ledspi_rw_reg(write_reg+status,spi_read(read_reg+status);/ clear interrupt flag(tx_ds)delay_ms(500);rx_mode();/ set receive mode/*function: main();description: control all subprogrammes;/*/void main(void)uchar aa,bb,cc,x;uint i;unsigned long int dat;/init0();init_io();/ initialize io portlcd_init();inituart();/ initialize 232 uart/init_int0();/ enable int0 interruptrx_mode();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论