单片机之串口通信

13:54:08
虽然自己还有很多的不懂,但是我可以慢慢的学习,一点点的积累。单片机串口通信有以下的知识。
 电平转换
单片机TTL电平,逻辑0为电压0V,逻辑1为电压+5V。
RS-232电平特性:
逻辑1(MARK)=-3V~-15V
  逻辑0(SPACE)=+3~+15V
  在RTS、CTS、DSR、DTR和DCD等控制线上:
  信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15V
常用电平转换芯片MAX232可以完成双向电平转换,还有其他一些常用单向转换芯片不在叙述。
 串口通信方式
51系列单片机串口通信方式总共有四种,由串口控制寄存器SCON设定, 方式0和方式2的波特率是固定的,方式1和3波特率是可变的,计算公式为
如果PCON中的SMOD位为1则;
波特率 = 2*(T1的溢出率)/32
如果PCON中的SMOD位为0则;
波特率 = 1*(T1的溢出率)/32

溢出速率=(计数速率)/(所用周期数)
计数速率与晶振有关,计数速率即机器周期的倒数,为fose/12。fose为晶振频率。
所用周期与定时器工作方式和初值有关。
 通信协议
通信方式中的误码问题,一般采用数据校验的办法
奇偶校验。
校验和。
CRC校验(循环冗余校验)。
关于CRC校验,弄的不是很明白,希望高手可以详细给我讲解。好了说一点知道的吧,CRC校验是利用生成的多项式(原理比较多)最高次幂n一般为4、8、16、32等等,首先把数据后添加n位,然后再和多项式进行二进制除法(就是异或运算)最后得到的余数即为CRC校验码,然后加在数据位后面一起发送。
通信中先发低位,后高位。发送完数据由硬件置RI为1,RI只能用软件清零。接受完一帧数据硬件置TI为1,软件清零。

 

#include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar tem ,sign=0; void serial_init() { //串口控制中断 //SCON = 0x50 ;//串口工作方式1 SM0 = 0 ; SM1 = 1 ; REN = 1 ; EA = 1 ; ES = 1 ;//串口中断允许位 //定时器1工作方式及初值 9600 TMOD = 0x20 ; TH1 = 0xfd ; TL1 = 0xfd ; TR1 = 1 ; //启动定时器 } void serial() interrupt 4 { RI = 0 ; P1 = SBUF ; sign = 1 ; tem = SBUF ; } void main() { serial_init() ; while(1) { if(sign==1) { sign = 0 ; ES = 0 ; SBUF = tem ; while(TI==0) ; TI = 0 ; ES = 1 ; } } }

你可能感兴趣的:(单片机之串口通信)