串口通信原理与编程

1.概念
计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换
2.通信方式
通信有串行通信与并行通信,在51中常用串行通信
3.串行通信又分为异步通信与同步通信
异步通信:一帧一帧的发送数据,每帧数据中间有时间间隔,且时间间隔是不确定的。
同步通信:数据连续的发送,中间没有间隔。
4.串行通信的传输方向
单工:只能收或只能发信息
半双工:收与发都可以,但是收与发不能同时进行。
双工:收与法都可以且可以同时进行。
5.转输速率
比特率是每秒钟转输二进制代码的个数,单位是 位/秒(bps)
例如每秒钟要转输130个字符,每个字符有10位2进制(8位是数据,2位是起始与结束),故转输速率为1300bps
6.串行通信结构
请添加图片描述
接受与发送用的都是同一位置的内存,如果要发送数据,就命b = SBUF,发送寄存器中准备发送。如果要接收数据,就命SBUF = b,数据读取接收缓存器。

7.串行通信使用配置
请添加图片描述
1.T1工作方式
请添加图片描述
我们需要的是8位自动重装定时器来确认波特率,
如果我们用的是定时器1,那么TMOD = 0010 0000,即TMOD = 0x20;
2.计算对应定时器TH1与TL1的值
请添加图片描述
如果我们用9600波特率的
SMOD 通常不用到,如果给它赋予1或0,计数的波特率会翻倍,如果不使用,默认为0.
9600 = 11.0592 / 32* 12 * (256-T初)
得T初 = 253 = 0xfd
TH1 = 0xfd
TL1 = 0xfd

这里不需要像其它定时器一样用过之后重新赋值,TMOD = 0x20下,TL1用过(8位溢出)后,TH1把值给TL1做为初值。
3.就是启动定时器一,启动上面我们赋值的初值,就是TR1= 1

4.确定串行口控制(编程SCON寄存器)

在这里插入图片描述请添加图片描述
请添加图片描述
很显然我们用的是方式一,即SM0 = 0;SM1 = 1;,还要设置REN = 1允许串口接收信息。
5.用不到
总设置

void UARTnit()
{
	EA = 1;                      //总开关
	ES = 1;                      //串口通信开关
	
	TMOD |=0x20;                 //T1工作方式
	
	TH1 = 0xfd;                 //计算对应定时器TH1与TL1的值 
	TL1 = 0xfd;
	
	TR1 = 1;                    //启动定时器一
	
	SM0 = 0;SM1 = 1;REN = 1;	//确定串行口控制(编程SCON寄存器)
}

整体代码

#include "reg52.h"			 
sbit LA=P2^2;
sbit LB=P2^3;
sbit LC=P2^4;
unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
               0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void timefrist()
{
	EA = 1;                 //定时器0的工作模式设置
	ET0 = 1;                //打开定时器0
	TR0 = 1;                 //启动定时器0
	TMOD |= 0x01;            //工作模式
	TH0 = 0xED;             //初值 这里是5ms
	TL0 = 0xFF;
}
void UARTnit()
{
	EA = 1;                      //总开关
	ES = 1;                      //串口通信开关
	
	TMOD |=0x20;                 //T1工作方式
	
	TH1 = 0xfd;                 //计算对应定时器TH1与TL1的值 
	TL1 = 0xfd;
	
	TR1 = 1;                    //启动定时器一
	
	SM0 = 0;SM1 = 1;REN = 1;	//确定串行口控制(编程SCON寄存器)
}
unsigned char miao=0;
void DigDisplay(unsigned char h)
{
	unsigned char a=h%10;          //1
	unsigned char b=h/10%10;       //2
	unsigned char c=h/100;         //3
	static unsigned char wei=0;
	switch(wei)
	{
		case 0: LA=1;LB=1;LC=1;P0 = smgduan[c];break;
		case 1:	LA=0;LB=1;LC=1;P0 = smgduan[b];break;
		case 2:	LA=1;LB=0;LC=1;P0 = smgduan[a];break;
	}
	wei++;
	if(wei==3)
	{
		wei = 0;
	}
}
void timer() interrupt 1
{
	 TH0 = 0xED;               //每五秒不断交替显示
	 TL0 = 0xFF;
	 DigDisplay(miao);
}
void UA()interrupt 4
{
	if(RI==1)                 //RT==1时代表接收到了8位数据
	{
		miao = SBUF;
		RI = 0;              //归0
	}
	if(TI==1)               //TI==1代表转送了8位数据               
	{
		TI =  0;
	}
}
void main()
{	
	timefrist();
	UARTnit();
	while(1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值