單片機(jī)與PC機(jī)串口通訊程序
單片機(jī)與PC機(jī)串口通訊程序
#include
#defineucharunsignedchar
#defineSLAVE0xF1// 單片機(jī) 地址
#defineBN10//傳送一次的字節(jié)數(shù)
ucharidatardata[10];
ucharidatatdata[10]={"abcdefghij"};
ucharreceive(ucharaddrs);
charsend();
voidmain(void)
{
uchari;
for(i=0;i<10;i++)
TMOD=0x20;//定時器T1定義為模式2
TL1=0xE6;TH1=0xE6;//置初值
PCON=0x00;
TR1=1;
SCON=0xE0;//設(shè)置串行口控制字,方式3,允許接收
receive(SLAVE);//接收數(shù)據(jù)函數(shù)
send();//發(fā)送數(shù)據(jù)函數(shù)
}
voiderror(void)
{
SBUF=0xFF;//發(fā)給PC機(jī)數(shù)據(jù)出錯標(biāo)志
while(TI!=1);//等待發(fā)送完
TI=0;
}
ucharreceive(ucharaddrs)
{uchari,p;
while(1)
{
while(RI!=1);//等待PC機(jī)的聯(lián)絡(luò)信號
RI=0;
if(SBUF!=addrs)
error();//若地址出錯,發(fā)出錯標(biāo)志
else
{
TB8=0;//清地址標(biāo)志位,準(zhǔn)備接收數(shù)據(jù)
SBUF=0x00;//發(fā)約定代碼00H,說明地址正確
while(TI!=1);TI=0;
while(RI!=1);RI=0;
{
while(1)
{p=0;
for(i=0;i
while(RI!=1);RI=0;
rdata[i]=SBUF;// 單片機(jī) 接收數(shù)據(jù)
p=p+rdata[i];
}
while(RI==0);RI=0;
if(SBUF==p)
{SBUF=0x00;//校驗和相同,發(fā)0x00給PC機(jī)
while(TI!=1);TI=0;
}
else
{SBUF=0xFF;//校驗和不同,發(fā)0xFF給PC機(jī)
while(TI!=1);TI=0;
}
}
TB8=1;//重置地址標(biāo)志位
return(0);
}
}
}
}
charsend()// 單片機(jī) 發(fā)送數(shù)據(jù)函數(shù)
{
uchari,p;
do{
p=0;//清校驗和
for(i=0;i
p=p+tdata;//計算校驗和
while(TI!=1);TI=0;
}
SBUF=p;//發(fā)送校驗和給PC機(jī)
while(TI!=1);TI=0;
while(RI!=1);RI=0;
}while(SBUF!=0);//PC機(jī)接收不正確, 單片機(jī) 重新發(fā)送
TB8=1;//重置地址標(biāo)志位
return(0);
}