51单片机普通I/O口,做串口用,可以和真的串口一样,设置发送和接收的波特率,和发送接收的模式-51
-
- /****************************************************************************************
- *文件:UART2.C
- *功能:利用LPC900普通I/O口实现模拟串口,占用定时器1
- *日期:05/07/18
- *****************************************************************************************/
- #include "Reg935.h"
- #include "uart2.h"
- #define uchar unsigned char
- #define BRH 0xfd //0xfe 0x95//波特率为9600,使用内部RC振荡
- #define BRL 0x15 //0xfd 0x15 //波特率为4800,使用内部RC振荡
- //////////////////////////////////////////////////////////////////////////////////////////
- uchar num;
- uchar uart2s; //ie. SBUF2
- unsigned char uart2f=0; //0:disable 1:read 2:send 3: read completed 4:send completed
- //****************************************************************************************
- void timer1_isr(void) interrupt 3
- {
- TH1=BRH;
- TL1=BRL;
- if(uart2f==2) //每个IF大概运行32周期,从而可以计算出BRH和BRL
- {
- if(num>1)
- {
- if(uart2s&(0x01<<(9-num)))
- {uart2txd=1;}
- else
- {uart2txd=0;}
- num--;
- }
- else if(num==1)
- {
- uart2txd=1;
- //uart2f=4;
- num--;
- // num=9;
- }
- else {TR1=0;uart2f=4;}
- }
- if(uart2f==1)
- {
- if(num>1)
- {
- if(uart2rxd)
- {uart2s=uart2s|(0x01<<(9-num));}
- else
- {uart2s=uart2s&~(0x01<<(9-num));}
- num--;
- }
- // else if(num==1){if(uart2rxd)num--;
- // }
- else
- {
- uart2f=3;
- TR1=0;
- }
- }
- }
- //---------------------------------------------------------------------------------------
- //uart2send: 向模拟串口发送一个字符
- //入口参数: s 被发送字符
- //出口参数: 无
- //---------------------------------------------------------------------------------------
- void uart2send(uchar s)
- {
- TH1=BRH;
- TL1=BRL;
- num=9;
- uart2s=s;
- uart2f=2;
- uart2txd=0;
- TR1=1;
- while(uart2f!=4);
- }
- //---------------------------------------------------------------------------------------
- //uart2read: 向模拟串口接收一个字符
- //入口参数 无
- //出口参数 s 被发送字符
- //---------------------------------------------------------------------------------------
- unsigned char uart2read(void)
- {
- while(uart2rxd);
- num=9;
- uart2f=1;
- TH1=BRH-1;
- TL1=BRL;//-0x15;
- TR1=1;
- while(uart2f!=3);
- while(!uart2rxd);
- return(uart2s);
- }
- //---------------------------------------------------------------------------------------
复制代码