//115.2k串行口通信程序,校验方式为简单双向校验,
//而且是必要的,因为任何采用中断、crc等的方法
//均很难保证速度和避免错误.
//总体速度5KB/秒
//单片机程序
//使用22.1184晶振
unsignedchartime,b_break,b_break_3;
//35.555ms
voidint_t0(void)interrupt1{
TH0=0;
if((++b_break_3)>2)b_break=1;
time++;
}
unsignedcharrec(void){
TH0=0;b_break_3=0;b_break=0;
while(RI==0){
if(b_break)return(1);//等待pc发送100ms超时
}
RI=0;
SBUF=SBUF;
return(SBUF);
}
/*返回1表示失败*/
bitsen(unsignedchard){
SBUF=d;
TH0=0;b_break_3=0;b_break=0;
while(RI==0){
if(b_break)return(1);//等待pc送回相同字节数据,100ms超时
}
RI=0;
if(SBUF!=d)return(1);
return(0);
}
voidmain(void){
unsignedinti;
unsignedchard;
EA=1;
SCON=0xd8;PCON=0x80;
TMOD=0x21;
TL1=TH1=0xff;TR1=1;
TH0=0;ET0=TR0=1;
while(1){
d=rec();
if((!b_break)&&(d==0x55)){
d=rec();
if(!b_break){
if(d==0xaa){
//接收到pc送来的要求发送指令0xaa55
for(i=0;i<1000;i++){
if(sen(i)){
//发送错误
break;
}
}
}elseif(dd==0xaa){
//接收到pc送来的要求接收指令0xaaaa
for(i=0;i<1000;i++){
d=rec();
if(!b_break){
//正确接收处理
}else{
//接收错误处理
break;
}
}
}
}
}
}
}
//电脑程序tc2.0
#include"stdio.h"
#include"dos.h"
#include"process.h"
#include"string.h"
#include"conio.h"
#include<dir.h>
unsignedchartime_out;
voidinit_com1(void){
outportb(0x3fb,0x80);
outportb(0x3f8,1);
outportb(0x3f9,0x0);
outportb(0x3fb,0x3);
}
voidsen_com1(unsignedchard){
longi;
time_out=0;
while(!(inportb(0x3fd)&0x20));
outportb(0x3fd,0x0);
outportb(0x3f8,d);
i=clock();
while(1){
if(clock()>(i+8)){time_out=1;return;}
if((inp(0x3fd)&0x1)==1)break;
}
if(inp(0x3f8)!=d){time_out=2;return;}
}
unsignedcharrec_com1(void){
longi;
unsignedchard;
time_out=0;
i=clock();
while(1){
if(clock()>(i+8)){time_out=1;return(0);}
if((inp(0x3fd)&1)==1)break;
}
d=inp(0x3f8);
while(!(inportb(0x3fd)&0x20));
outportb(0x3fd,0x0);
outportb(0x3f8,d);
return(d);
}
voidmain(void){
inti;
longst;
init_com1();
st=clock();
sen_com1(0xaa);
if(time_out){printf("CPUnotready!");exit(-1);}
sen_com1(0xaa);
if(time_out){printf("CPUnotready!");exit(-1);}
for(i=0;i<1000;i++){
sen_com1(i);
if(time_out){printf("CPUnotready!");exit(-1);}
}
printf("Totaluse%3.2fS.",(clock()-st)/18.2);
exit(1);
}