51IO口模拟串口通讯C源程
/***51IO口模拟串口通讯C源程***/
%A --------------------------------------------------------------------------------
%A #include <reg51.h>
%A sbit BT_SND =P1^0;
%A sbit BT_REC =P1^1;
%A /**********************************************
%A IO 口模拟232通讯程序使用两种方式的C程序 占用定时器0
%A **********************************************/
%A #define TIMER0_ENABLE TL0=TH0; TR0=1;
%A #define TIMER0_DISABLE TR0=0;
%A volatile unsigned char F_TM;
%A void IntTimer0() interrupt 1
%A {
%A F_TM=1;
%A }
%A //发送一个字符
%A void PSendChar(unsigned char inch)
%A {
%A unsigned char ii;
%A ii=0;
%A F_TM=0;
%A BT_SND=0; //start bit
%A TIMER0_ENABLE; //启动
%A while(!F_TM);
%A while(ii<8)
%A {
%A if(inch&1)
%A {
%A BT_SND=1;
%A }
%A else
%A {
%A BT_SND=0;
%A }
%A F_TM=0;
%A while(!F_TM);
%A ii++;
%A inch>>=1;
%A }
%A BT_SND=1;
%A F_TM=0;
%A while(!F_TM);
%A TIMER0_DISABLE; //停止timer
%A }
%A //接收一个字符
%A unsigned char PGetChar()
%A {
%A unsigned char rch,ii;
%A TIMER0_ENABLE;
%A F_TM=0;
%A ii=0;
%A rch=0;
%A while(!F_TM); //等过起始位
%A while(ii<8)
%A {
%A rch>>=1;
%A if(BT_REC)
%A {
%A rch|=0x80;
%A }
%A ii++;
%A F_TM=0;
%A while(!F_TM);
%A }
%A F_TM=0;
%A while(!F_TM)
%A {
%A if(BT_REC)
%A {
%A break;
%A }
%A }
%A TIMER0_DISABLE; //停止timer
%A return rch;
%A }
%A //检查是不是有起始位
%A bit StartBitOn()
%A {
%A return (BT_REC==0);
%A }
%A void main()
%A {
%A unsigned char gch;
%A TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
%A PCON=00;
%A TR0=0; //在发送或接收才开始使用
%A TF0=0;
%A TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的timer是104.167*11.0592/12= 96
%A TL0=TH0;
%A ET0=1;
%A EA=1;
%A PSendChar(0x55);
%A PSendChar(0xaa);
%A PSendChar(0x00);
%A PSendChar(0xff);
%A while(1)
%A {
%A if(StartBitOn())
%A {
%A gch=PGetChar();
%A PSendChar(gch);
%A }
%A }
%A }
%A
%A
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。