两种通信方式
串行通信:
串行通信是将数据字节分成一位一位的形式在。
并行通信:
并行通信通常是将数据字节的各位用多条数据线同时进行传送 。
串行通信又分两种
同步通信
同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。此时数据以位的形式连续发送
异步通信的发送方和接收方使用各自的时钟控制数据的发射接收,发送端可以在任意时候发送字符。此时数据以帧的形式连续发送(一个帧数据有十位:分别是一个起始位、八个数据位、一个停止位)
波特率
计算
波特率用来衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为:bps。
例如:最常用的传输速率9600,其意思是,每秒传输960帧数据,一帧数据是十个二进制数。即960*10=9600
设置
一般是将定时中断1(T1)作为波特率的发生器,并且T1采用的是工作方式2。
此时波特率的计算公式为:
解释一下公式中的几个含义
SMOD:波特率选择位
SMOD属于PCON寄存器,不可位寻址,其可作为波特率加倍标志,置0的时候不加倍,置1的时候串行通信方式波特率加倍
fosc:单片机的晶振频率
51单片机仿真一般默认的是12Mhz,但其误差相对较大,精准计时一般采用11.0529MHz
256-T初:每次定时器计数的次数
此时波特率发生器T1是工作方式2(八位数据自动装填),初始值在开始时装入TH1和TL1,正常工作时只有TH1计数,当TH1溢出时把TL1中的初始值重新赋值给TH1,这样就实现了自动装填。
注:八位二进制数的范围是0~255,共256个数
波特率9600的初始化设置
1、 设置定时器T1的工作方式:
TMOD=0X20;// 使定时器T1处于工作方式2;
2、计算T1的初始值:
TH1=0XFD;
TL1=0XFD;// 并装载TH1和TL1,波特率为9600bps时
3、启动T1:
TR1=1; // 打开T1定时器
PCON=0X80; //波特率加倍
SCON=0X50; //设置为工作方式1:8位数据位
串口工作方式的选择
设置SM0和SM1,设置工作方式
TI与RI的作用
TI是发送中断标志位,当数据发送完成后,TI由硬件置1,TI置1后向CPU提出中断申请,进入中断函数后需要软件置0(TI=0;)
RI是接收中断标志位,当数据接收完成后,RI由硬件置1,RI置1后向CPU提出中断申请,进入中断函数后需要软件置0(RI=0;)
两者都在SCON寄存器内
串行通信实验源码
#include void delay(unsigned int x); void putchar(unsigned char data1); //字符发送函数 void putstring(unsigned char *dat);//字符串发送函数 void main(void) { unsigned char c = 0; SCON = 0x40; //串口工作方式设置 TMOD = 0x20; //定时器工作方式设置 PCON = 0x00; //波特率倍增设置 TL1 = 0xfd; //波特率设置 TH1 = 0xfd; TI = 0; // 清0发送中断标志 TR1 = 1; //开启定时器 while(1) { // 在这里略过笔者个人输出的内容,如果需要输出 // 在while中加入输出,常规C语言即可 //实在写不来的同学,在后面见附件 } } void delay(unsigned int x) //延时 { unsigned char i; while(x--) { for(i = 0;i < 120;i++); } } void putchar(unsigned char data1) { SBUF = data1; //将待发送的字符送入发送缓冲器 while(TI == 0); //等待发送完成 TI = 0; //发送中断标志请0 } void putstring(unsigned char *dat) { while(*dat != '