双机模拟通信

   日期:2021-02-11     浏览:97    评论:0    
核心提示:基本知识:( 1 )数据缓冲器( SBUF )接受或发送的数据都要先送到 SBUF 缓存。有两个,一个缓存,另一个接受,用同一直接地址 99H, 发送时用指令将数据送到 SBUF 即可启动发送;接收时用指令将 SBUF 中接收到的数据取出。( 2 )串行控制寄存器( PCON )SCON 用于串行通信方式的选择,收发控制及状态指示,各位含义如下:SM0 SM1 SM2 REN TB8 RB8 TI RISM0,SM1: 串行接口工作方式选择位,这两位组合成 00 , 01 , 10 , 11

基本知识:

( 1 )数据缓冲器( SBUF )
接受或发送的数据都要先送到 SBUF 缓存。有两个,一个缓存,另一个接受,用同一直接地址 99H, 发送时用指令将数据送到 SBUF 即可启动发送;接收时用指令将 SBUF 中接收到的数据取出。
( 2 )串行控制寄存器( PCON )
SCON 用于串行通信方式的选择,收发控制及状态指示,各位含义如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0,SM1: 串行接口工作方式选择位,这两位组合成 00 , 01 , 10 , 11 对应于工作方式 0 、 1 、 2 、 3 。
串行接口工作方式特点见下表
SM0 SM1 工作方式 功能 波特率
0 0 0 8 位同步移位寄存器(用于 I/O 扩展)f ORC /12
0 1 1 10 位异步串行通信( UART ) 可变( T1 溢出率 *2 SMOD /32 )
1 0 2 11 位异步串行通信( UART ) f ORC /64 或 f ORC /32
1 1 3 11 位异步串行通信( UART ) 可变( T1 溢出率 *2 SMOD /32 )

SM2 :多机通信控制位。
REN :接收允许控制位。软件置 1 允许接收;软件置 0 禁止接收。
TB8 :方式 2 或 3 时, TB8 为要发送的第 9 位数据,根据需要由软件置 1 或清 0 。
RB9 :在方式 2 或 3 时, RB8 位接收到的第 9 位数据,实际为主机发送的第 9 位数据 TB8 ,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI :发送中断标志。发送完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续发送。
RI :接收中断标志。接收完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续接收。
( 3 )输入移位寄存器
接收的数据先串行进入输入移位寄存器, 8 位数据全移入后,再并行送入接收 SBUF 中。
( 4 )波特率发生器
波特率发生器用来控制串行通信的数据传输速率的, 51 系列单片机用定时器 T1 作为波特率发生器, T1 设置在定时方式。波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
( 5 )电源控制寄存器 PCON
其最高位为 SMOD 。
( 6 )波特率计算
当定时器 T1 工作在定时方式的时候,定时器 T1 溢出率 = ( T1 计数率) / (产生溢出所需机器周期)。由于是定时方式, T1 计数率 = f ORC /12 。产生溢出所需机器周期数 = 模 M- 计数初值 X 。

仿真图:

完整代码:

单片机1的代码:

#include <reg51.h>
void csh()
	{
		SM0=0;
		SM1=1;
		REN=1;
		TI=0;
		RI=0;
		PCON=0;
		TH1=0xF3;
		TL1=0xF3;
		TMOD=0x20;
		EA=1;
		ET1=0;
		ES=1;
		TR1=1;
	}

void main()
	{
	int i,j;
	char c=0;
	csh();
	while(1)
	{
		ES=0;
		TI=0;
		SBUF=c;
		while(!TI);
		TI=0;
		ES=1;
		for(j=0;j<50;j++)
			for(i=0;i<5000;i++);
		c++;
		if (c>9)
		c=0;
		}
}




单片机2的代码:

#include <reg51.h>

//³õʼ»¯´®ÐпÚ
void csh()
	{
		SM0=0;
		SM1=1;
		REN=1;
		TI=0;
		RI=0;
		PCON=0;
		TH1=0xF3;
		TL1=0xF3;
		TMOD=0x20;
		EA=1;
		ET1=0;
		ES=1;
		TR1=1;
	}

void main()
{
	csh();
	while(1)
	{;}
}

void intrr() interrupt 4
	{
	char temp;
	temp=SBUF;
	switch(temp){
		case 0: P1=0x00;break;
		case 1: P1=0xfe;break;
		case 2: P1=0xfd;break;
		case 3: P1=0xfb;break;
		case 4:	P1=0xf7;break;
		case 5: P1=0xef;break;
		case 6: P1=0xdf;break;
		case 7: P1=0xbf;break;
		case 8: P1=0x7f;break;		
	}	
	RI=0;
	}

仿真效果:

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服