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