#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_ENABLE TL0=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); } } }
|