3、串行通信,中断模式,PC机向单片机发送消息,串口中断,向PC返回消息。按键主动向PC机发消息。" />
当前位置: 代码迷 >> 单片机 >> 3、串行通信,中断模式,PC机向单片机发送消息,串口中断,向PC返回消息。按键主动向PC机发消息。
  详细解决方案

3、串行通信,中断模式,PC机向单片机发送消息,串口中断,向PC返回消息。按键主动向PC机发消息。

热度:445   发布时间:2016-04-28 15:01:36.0
51单片机复习程序例举003

1、串行通信,查询模式,单片机转发PC机发来的数据。

PC通过串口向单片机发数据,单片机将接收到的数据在转发给PC

/****************************************************************************** *	说明:AT89S52芯片,12M晶振 *	串行通信,工作方式1,波特率可变 *	定时器T1产生波特率,工作方式2,8位自动重装 * (注意:定时器T1此时不能工作在中断的模式下)  *	本程序:PC向单片机发数据,单片机将接收到的数据在转发给PC ******************************************************************************/#include<reg52.h>unsigned char Serial_Receive(void);void Serial_Send(unsigned char transmit);	/****************************************************************************** *	名称:delay1ms() *	功能:延时1ms *	参数:int t *	返回:无 ******************************************************************************/void delay1ms(int t){	unsigned char i ;	while(t--)	{		for(i = 0 ; i < 125 ; i++)		{			;		}	}}/****************************************************************************** *	名称:Serial_Init() *	功能:初始化串口 ,工作方式1,波特率9600 *	参数:无 *	返回:无 ******************************************************************************/ void Serial_Init(void) { 	/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/	 //1、配置串口控制寄存器 SCON  (98H)	 	//  SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI		SCON = 0x50 ;	// 0101 0000 工作方式1,10位异步接发,波特率自定,				    	// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行						// REN 串行口接收允许控制位	 //2、配置电源控制寄存器 PCON  (97H) 和波特率相关 , 寄存器PCON不能按位赋值		//  PCON : SMOD,  - ,  - ,   - , GF1,  GF0,  PD, IDL	    PCON = 0x80 ;   //波特率加倍   (不加倍,可不配置PCON,或 PCON = 0x00 ;)	 //3、配置中断允许寄存器 IE  (0A8H)	 	// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0		/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/		//EA = 1 ;   //开总中断		//ES = 1 ;  //允许串口ES产生中断	 	 //4、配置定时器T1,产生自定的波特率 	 	//4.1、配置定时器方式寄存器 TMOD :			// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0  (T1 | T0)			TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器			//4.2、给定时器赋初值 :			TL1 = 0xFA ;	//定时器T1产生波特率:9600 			TH1 = TL1 ;				//4.3、配置 定时器/中断 控制寄存器 TCON :			// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0 			TR1 = 1 ;  //运行定时器T1 } /****************************************************************************** *	名称:Serial_Receive() *	功能:从串口接收一个字节的数据(8位) *	参数:无 *	返回:unsigned char get_data  :返回接收到的数据 ******************************************************************************/unsigned char Serial_Receive(void){	unsigned char get_data ; 	if(RI == 1)	   //RI == 1 表示有数据从串口传来,暂时存放在SBUF寄存器中	{		RI = 0 ;	//清空串行接收数据申请中断标志位	 	get_data = SBUF ;		P0 = get_data ;	//P0口的LED灯显示从串口接收的数据		Serial_Send(get_data) ;	//调用函数将接收到的数据通过串口发送出去		return get_data ;	//将串口接收到那朵数据作为函数的返回值	}} /****************************************************************************** *	名称:Serial_Send() *	功能:发送一个字节的数据(8位) *	参数:unsigned char transmit  :要发送的数据 *	返回:无 ******************************************************************************/void Serial_Send(unsigned char transmit){	SBUF = transmit ;	//先将要发送的数据放到寄存器SBUF中	while(!TI) //等待数据发送完成,发送数据过程:TI == 0 ; 发送完毕:TI == 1 ;	{ ; }	TI = 0 ;	//清空串行发送数据申请中断标志位}/******************************************************************************===============================================================================                       void main(void)函数部分===============================================================================*******************************************************************************/void main(void){	Serial_Init() ;	//初始化串口	while(1)	{		Serial_Receive();	//扫描方式从串口接收数据		}		}/****************************************************************************** *	名称: *	功能: *	参数: *	返回: ******************************************************************************/



2、串行通信,查询模式,单片机通过串口向发PC发数据,只发送,不接收

/****************************************************************************** *	说明:AT89S52芯片,12M晶振 *	串行通信,工作方式1,波特率可变 *	定时器T1产生波特率,工作方式2,8位自动重装 * (注意:定时器T1此时不能工作在中断的模式下)  *	本程序:单片机通过串口向发PC发数据,只发送,不接收 ******************************************************************************/#include<reg52.h>unsigned char str[40] = "\r\n  中南赵小龙 \r\n 51单片机学习笔记 \r\n" ;unsigned char Serial_Receive(void);void Serial_Send(unsigned char transmit);	/****************************************************************************** *	名称:delay1ms() *	功能:延时1ms *	参数:int t *	返回:无 ******************************************************************************/void delay1ms(int t){	unsigned char i ;	while(t--)	{		for(i = 0 ; i < 125 ; i++)		{			;		}	}}/****************************************************************************** *	名称:Serial_Init() *	功能:初始化串口 ,工作方式1 ,波特率9600 *	参数:无 *	返回:无 ******************************************************************************/ void Serial_Init(void) { 	/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/	 //1、配置串口控制寄存器 SCON  (98H)	 	//  SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI		SCON = 0x40 ;	// 0100 0000 工作方式1,10位异步接发,波特率自定,						// 要用的位将其置 1 ;不用的位将其默认为 0 ;				    	// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行						// REN 串行口接收允许控制位 = 1 ,允许接收数据						//							= 0	, 禁止接收数据	 //2、配置电源控制寄存器 PCON  (97H) 和波特率相关 , 寄存器PCON不能按位赋值		//  PCON : SMOD,  - ,  - ,   - , GF1,  GF0,  PD, IDL	    PCON = 0x80 ;   //波特率加倍   (不加倍,可不配置PCON,或 PCON = 0x00 ;)	 //3、配置中断允许寄存器 IE  (0A8H)	 	// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0		/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/		//EA = 1 ;   //开总中断		//ES = 1 ;  //允许串口ES产生中断	 	 //4、配置定时器T1,产生自定的波特率 	 	//4.1、配置定时器方式寄存器 TMOD :			// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0  (T1 | T0)			TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器			//4.2、给定时器赋初值 :			TL1 = 0xFA ;	//定时器T1产生波特率:9600 			TH1 = TL1 ;				//4.3、配置 定时器/中断 控制寄存器 TCON :			// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0 			TR1 = 1 ;  //运行定时器T1 } /****************************************************************************** *	名称:Serial_Send() *	功能:发送一个字节的数据(8位) *	参数:unsigned char transmit  :要发送的数据 *	返回:无 ******************************************************************************/void Serial_Send(unsigned char transmit){	SBUF = transmit ;	//先将要发送的数据放到寄存器SBUF中	while(!TI) //等待数据发送完成,发送数据过程:TI == 0 ; 发送完毕:TI == 1 ;	{ ; }	TI = 0 ;	//清空串行发送数据申请中断标志位}/******************************************************************************===============================================================================                       void main(void)函数部分===============================================================================*******************************************************************************/void main(void){	unsigned char i ;	Serial_Init() ;	//初始化串口	while(1)	{		i= 0 ;		while(str[i] != '\0') 	//遇到数组停止位,则停止发送		{			Serial_Send(str[i]) ;			i++ ;		}		delay1ms(500);		}		}/****************************************************************************** *	名称: *	功能: *	参数: *	返回: ******************************************************************************/


3、串行通信,中断模式,PC机向单片机发送消息,串口中断,向PC返回消息。按键主动向PC机发消息。

/****************************************************************************** *	说明:AT89S52芯片,12M晶振 *	串行通信,工作方式1,串口中断模式,波特率可变  *	定时器T1产生波特率,工作方式2,8位自动重装 * (注意:定时器T1此时不能工作在中断的模式下)  *	本程序:PC通过串口向单片机发数据,单片机将接收到的数据在转发给PC *			单片机按键,单片机通过串口主动向PC机发送固定的消息 ******************************************************************************/#include<reg52.h>sbit K1 = P1^4 ;	//定义独立按键unsigned char code str[40] = "\r\n  中南赵小龙\r\n单片机学习笔记\r\n" ;unsigned char Serial_Receive(void);void Serial_Send(unsigned char transmit);	/****************************************************************************** *	名称:delay1ms() *	功能:延时1ms *	参数:int t *	返回:无 ******************************************************************************/void delay1ms(int t){	unsigned char i ;	while(t--)	{		for(i = 0 ; i < 125 ; i++)		{			;		}	}}/****************************************************************************** *	名称:Serial_Init() *	功能:初始化串口 ,工作方式1,波特率9600 *	参数:无 *	返回:无 ******************************************************************************/ void Serial_Init(void) { 	/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/	 //1、配置串口控制寄存器 SCON  (98H)	 	//  SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI		SCON = 0x50 ;	// 0101 0000 工作方式1,10位异步接发,波特率自定,						// 用到哪一位,将其置 1 ,否则默认其为 0 。				    	// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行						// REN 串行口接收允许控制位,= 1 允许接收数据,= 0 禁止接收数据	 //2、配置电源控制寄存器 PCON  (97H) 和波特率相关 , 寄存器PCON不能按位赋值		//  PCON : SMOD,  - ,  - ,   - , GF1,  GF0,  PD, IDL	    PCON = 0x80 ;   //波特率加倍   (不加倍,可不配置PCON,或 PCON = 0x00 ;)	 //3、配置中断允许寄存器 IE  (0A8H)	 	// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0		/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/		EA = 1 ;   //开总中断		ES = 1 ;  //允许串口ES产生中断	 	 //4、配置定时器T1,产生自定的波特率 	 	//4.1、配置定时器方式寄存器 TMOD :			// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0  (T1 | T0)			TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器			//4.2、给定时器赋初值 :			TL1 = 0xFA ;	//定时器T1产生波特率:9600 			TH1 = TL1 ;				//4.3、配置 定时器/中断 控制寄存器 TCON :			// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0 			TR1 = 1 ;  //运行定时器T1 } /****************************************************************************** *	名称:Serial_Receive() *	功能:从串口接收一个字节的数据(8位) *	参数:无 *	返回:unsigned char get_data  :返回接收到的数据 ******************************************************************************/unsigned char Serial_Receive(void){	unsigned char get_data ; 	if(RI == 1)	   //RI == 1 表示有数据从串口传来,暂时存放在SBUF寄存器中	{		RI = 0 ;	//清空串行接收数据申请中断标志位	 	get_data = SBUF ;		P0 = get_data ;	//P0口的LED灯显示从串口接收的数据		Serial_Send(get_data) ;	//调用函数将接收到的数据通过串口发送出去		return get_data ;	//将串口接收到那朵数据作为函数的返回值	}} /****************************************************************************** *	名称:Serial_Send() *	功能:发送一个字节的数据(8位) *	参数:unsigned char transmit  :要发送的数据 *	返回:无 ******************************************************************************/void Serial_Send(unsigned char transmit){	SBUF = transmit ;	//先将要发送的数据放到寄存器SBUF中	while(!TI) //等待数据发送完成,发送数据过程:TI == 0 ; 发送完毕:TI == 1 ;	{ ; }	TI = 0 ;	//清空串行发送数据申请中断标志位}/******************************************************************************===============================================================================                       void main(void)函数部分===============================================================================*******************************************************************************/void main(void){	unsigned char i ;	Serial_Init() ;	//初始化串口	while(1)	{		i = 0 ;		if(K1 == 0)		{			delay1ms(15) ;			if(K1 == 0)			{				while(!K1)				{ ; }				while(str[i] != '\0')				{				   Serial_Send(str[i]) ;				   i++ ;				}			}		}		}		}/****************************************************************************** *	名称:void ES_Interrupt(void) *	功能:串口中断服务程序 *	参数:无 *	返回:无 ******************************************************************************/void ES_Interrupt(void) interrupt 4{	Serial_Receive() ;}/****************************************************************************** *	名称: *	功能: *	参数: *	返回: ******************************************************************************/




































  相关解决方案