1. 硬件连接:从单片机到计算机的完整通路
搞单片机串口通信,第一步就是把硬件连接做对。我刚开始玩STC89C52的时候,最头疼的就是电平匹配问题。单片机用的是TTL电平(0-5V),而电脑串口是RS-232电平(-15V到+15V),直接连接肯定烧芯片,这时候MAX232就成了救命稻草。
MAX232这个芯片真的很神奇,它内部自带电荷泵电路,只需要几个外部电容就能完成电平转换。我一般会用1μF的电解电容并联0.1μF的陶瓷电容,这样既能保证电荷泵正常工作,又能滤除高频噪声。记得有一次为了省事只用了电解电容,结果通信时不时出错,后来并上陶瓷电容就稳定了。
具体接线时,STC89C52的TXD(P3.1)接MAX232的T1IN,RXD(P3.0)接R1OUT。MAX232的T1OUT接电脑串口的第2针(RXD),R1IN接第3针(TXD)。地线一定要接好,不共地通信肯定失败,这个坑我踩过好几次。
电源部分也很关键,VCC和GND之间一定要加0.1μF的去耦电容,最好靠近MAX232的电源引脚。我有次偷懒没加,通信距离稍长就各种误码,加上后就稳定多了。
2. 寄存器配置:深入理解每个比特位的作用
串口通信的软件配置核心就是那几个寄存器,弄懂了它们你就掌握了八成。SCON寄存器是串口控制的核心,我习惯设置为0x50,也就是二进制01010000。这样设置后,SM0=0、SM1=1选择工作方式1(8位UART,波特率可变),REN=1允许接收数据。
TMOD寄存器的配置很重要但经常被忽视。设置成0x20表示定时器1工作在方式2(8位自动重装),这样就不用每次都在中断里重装初值了。记得有次忘了设置这个,波特率飘得没法用。
波特率计算是关键中的关键。用11.0592MHz晶振不是随便选的,这个频率计算9600波特率时正好能得到整数初值0xFD。如果用12MHz晶振,算出来是0xFD.xxx,会有误差,通信就不稳定了。TH1和TL1都设为0xFD,这样定时器每次溢出后自动重装这个值。
中断设置是最后一步。EA=1开总中断,ES=1开串口中断。我建议刚开始学的时候一定要用中断方式,比查询方式效率高多了。记得刚开始我用了查询方

&spm=1001.2101.3001.5002&articleId=156186003&d=1&t=3&u=c5177a37ad9d446cbd69d676f6d47d71)
266

被折叠的 条评论
为什么被折叠?



