//115.2k串行口通信程序,校驗方式為簡單雙向校驗, //而且是必要的,因為任何采用中斷、crc等的方法 //均很難保證速度和避免錯誤. //總體速度5KB/秒
//單片機程序 //使用22.1184晶振 unsigned char time,b_break,b_break_3; //35.555ms void int_t0(void) interrupt 1 { TH0=0; if ((++b_break_3)>2) b_break=1; time++; }
//
unsigned char rec(void) { TH0=0;b_break_3=0;b_break=0; while (RI==0) { if (b_break) return(1); //等待pc發(fā)送100ms超時 } RI=0; SBUF=SBUF; return(SBUF); } /*返回1表示失敗*/ bit sen(unsigned char d) { SBUF=d; TH0=0;b_break_3=0;b_break=0; while (RI==0) { if (b_break) return(1); //等待pc送回相同字節(jié)數(shù)據(jù),100ms超時 } RI=0; if (SBUF!=d) return(1); return(0); }
void main(void) { unsigned int i; unsigned char d; 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送來的要求發(fā)送指令0xaa55 for (i=0;i<1000;i++) { if (sen(i)) { //發(fā)送錯誤 break; } } } else if (dd==0xaa) { //接收到pc送來的要求接收指令0xaaaa for (i=0;i<1000;i++) { d=rec(); if (!b_break) { //正確接收處理 } else { //接收錯誤處理 break; } } } } } } }
//電腦程序tc2.0 #i nclude "stdio.h" #i nclude "dos.h" #i nclude "process.h" #i nclude "string.h" #i nclude "conio.h" #i nclude <dir.h>
unsigned char time_out;
void init_com1(void) { outportb(0x3fb,0x80); outportb(0x3f8,1); outportb(0x3f9,0x0); outportb(0x3fb,0x3); } void sen_com1(unsigned char d) { long i; 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;} } unsigned char rec_com1(void) { long i; unsigned char d; 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); } void main(void) { int i; long st; init_com1(); st=clock(); sen_com1(0xaa); if (time_out) {printf("CPU not ready!");exit(-1);} sen_com1(0xaa); if (time_out) {printf("CPU not ready!");exit(-1);} for (i=0;i<1000;i++) { sen_com1(i); if (time_out) {printf("CPU not ready!");exit(-1);} } printf("Total use %3.2f S.",(clock()-st)/18.2); exit(1); } |