发一个很好用的IO模拟UART口的程序

2020-02-06 10:09发布

1:波特率可以到9600.
2:数据接,发很可靠。
3:接收采用中断方式,实时性较高。
********************************************************************************/
#define  UART_SEND_Pin GPIO4        //GPIO4=TXD
//********************************************************************************
void BPS_Delay(void){

        TMR2IF=0;
        TMR2ON=1;
        while(!TMR2IF);
        TMR2ON=0;
        PR2=TtK;
}
//*********************************************************************************
//发送一串数据
//*********************************************************************************
void SendOut(unsigned char *p,unsigned char Long){
        unsigned char i,Dat;          
        while(Long--){
                i=8;                                                  //1200 8.n 1        P d8 S
                UART_SEND_Pin=0;                        //开始位
                PR2=TtK;
                BPS_Delay();
                Dat=*p++;
                while(i--){
                        UART_SEND_Pin=(bit)(Dat & 0x01);
                        Dat>>=1;       
                        BPS_Delay();
                }
                UART_SEND_Pin=1;
                BPS_Delay();       
        }
}

#define Uart_IN_IO  GPIO3   //GPIO3=接收!
void Uart_Rece (void ){
        unsigned char i,j;
        unsigned char Buf[8];         //接收缓存!
        unsigned char bt;
        //***********************************************************
        //产生中断,开始接收!查询!
        while(!Uart_IN_IO);
        //************************************************************
        for(j=0;j<sizeof(Buf);j++){
                //***********************************************************
                //产生中断,开始接收!查询!
                i=TtK/2;
                i +=TtK;
                //***********************************************************
                PR2=i;
                BPS_Delay();
                //************************************************************
                bt=8;i=0;
                while(bt--){
                        i>>=1;
                        if(Uart_IN_IO) i |=0x80;
                        //*************************************************************
                        //延时等待下一个位
                        BPS_Delay();
                }
                //************************************************************
                //等待结束位 (1)
                BPS_Delay();
                Buf[j]=i;       
                //数据处理  。。。。



        }
//**********************************************************************************
void Exit_int_config(void){
        INTCON         |=B0000_1000;                //GPIE=1
        IOC         =B0000_1000;                //RXD 脚启动电平中断
}

//***********************************************************************************
//中断入口总程序
void interrupt ISR(void){                //中断服务总程序.
        if(GPIE && GPIF){
                GPIF=0;                                        //清除标志
                //****************************************
                Uart_Rece ();
        }
        //-------------------------------------------------------------
       

}

//------------------------------------------------------------
#define F_osc        (4000000)                        //工作频率 4MHz
//------------------------------------------------------------
#define BPS                        (9600)                         //9600
#define TUS                        (20)                        //微调时间 15~35  2013-5-2测试Ok 9600
//*************************************************************
//t1 自动重装波特率计算公式 CCLK/(256-TH1)32
//*************************************************************
#define TtK                        (F_osc/4/BPS-TUS)        //化简后的结果!(15开始没有乱码到160很好)

从多个文件中COPY出来,顺续有点乱。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
2006lc
1楼-- · 2020-02-07 05:06
谢谢分享,
有机会研究一下
mon51
2楼-- · 2020-02-07 05:24
再发一个采用中断接收单字节的程序,效果很好。接收大量的数据,也不会乱码。
#define Uart_IN_IO  GPIO3                   //GPIO3=接收!
#define MAX_RS232_CNT                20                //通讯的字节数
//**************************************************************
unsigned char Get_Uart_Rece_Dat (void ){
        unsigned char i,bt;

        BPS_Delay();
        //************************************************************
        bt=8;
        i=0;
        while(bt--){
                i>>=1;
                if(Uart_IN_IO) i |=0x80;
                //*************************************************************
                //延时等待下一个位
                BPS_Delay();
        }
        //************************************************************
        //等待结束位 (1)
        //BPS_Delay();
        return i;
}
//-----------------------------------------------------------------------
static char getBuf[MAX_RS232_CNT],cnt=0;         //接收缓存!
static bit fFlag=0;
//********************************************************************
void Uart_Rece (void ){
        //***********************************************************
        //产生中断,开始接收!查询!
        PR2=TtK/2+TtK;
        getBuf[cnt]=Get_Uart_Rece_Dat();
        if(++cnt >=sizeof(getBuf)){
                fFlag=1;       
                cnt=0;
        }
}
//********************************************************************
void SendBack(void){
//        unsigned char i;
        if(fFlag){
                fFlag=0;
                //**************************************
                //数据校验!
               
                SendOut(getBuf,MAX_RS232_CNT);//数据回发,检验是否正确!
        }
}
mon51
3楼-- · 2020-02-07 07:04
 精彩回答 2  元偷偷看……
mon51
4楼-- · 2020-02-07 10:54
//------------------------------------------------------------
#define F_osc        (4000000)                        //工作频率 4MHz
//------------------------------------------------------------
#define BPS                        (9600)                         //9600
//************************************************************
//TUS=27  9600
//UDS=    4800
#define TUS                        (20)                        //27模拟仿真很好!!微调时间 15~35  2013-5-2测试Ok 9600
//*************************************************************
//t1 自动重装波特率计算公式 CCLK/(256-TH1)32
//*************************************************************
#define TtK                        (F_osc/4/BPS-TUS)        //化简后的结果!(15开始没有乱码到160很好)将PCLK转换成MHZ
mon51
5楼-- · 2020-02-07 11:00
//*********************************************************************************
//发送一串数据
//*********************************************************************************
void SendOut(unsigned char *p,unsigned char Long){
        unsigned char i,Dat;          
        while(Long--){
                i=8;                                                  //9600 8.n 1        P d8 S
                UART_SEND_Pin=0;                        //开始位
                PR2=TtK;
                BPS_Delay();
                Dat=*p++;
                while(i--){
                        UART_SEND_Pin=(bit)(Dat & 0x01);
                        Dat>>=1;       
                        BPS_Delay();
                }
                UART_SEND_Pin=1;
                BPS_Delay();
        }
}
mon51
6楼-- · 2020-02-07 11:40
//**********************************************************************************
void Exit_int_config(void){
        INTCON         |=B0000_1000;                //GPIE=1
        IOC         =B0000_1000;                //RXD 脚启动电平中断
}

//***********************************************************************************
//中断入口总程序
void interrupt ISR(void){                //中断服务总程序.
        if(GPIE && GPIF){
                //****************************************
                Uart_Rece ();
                GPIO=GPIO;
                GPIF=0;                                        //清除标志
        }
        //-------------------------------------------------------------
       

}

一周热门 更多>