//串口指令转换器程序,用于AT89C51 //2004-2-25 #include //全局变量定义 bit flag_uart_busy; unsigned char uartread,uartwrite; unsigned char uartbuf[8]; unsigned char urvcmd;//uart接收到的控制指令 #define cmd_north 51 #define cmd_south 52 #define cmd_dec_stop 53 #define cmd_east 54 #define cmd_west 55 #define cmd_ra_normal 56 #define cmd_ra_stop 57 #define cmdr_north 41 #define cmdr_south 42 #define cmdr_dec_stop 43 #define cmdr_east 44 #define cmdr_west 45 #define cmdr_ra_normal 46 #define cmdr_ra_stop 47 sbit pstp=P3^3; sbit pn=P3^4; sbit ps=P3^5; sbit pe=P3^6; sbit pw=P3^7; //主程序 void main (void){ P3=0; //延时 {unsigned int i; for(i=0;i<20000;i++){ //delay ;} for(i=0;i<60000;i++){ //delay ;} } //初始化设置 //UART configuration SCON = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr TMOD|= 0x20; // TMOD: timer 1, mode 2, 8-bit reload TL1=0xFD; //9600 baud rate TH1=0xFD; //9600 baud rate reload TXD=1; RXD=1; //interrupt configuration EA=1; ET1=0; //TIMER 1 disabled ES=1; //UART enabled //开始定时 TR1=1; uartread=0; uartwrite=0; flag_uart_busy=0; while (1) { if(uartread!=uartwrite){//有新数据 if(++uartread>7) uartread=0; urvcmd=uartbuf[uartread]; if(urvcmd>=192){ P0=urvcmd; } else if(urvcmd>=128){ P1=urvcmd; } else if(urvcmd>=64){ P2=urvcmd; } else if(urvcmd<16){ P3&=0x0F; P3|=(urvcmd*16); } else if(urvcmd<32){ P2&=0xF0; P2|=(urvcmd-16); } else { //32<=,<64 switch(urvcmd){ case cmd_ra_normal: pe=0; pw=0; pstp=0; break; case cmd_east: pw=0; pe=1; break; case cmd_west: pe=0; pw=1; break; case cmd_dec_stop: pn=0; ps=0; break; case cmd_north: ps=0; pn=1; break; case cmd_south: pn=0; ps=1; break; case cmd_ra_stop: pe=0; pw=0; pstp=1; break; case cmdr_ra_normal: pe=1; pw=1; pstp=1; break; case cmdr_east: pw=1; pe=0; break; case cmdr_west: pe=1; pw=0; break; case cmdr_dec_stop: pn=1; ps=1; break; case cmdr_north: ps=1; pn=0; break; case cmdr_south: pn=1; ps=0; break; case cmdr_ra_stop: pe=1; pw=1; pstp=0; break; default: break; } //end of switvh } //end of if //ack while(flag_uart_busy){ ;} flag_uart_busy=1; SBUF=255-urvcmd; } //end of if } //end of while(1) } //中断处理程序 /*************************************************** uart interrupt ****************************************************/ void uart(void) interrupt 4 using 2{ if( TI){ TI=0; } if (RI){ if(++uartwrite>7) uartwrite=0; uartbuf[uartwrite]=SBUF; RI=0; } flag_uart_busy=0; }