完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 birdinskyd***sy 于 2016-2-26 19:08 编辑 其实前边的铺垫工作已经做得比较充分了,要完成我们的测速仪那简直是立等可取,当然做出一款高可靠性、轻便、易维护、操作简单、待机持久、样式美观的产品的话是另一回事了,我们只是从试用的角度玩耍一下rsp1,顺便增长点雷达的姿势。 现在剩下的工作就是计算速度和显示速度了。我们回想一下所有前边有关测速的实验, 要计算速度需要知道的数据 1.采样率 2.速度的频点数,然后根据公式可以推导出物体速度的km/h的形式,采样率相对来讲是不变的,当物体的速度在当前采样率搞不定的范围,那时才需要调整采样率,所以一般计算前只需要获取一次采样率即可;速度频点的获取则是需要不断进行的,是个循环的过程,物体在运动,速度在变化,实时性很强,所以程序好坏就再这里比功力了,偶写的马马虎虎,反正累死51就换一个,能显示出数来就好。 所以,我们需要一个获取采样率的键(按下后获取采样率并显示),一个测速的键(按下后不断循环获取频点计算速度显示速度,再按停止,再按开始),一个升高采样率的键(即频率变大,按下后发出采样率设置命令,显示返回的采样率),一个降低采样率的键(即频率降低,按下后发出采样率设置命令,显示返回的采样率),至于电源开关什么的不在玩耍范围内。 ........... /*rsp1命令字符串*/ uchar idata trvision[]={'$','R','0','4',0x0d,0x0a,0x00};//版本 uchar idata trspeedq[]={'$','R','0','1',0x0d,0x0a,0x00};//速度 uchar idata trrateq[]={'$','S','0','2',0x0d,0x0a,0x00};//采样率请求 uchar idata trrateset[]={'$','S','0','2','0','1',0x0d,0x0a,0x00};//采样率设置,trrateset[5] 是要设置的采样率值 uchar idata tcache[20]; //缓存存数组,长度根据需要 ,能够存储返回值即可 uchar icatch=0;//缓存写入索引 uint zz; //速度请求辅助计时 ***it K1=P3^2; // K1 询问版本 ***it K2=P3^3; // K2 采样率升高 ***it K3=P3^4; // K3 采样率降低 ***it K5=P1^4; //K5 询问速度 ***it K6=P1^5; //K6 询问采样率 ***it K7=P1^6; //K7 发送接受到的信息 ***it K8=P1^7; //K8 循环请求显示速度开关 ........ /********请求速度***********/ void Uart_SendSpeedRequest() { uchar i=0; while(trspeedq!=0x00) { SBUF=trspeedq; while(!ti); TI=0; i++; } } /********请求采样率***********/ void Uart_SendRateRequest() { uchar i=0; while(trrateq!=0x00) { SBUF=trrateq; while(!TI); TI=0; i++; } } /********设置采样率***********/ void Uart_SendRateSet() { uchar i=0; while(trrateset!=0x00) { SBUF=trrateset; while(!TI); TI=0; i++; } } 。。。。。。 //主函数 void main(void) { T0_init(); UART_Init(); //初始化串口 Catche_Init(); //初始化缓存 while(1) { if(K1==0) { delayms(20); if(K1==0) { Uart_SendVisionRequest(); //请求版本 while(!K1); //等待按键释放 } } else if(K2==0) { delayms(20); if(K2==0) { //采样率升高 if(trrateset[5]<0x39) { trrateset[5] = trrateset[5]+1; } Uart_SendRateSet(); while(!K2); //等待按键释放 } } else if(K3==0) { delayms(20); if(K3==0) { //采样率升高 if(trrateset[5]>0x31) { trrateset[5] = trrateset[5]-1; } Uart_SendRateSet(); //请求版本 while(!K3); //等待按键释放 } } else if(K5 == 0) { delayms(20); if(K5 == 0) { Uart_SendSpeedRequest(); //请求速度 while(!K5); //等待按键释放 } } else if(K6 == 0) { delayms(20); if(K6 == 0) { Uart_SendRateRequest(); //请求采样率 while(!K6); //等待按键释放 } } else if(K7==0) { delayms(20); if(K7==0) { Uart_SendReceived();//发送接受到的串口信息 while(!K7); //等待按键释放 } } else if(K8==0) //请求速度开关 { delayms(20); if(K8==0) { if(TR0==0) { TR0=1; while(!K8); } else { TR0=0; while(!K8); } } } display(0);//rsp1返回的第3个字符 display(1);//rsp1返回的第4个字符 display(2);//rsp1返回的第5个字符 display(3);//rsp1返回的第6个字符 } } ................... /********定时器T0的中断服务程序*******/ void Time0(void) interrupt 1 using 0 { zz=zz+1; if(zz==400){ //D0=~D0; //按位取反操作,将P0.0引脚输出电平取反 Uart_SendRateRequest(); zz=0; } TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值 TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值 } ................. 用工具测试下51获取速度和调节采样率的功能,上边是获取速度的命令,下边是调节采样率, 然后51和rsp1连到一起,测试,现在还没有转换速度,显示的应该是频点数, 经过测试发现了个错误,采样率命令命令需要修改下, 改成 获取速度频点数显示,1秒左右请求一次,手不停在rsp1前晃,后四位即频点数 调节采样率,调到03 版本信息,0418 又改了下程序,增加了十进制显示速度频点数, 最后,测速时转换下速度变成千米/时,回顾前边的测速实验,当 S03 的值 为1时,V = N * 5 / 44 值为 2 时 V= N * 10 / 44 值为3时 V= N * 15 / 44 。。。。。 值为8时 V=N * 40 /44 值为9时 V=N * 44 /44 值为A时 V=N * 88 / 44 所以,用一个长度为10的整数数组存储5、10、15。。。40、44、88,N就是频点数,将频点数转换成千米/时就是一步计算的事情,然后显示到数码管,加上小数点,或者显示4位数字,两位数小数点前,两位数小数点后。 上最后一张图,4位数字,两位整数部分两位小数部分显示,在rsp1前轻轻挥手,速度显示为3.06千米/时,当然数字是不断变化的,还可以调节采样率,以适应不动速度范围。 基本上大功告成,把这个包装包装,拿出去卖6000大洋有人买么???嘎嘎嘎,九成没有!还是总结下,总结是个好习惯,这是2016年第一次总结,比2015年来得早了一些,这次,花费了4个帖子的篇幅和20天左右的精力,当然除去过年大吃大喝走亲访友的时间,让51和rsp1连手了一下共同迎来了猴年,重温了忘却已久的串口通信、定时器、中断、数码管,打造了一台简约而不简单的测速仪,忙活了好一阵,又收获了不少知识,真是新年新气象,开年大吉,预示着猴年比大有作为,大有收获。 |
|
相关推荐
2 个讨论
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 21:23 , Processed in 0.460200 second(s), Total 46, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号