完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 birdinskyd***sy 于 2016-2-17 19:06 编辑 经过一番折腾,51和rsp1的串口都可以和pc通信了,不妨修改下计划,先做个小实验,看看他俩能不能先说个hello啥的。 第一步,先改造下51的程序,按下按键时,让串口发出一条指令,串口接收到信息时,让数码管显示最后一个收到的十六进制数,这个不困难,51串口操作前边提到了,操作数码管也是个基础技能,发送命令就是发送字符串, #include #define uchar unsigned char #define uint unsigned int uchar idata trdata[]={'$','R','0','4',0x0d,0x0a,0x00};//版本 uchar idata trspeedq[]={'$','R','0','1',0x0d,0x0a,0x00};//速度 uchar idata trrateq[]={'$','S','0','2',0x0d,0x0a,0x00};//采样率 这里数组里存上命令,然后以0x0d 0x0a 0x00结尾,d、a是换行,0x00表示字符串结尾, 插上一句关于idata类型的题外话,在51系列中data,idata,xdata,pdata的区别: data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为: mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)。 xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法这里不提。 所以,用到的命令存到一个数组里就行了,按键对应上命令从串口发送出去。接受时,把收到的16进制数显示在数码管上, //串口接收中断函数 void INT_UartRcv(void) interrupt 4 { unsigned char Rcv = 0; if(RI) //查询接收标志位(有数据发送过来时置为1) { RI = 0; //接收标志位清零 Rcv = SBUF; //存储缓冲区的数据 /*************/ num = Rcv; c++; /**************/ Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示 } } 先让末位数码管显示一个数, void display(uchar n) { //P0= table[n & 0xf0 ]; //P2 = DIS_BIT[6]; P0 = table[n & 0x0f]; P2 = DIS_BIT[7]; //P0= table[c]; //P2 = DIS_BIT[5]; //P2=0xff; //P0=0xff; } 主函数调用, //主函数 void main(void) { //P2=0x7f; //P2.7引脚输出低电平,数码显示器第7位接通电源工作 UART_Init(); //初始化串口 while(1) { if(K1==0) { delayms(20); if(K1==0) { Uart_SendString(); //发送数据 while(!K1); //等待按键释放 } } 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); } } //在数码管上显示 display(num);//数码管显示是动态显示的,所以必须要放在while (1)循环中,这样才可以动态显示! //P1 = num; } } 我们发现,串口接受到的正常信息都是“。。。0d 0a”形式的,就是以回车结尾的, 也就是说,如果51向rsp1发送命令后,数码管能显示“A”就说明rsp1正常返回了信息,是以“0x0d 0x0a”结尾的,在通信上没有问题了,外部干扰偶然使数码管显示A的几率和中500万的几率不相上下。 经过工具测试,pc和51、pc和rsp1的串口都能通信,直接连上两个串口实测,51和rsp1接出来的串口都是9针母口,需要用三根杜邦线连上GND、TXD、RXD,5针是GND直连,2、3针交叉连,只需连这三个线即可, 连好后,测试, 按下按键前,数码管显示6, 按下按键,发出命令,接收到响应,数码管显示A 至此可以说我们要打造的多普勒测速仪的任督二脉已经打通了,接下来需要完成的就是完善按键功能,完善算法,让计算结果显示出来,至于外观上做得漂亮些、物理连接上可靠些、接上移动电源比如电池啥的都不是重点关注的问题。 又修改了下程序,8个数码管可以显示接受到的字符,因为只有8个,只能显示4个字符。
|
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:27 , Processed in 0.666540 second(s), Total 69, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号