首页 > 其他 > 详细

51单片机复习程序例举003

时间:2014-04-01 00:43:38      阅读:652      评论:0      收藏:0      [点我收藏+]

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()
 *	功能:初始化定时器T0 ,
 *		  定时器T0 中断模式 工作方式2 ,定时0.2ms
 *	参数:无
 *	返回:无
 ******************************************************************************/
 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();	//扫描方式从串口接收数据	
	}
		
}


/******************************************************************************
 *	名称:
 *	功能:
 *	参数:
 *	返回:
 ******************************************************************************/






































51单片机复习程序例举003,布布扣,bubuko.com

51单片机复习程序例举003

原文:http://blog.csdn.net/dragon12345666/article/details/22699357

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!