C51入門(mén)6,串口通信實(shí)驗(yàn)
從上位機(jī)(PC)發(fā)送數(shù)據(jù)給單片機(jī),并顯示到單片機(jī)的LED上。
實(shí)驗(yàn)一:查詢(xún)法
程序:
/如果串口右數(shù)據(jù)發(fā)送就點(diǎn)亮LED
#include
//主函數(shù)
void main()
{
TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2
TH1=0xfd;//波特率設(shè)置
TL1=0xfd;
//TR1=1;//啟動(dòng)定時(shí)器1
REN=1;//允許串口接收
SM0=0;//串行工作方式1
SM1=1;
//EA=1;//開(kāi)定時(shí)器中斷
//ES=1;//開(kāi)總中斷
while(1)
{
if(RI==1)//接收中斷標(biāo)志位,如果有中斷到來(lái)執(zhí)行下面語(yǔ)句
{
RI=0;
P1=SBUF;//接收的數(shù)句存在SBUF中?
}
}
}
實(shí)驗(yàn)二:中斷法
//如果串口右數(shù)據(jù)發(fā)送就點(diǎn)亮LED
#include
//主函數(shù)
void main()
{
TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2
TH1=0xfd;//波特率設(shè)置
TL1=0xfd;
TR1=1;//啟動(dòng)定時(shí)器1
REN=1;//允許串口接收
SM0=0;//串行工作方式1
SM1=1;
EA=1;//開(kāi)定時(shí)器中斷
ES=1;//開(kāi)總中斷,串口中斷打開(kāi)
while(1)
{
/*if(RI==1)//接收中斷標(biāo)志位,如果有中斷到來(lái)執(zhí)行下面語(yǔ)句
{
RI=0;
P1=SBUF;//接收的數(shù)據(jù)存在SBUF中
}*/
}
}
//中斷函數(shù)
void ser() interrupt 4
{
RI=0;//中斷到來(lái)后,RI必須清0
P1=SBUF;//接收的數(shù)據(jù)存在SBUF中
}
從上位機(jī)(PC)發(fā)送數(shù)據(jù)給單片機(jī),并顯示到單片機(jī)的LED上,然后單片機(jī)再發(fā)送給PC機(jī)。
程序:
//如果串口右數(shù)據(jù)發(fā)送就點(diǎn)亮LED
#include
unsigned char flag;
unsigned char temp;
//主函數(shù)
void main()
{
TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2
TH1=0xfd;//波特率設(shè)置
TL1=0xfd;
TR1=1;//啟動(dòng)定時(shí)器1
REN=1;//允許串口接收
SM0=0;//串行工作方式1
SM1=1;
EA=1;//開(kāi)定時(shí)器中斷
ES=1;//開(kāi)總中斷,串口中斷打開(kāi)
while(1)
{
/*if(RI==1)//接收中斷標(biāo)志位,如果有中斷到來(lái)執(zhí)行下面語(yǔ)句
{
RI=0;
P1=SBUF;//接收的數(shù)據(jù)存在SBUF中
}*/
if(flag==1)//flag=1說(shuō)明收到數(shù)據(jù)
{
ES=0;//關(guān)串口中斷,在發(fā)送時(shí)關(guān)串口中斷
flag=0;
SBUF=temp;
while(!TI);//檢測(cè)數(shù)據(jù)是否發(fā)送完
TI=0;
ES=1;
}
}
}
//中斷函數(shù)
void ser() interrupt 4
{
RI=0;//中斷到來(lái)后,RI必須清0
P1=SBUF;//接收的數(shù)據(jù)存在SBUF中
temp=SBUF;
flag=1;
}