マイクロコントローラ51のシリアルポート232 - fOSCは6MHzの、タイマT1が作業モードであるミッション要件2

警告:書き込みは容易ではない、おかげで転載しないでください。

マイクロコントローラ51のシリアルポート232 - fOSCは6MHzの、タイマT1が作業モードであるミッション要件2

ミッションの要件

FOSCは4800ボーで6MHzの、作業モード2、シリアル動作モード1用のタイマT1です。
図1に示すように、ボーレートは、タイマT1の時定数初期値によって計算されます。
2、準備手順Aに送信し、クエリまたは割り込みで動作30Hを送信する- 3FH 16バイト。
4FHに-図3は、準備手順Bを受信し、16バイト40Hのデータを受け付けます。

送信機(マシン)

/*****************************************************
*任务要求
*Fosc为6MHz,定时器T1为工作模式2,串口工作模式1,波特率为4800。
*1、通过波特率计算定时器T1时间常数初值。
*2、编写甲机发送程序,工作于查询或者中断方式,传送30H——3FH中的十六个字节。
*3、编写乙机接收程序,接受十六字节数据放在40H——4FH中。
*
*项目名:甲机
*作者:刘子琰
*时间:2020年4月4日11:34:59
******************************************************/       
#include <REG52.H>
#include <stdio.h>
typedef unsigned char u8;

void delay(unsigned int i);    //函数声明

u8 i=0;
u8 *Tx_Buf= (u8*)0x30; 
void main (void) {
	SCON = 0x50;      	//REN=1允许串行接受状态,串口工作模式1    	   
	TMOD|= 0x20;      	//定时器1的工作方式2                       
	PCON|= 0x80;      	//波特率提高一倍                                                        
	TH1 = 0xFA;			//TH1=256-(6000000/12)*(2/(32*4800))	
	TL1 = 0xFA; 		//因为是定时器模式2,所以高8位和低八位要相同
	TR1  = 1;        	//开启定时器1                                                      
	ES   = 1;        	//开串口中断                  
	EA   = 1;        	// 开总中断 
	while(1)
	{  
		for(i=0;i<16;i++){
			SBUF = Tx_Buf[i];	    //SUBF作为发送缓冲器
			while(!TI);				// 等特数据传送	(TI发送中断标志)
			TI = 0;					// 清除数据传送标志
		} 
		delay(1000);  
	}
}

 /**************************************************
          										  
		  延时处理程序												 
												  
**************************************************/

 void delay(unsigned int i)
{
	unsigned char j;
	for(i; i > 0; i--)
		for(j = 200; j > 0; j--) ;

}

受信機(マシンB)

/*****************************************************
*任务要求
*Fosc为6MHz,定时器T1为工作模式2,串口工作模式1,波特率为4800。
*1、通过波特率计算定时器T1时间常数初值。
*2、编写甲机发送程序,工作于查询或者中断方式,传送30H——3FH中的十六个字节。
*3、编写乙机接收程序,接受十六字节数据放在40H——4FH中。
*
*项目名:乙机
*作者:刘子琰
*时间:2020年4月4日11:34:59
******************************************************/       
#include <REG52.H>
#include <stdio.h>
typedef unsigned char u8;

void delay(unsigned int i);    //函数声明

u8 i=0;
u8 *Rx_Buf= (u8*)0x40; 
void main (void) {
	SCON = 0x50;      	//REN=1允许串行接受状态,串口工作模式1    	   
	TMOD|= 0x20;      	//定时器1的工作方式2                       
	PCON|= 0x80;      	//波特率提高一倍                                                        
	TH1 = 0xFA;			//TH1=256-(6000000/12)*(2/(32*4800))	
	TL1 = 0xFA; 		//因为是定时器模式2,所以高8位和低八位要相同
	TR1  = 1;        	//开启定时器1                                                      
	ES   = 1;        	//开串口中断                  
	EA   = 1;        	// 开总中断 
	while(1)
	{  
		for(i=0;i<16;i++){
			if(RI)       //RI接受中断标志
			{  
				RI=0; 	    //清除RI接受中断标志
				Rx_Buf[i]=SBUF ;	    //SUBF作为接受寄存器
			}
		} 
		delay(1000);  
	}
}

 /**************************************************
          										  
		  延时处理程序												 
												  
**************************************************/

 void delay(unsigned int i)
{
	unsigned char j;
	for(i; i > 0; i--)
		for(j = 200; j > 0; j--) ;

}
公開された19元の記事 ウォン称賛17 ビュー4074

おすすめ

転載: blog.csdn.net/qq_43605009/article/details/105308559