51單片機(jī)復(fù)習(xí)程序例舉003
1、串行通信,查詢模式,單片機(jī)轉(zhuǎn)發(fā)PC機(jī)發(fā)來的數(shù)據(jù)。
PC通過串口向單片機(jī)發(fā)數(shù)據(jù),單片機(jī)將接收到的數(shù)據(jù)在轉(zhuǎn)發(fā)給PC
/******************************************************************************
*說明:AT89S52芯片,12M晶振
*串行通信,工作方式1,波特率可變
*定時(shí)器T1產(chǎn)生波特率,工作方式2,8位自動(dòng)重裝
*(注意:定時(shí)器T1此時(shí)不能工作在中斷的模式下)
*本程序:PC向單片機(jī)發(fā)數(shù)據(jù),單片機(jī)將接收到的數(shù)據(jù)在轉(zhuǎn)發(fā)給PC
******************************************************************************/
#include
unsignedcharSerial_Receive(void);
voidSerial_Send(unsignedchartransmit);
/******************************************************************************
*名稱:delay1ms()
*功能:延時(shí)1ms
*參數(shù):intt
*返回:無
******************************************************************************/
voiddelay1ms(intt)
{
unsignedchari;
while(t--)
{
for(i=0;i<125;i++)
{
;
}
}
}
/******************************************************************************
*名稱:Serial_Init()
*功能:初始化串口,工作方式1,波特率9600
*參數(shù):無
*返回:無
******************************************************************************/
voidSerial_Init(void)
{
/*-------------串行通信初始化,定時(shí)器T1產(chǎn)生波特率,工作方式2------------*/
//1、配置串口控制寄存器SCON(98H)
//SCON:SM0,SM1,SM2,REN,TB8,RB8,TI,RI
SCON=0x50;//01010000工作方式1,10位異步接發(fā),波特率自定,
//起始位和停止位芯片自動(dòng)加上和去掉,用戶只需發(fā)送8位數(shù)據(jù)就行
//REN串行口接收允許控制位
//2、配置電源控制寄存器PCON(97H)和波特率相關(guān),寄存器PCON不能按位賦值
//PCON:SMOD,-,-,-,GF1,GF0,PD,IDL
PCON=0x80;//波特率加倍(不加倍,可不配置PCON,或PCON=0x00;)
//3、配置中斷允許寄存器IE(0A8H)
//IE:EA,-,ET2,ES,ET1,EX1,ET0,EX0
/*---若要串行通信工作在中斷的狀態(tài)下,則按一下配置,否則不配置寄存器IE---*/
//EA=1;//開總中斷
//ES=1;//允許串口ES產(chǎn)生中斷
//4、配置定時(shí)器T1,產(chǎn)生自定的波特率
//4.1、配置定時(shí)器方式寄存器TMOD:
//TMOD:GATE,C/T~,M1,M0,|GATE,C/T~,M1,M0(T1|T0)
TMOD=0x20;//00100000:T1定時(shí)器,工作方式2:8位自動(dòng)重裝定時(shí)器
//4.2、給定時(shí)器賦初值:
TL1=0xFA;//定時(shí)器T1產(chǎn)生波特率:9600
TH1=TL1;
//4.3、配置定時(shí)器/中斷控制寄存器TCON:
//TCON:TF1,TR1,TF0,TR0,|IE1,IT1,IE0,IT0
TR1=1;//運(yùn)行定時(shí)器T1
}
/******************************************************************************
*名稱:Serial_Receive()
*功能:從串口接收一個(gè)字節(jié)的數(shù)據(jù)(8位)
*參數(shù):無
*返回:unsignedcharget_data:返回接收到的數(shù)據(jù)
******************************************************************************/
unsignedcharSerial_Receive(void)
{
unsignedcharget_data;
if(RI==1)//RI==1表示有數(shù)據(jù)從串口傳來,暫時(shí)存放在SBUF寄存器中
{
RI=0;//清空串行接收數(shù)據(jù)申請(qǐng)中斷標(biāo)志位
get_data=SBUF;
P0=get_data;//P0口的LED燈顯示從串口接收的數(shù)據(jù)
Serial_Send(get_data);//調(diào)用函數(shù)將接收到的數(shù)據(jù)通過串口發(fā)送出去
returnget_data;//將串口接收到那朵數(shù)據(jù)作為函數(shù)的返回值
}
}
/******************************************************************************
*名稱:Serial_Send()
*功能:發(fā)送一個(gè)字節(jié)的數(shù)據(jù)(8位)
*參數(shù):unsignedchartransmit:要發(fā)送的數(shù)據(jù)
*返回:無
******************************************************************************/
voidSerial_Send(unsignedchartransmit)
{
SBUF=transmit;//先將要發(fā)送的數(shù)據(jù)放到寄存器SBUF中
while(!TI)//等待數(shù)據(jù)發(fā)送完成,發(fā)送數(shù)據(jù)過程:TI==0;發(fā)送完畢:TI==1;
{;}
TI=0;//清空串行發(fā)送數(shù)據(jù)申請(qǐng)中斷標(biāo)志位
}
/******************************************************************************
===============================================================================
voidmain(void)函數(shù)部分
===============================================================================
*******************************************************************************/
voidmain(void)
{
Serial_Init();//初始化串口
while(1)
{
Serial_Receive();//掃描方式從串口接收數(shù)據(jù)
}