本帖最后由 wulin 于 2019-3-14 13:17 编辑 izhonguo 发表于 2019-3-13 21:40 izhonguo你好,很赞赏你勤于思考。给你的示例只是我随手写的,简单展示了自定义通讯协议的框架。实际运用的自定义通讯协议要比这复杂些。由于使用环境因素,数据头往往由好几个字节组成,甚至在数据头前加0x00无效数据引导以防数据头错码。验证有效数据的正确性是非常重要的措施。方法也很多,有用数据和、数据和取反+1、计算字节长度等等。目的都是为了保证有效数据的正确性。由于传输的数据帧包含的字节可能不确定,还要增加结束码等等。串口中断函数中还要有自动纪录字节长度,超时不等侯措施。 |
wulin 发表于 2019-3-7 15:54 多谢总工!我再仔细学习一遍。。。 总工牛逼! ![]() ![]() ![]() |
izhonguo 发表于 2019-3-7 00:53 给你改了一下,已经实物验证,供参考。 ![]()
|
wulin 发表于 2019-2-14 08:48 总工,您好: 我自己学习了一下51单片机的串口接收程序,我想把您这个程序改进一下, 做到可以接收比如说从XCOM这类软件发来的八个字符串(比如说1A2B3C4D), 然后写入到dis_buf[8]定义的这个定义的缓存数组中。下面这样子写正确吗?还望不吝赐教!谢谢!
|
izhonguo 发表于 2019-2-21 08:31 不用谢!51单片机的P0口驱动LED、通过三极管驱动继电器,读开关状态之类的低速应用问题不大,高速读写的情况下就要注意了,比如I2C、SPI接口等等 |
kmsj 发表于 2019-2-20 16:01 多谢经验分享,刚接触单片机,还需要多向各位大牛勤快请教。 ![]() |
标题与内容描述不符,内容描述与程序不符,程序中数据类型定义与实际需要不符,最终全体不服! |
先不谈程序,51单片机的P0口是个非常扯淡的口,我的仿真器的仿真头排线在左边,插到目标板上P1和P3口就挡住了,P1和P3口用起来就不太方便,P0和P2口没有被挡住,P0口在左上角,接线最方便,所以我经常用P0口仿真,直到有一次仿真74HC165,简简单单的移位程序,怎么都无法成功,搞的我焦头烂额,后来用AVR单片机仿真,一次就成功。突发奇想,用51单片机的P2口仿真74HC165,也是一次成功。要知道,51单片机的P0口仿真CD4094、CD4014、CD4021都能成功,就是74HC165不能成功,我编了一些方波程序看P0口和其它口的差别,发现P0口下拉能力弱,速度也很慢,要想用P0口仿真74HC165成功,最简单的方法就是降低速度,但是,如果使用和研究51单片机,少用和慎用P0口是少走弯路的重要方法的之一。 |
楼主:设计不是想的那么简单,实现相同的功能,选用什么样的器件,很重要。 慢慢体会! |
wulin 发表于 2019-2-14 08:48 太感谢大神了!看的小弟我热泪盈眶 |
izhonguo 发表于 2019-2-13 17:29 你的上述疑问是真实存在的,如果改用74HC595连级输出可以解决你的上述疑问。给你一个示例程序和仿真。 ![]() #include <reg51.H> #define uint unsigned int #define uchar unsigned char sbit P_HC595_SER = P0^0; sbit P_HC595_SRCLK = P0^1; sbit P_HC595_RCLK = P0^2; /*******************定义8个字节64 bit缓存数组*************************/ uchar data dis_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};// /**************** 向HC595发送一个字节函数 ******************/ void Send_595(uchar dat) { uchar i; for(i=0;i<8;i++) { dat <<= 1; P_HC595_SER = CY; //溢出位赋值数据输出端 P_HC595_SRCLK = 1; //移位时钟 P_HC595_SRCLK = 0; } } /**************** 向HC595发送八个字节函数 ******************/ void DisplayScan() { uchar j; for(j=0;j<8;j++) { Send_595(dis_buf[j]);//向HC595发送一个字节 } P_HC595_RCLK = 1;//锁存输出数据 P_HC595_RCLK = 0; } void main() { P_HC595_SRCLK = 0;//初始化移位时钟端 P_HC595_RCLK = 0;//初始化锁存输出端 DisplayScan(); //发送八个字节 while(1); } |
izhonguo 发表于 2019-2-13 15:36 建议改用74HC595连级输出。ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常将ST_CP置为低电平,这样在移位过程中各输出端状态保持不变,当移位结束后,在ST_CP端产生一个正脉冲(5V时,大于几十纳秒就行了。通常都选微秒级),更新输出数据。 |
yaoji123 发表于 2019-2-13 07:39 您好,请问P0的上拉电阻如何接线?是和51单片机的最小系统里的上拉电阻一样接法就可以吗?直接插一个10KΩ的电阻接地就可以吗?谢谢! |
AT89C52的P0口在用时要加上拉电阻,否则电平不对 |
标题与内容描述不符,内容描述与程序不符,程序中数据类型定义与实际需要不符,看不明白楼主最终目的是什么。 |