原创 51 IO口模拟串口通讯C源程序

2008-3-25 19:48 1659 2 2 分类: MCU/ 嵌入式

#include <reg51.h><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


}


}


 


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条