51单片机复习程序例举003
扫描二维码
随时随地手机看文章
1、串行通信,查询模式,单片机转发PC机发来的数据。
PC通过串口向单片机发数据,单片机将接收到的数据在转发给PC
/******************************************************************************
*说明:AT89S52芯片,12M晶振
*串行通信,工作方式1,波特率可变
*定时器T1产生波特率,工作方式2,8位自动重装
*(注意:定时器T1此时不能工作在中断的模式下)
*本程序:PC向单片机发数据,单片机将接收到的数据在转发给PC
******************************************************************************/
#include
unsignedcharSerial_Receive(void);
voidSerial_Send(unsignedchartransmit);
/******************************************************************************
*名称:delay1ms()
*功能:延时1ms
*参数:intt
*返回:无
******************************************************************************/
voiddelay1ms(intt)
{
unsignedchari;
while(t--)
{
for(i=0;i<125;i++)
{
;
}
}
}
/******************************************************************************
*名称:Serial_Init()
*功能:初始化串口,工作方式1,波特率9600
*参数:无
*返回:无
******************************************************************************/
voidSerial_Init(void)
{
/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/
//1、配置串口控制寄存器SCON(98H)
//SCON:SM0,SM1,SM2,REN,TB8,RB8,TI,RI
SCON=0x50;//01010000工作方式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;//00100000: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位)
*参数:无
*返回:unsignedcharget_data:返回接收到的数据
******************************************************************************/
unsignedcharSerial_Receive(void)
{
unsignedcharget_data;
if(RI==1)//RI==1表示有数据从串口传来,暂时存放在SBUF寄存器中
{
RI=0;//清空串行接收数据申请中断标志位
get_data=SBUF;
P0=get_data;//P0口的LED灯显示从串口接收的数据
Serial_Send(get_data);//调用函数将接收到的数据通过串口发送出去
returnget_data;//将串口接收到那朵数据作为函数的返回值
}
}
/******************************************************************************
*名称:Serial_Send()
*功能:发送一个字节的数据(8位)
*参数:unsignedchartransmit:要发送的数据
*返回:无
******************************************************************************/
voidSerial_Send(unsignedchartransmit)
{
SBUF=transmit;//先将要发送的数据放到寄存器SBUF中
while(!TI)//等待数据发送完成,发送数据过程:TI==0;发送完毕:TI==1;
{;}
TI=0;//清空串行发送数据申请中断标志位
}
/******************************************************************************
===============================================================================
voidmain(void)函数部分
===============================================================================
*******************************************************************************/
voidmain(void)
{
Serial_Init();//初始化串口
while(1)
{
Serial_Receive();//扫描方式从串口接收数据
}