查看: 1007|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-15 08:36:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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出来,顺续有点乱。
转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表