#include <reg51.h> sbit BT_SND = P1 ^ 0; sbit BT_REC = P1 ^ 1; /********************************************** IO 口模拟232通讯程序 使用两种方式的C程序 占用定时器0 **********************************************/ #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLETL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0 = ACC ^ 0; sbit ACC1 = ACC ^ 1; sbit ACC2 = ACC ^ 2; sbit ACC3 = ACC ^ 3; sbit ACC4 = ACC ^ 4; sbit ACC5 = ACC ^ 5; sbit ACC6 = ACC ^ 6; sbit ACC7 = ACC ^ 7; void IntTimer0() interrupt 1 { F_TM = 1; } //发送一个字符 void PSendChar(unsigned char inch) { #ifdef MODE_QUICK ACC = inch; F_TM = 0; BT_SND = 0; //start bit TIMER0_ENABLE; //启动 while (!F_TM); BT_SND = ACC0; //先送出低位 F_TM = 0; while (!F_TM); BT_SND = ACC1; F_TM = 0; while (!F_TM); BT_SND = ACC2; F_TM = 0; while (!F_TM); BT_SND = ACC3; F_TM = 0; while (!F_TM); BT_SND = ACC4; F_TM = 0; while (!F_TM); BT_SND = ACC5; F_TM = 0; while (!F_TM); BT_SND = ACC6; F_TM = 0; while (!F_TM); BT_SND = ACC7; F_TM = 0; while (!F_TM); BT_SND = 1; F_TM = 0; while (!F_TM); TIMER0_DISABLE; //停止timer #else unsigned char ii; ii = 0; F_TM = 0; BT_SND = 0; //start bit TIMER0_ENABLE; //启动 while (!F_TM); while (ii < 8) { if (inch & 1) { BT_SND = 1; } else { BT_SND = 0; } F_TM = 0; while (!F_TM); ii++; inch >>= 1; } BT_SND = 1; F_TM = 0; while (!F_TM); #endif TIMER0_DISABLE; //停止timer } //接收一个字符 unsigned char PGetChar() { #ifdef MODE_QUICK TIMER0_ENABLE; F_TM = 0; while (!F_TM); //等过起始位 ACC0 = BT_REC; TL0 = TH0; F_TM = 0; while (!F_TM); ACC1 = BT_REC; F_TM = 0; while (!F_TM); ACC2 = BT_REC; F_TM = 0; while (!F_TM); ACC3 = BT_REC; F_TM = 0; while (!F_TM); ACC4 = BT_REC; F_TM = 0; while (!F_TM); ACC5 = BT_REC; F_TM = 0; while (!F_TM); ACC6 = BT_REC; F_TM = 0; while (!F_TM); ACC7 = BT_REC; F_TM = 0; while (!F_TM) { if (BT_REC) { break; } } TIMER0_DISABLE; //停止timer return ACC; #else unsigned char rch, ii; TIMER0_ENABLE; F_TM = 0; ii = 0; rch = 0; while (!F_TM); //等过起始位 while (ii < 8) { rch >>= 1; if (BT_REC) { rch |= 0x80; } ii++; F_TM = 0; while (!F_TM); } F_TM = 0; while (!F_TM) { if (BT_REC) { break; } } TIMER0_DISABLE; //停止timer return rch; #endif } //检查是不是有起始位 bit StartBitOn() { return (BT_REC == 0); } void main() { unsigned char gch; TMOD = 0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位 自动重装) */ PCON = 00; TR0 = 0; //在发送或接收才开始使用 TF0 = 0; TH0 = (256 - 96); //9600bps 就是 1000000/9600=104.167微秒 执行的 timer是 // 104.167 * 11.0592 / 12 = 96 TL0 = TH0; ET0 = 1; EA = 1; PSendChar(0x55); PSendChar(0xaa); PSendChar(0x00); PSendChar(0xff); while (1) { if (StartBitOn()) { gch = PGetChar(); PSendChar(gch); } } }