搜索
bottom↓
回复: 36

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

  [复制链接]

出0入20汤圆

发表于 2014-1-28 08:57:48 | 显示全部楼层 |阅读模式
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出来,顺续有点乱。


出0入0汤圆

发表于 2014-1-28 10:13:08 | 显示全部楼层
我靠,太狠了!真用在产品上,还是有点怕怕啊!

出0入0汤圆

发表于 2014-1-28 10:21:43 | 显示全部楼层
mark, thanks

出20入12汤圆

发表于 2014-1-28 12:08:42 | 显示全部楼层
同时收发不行吧

出0入0汤圆

发表于 2014-1-29 10:28:48 | 显示全部楼层
这个系统资源占用太大把。

出0入0汤圆

发表于 2014-1-29 14:36:22 | 显示全部楼层
Marking and thank you !

出0入20汤圆

 楼主| 发表于 2014-1-29 15:16:57 | 显示全部楼层

不能同时发,收。

出0入0汤圆

发表于 2014-1-29 18:39:09 | 显示全部楼层
谢谢分享,
有机会研究一下

出0入20汤圆

 楼主| 发表于 2014-2-2 10:54:29 | 显示全部楼层
再发一个采用中断接收单字节的程序,效果很好。接收大量的数据,也不会乱码。
#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);//数据回发,检验是否正确!
        }
}

出0入20汤圆

 楼主| 发表于 2014-2-2 10:54:59 | 显示全部楼层
#define BPS_Delay()        {TMR2IF=0;TMR2ON=1;while(!TMR2IF);TMR2ON=0;        PR2=TtK;}

出0入20汤圆

 楼主| 发表于 2014-2-2 10:55:22 | 显示全部楼层
//------------------------------------------------------------
#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

出0入20汤圆

 楼主| 发表于 2014-2-2 10:55:48 | 显示全部楼层
//*********************************************************************************
//发送一串数据
//*********************************************************************************
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();
        }
}

出0入20汤圆

 楼主| 发表于 2014-2-2 10:56:19 | 显示全部楼层
//**********************************************************************************
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;                                        //清除标志
        }
        //-------------------------------------------------------------
       

}

出0入0汤圆

发表于 2014-2-2 12:02:48 | 显示全部楼层
学习学习 IO模拟UART口的程序

出0入50汤圆

发表于 2014-2-2 14:21:44 来自手机 | 显示全部楼层
我不明白很多人为啥总是怕呢?才9600速率而已,做好中断优先级和处理,没啥大问题。

出0入4汤圆

发表于 2014-2-2 19:11:04 | 显示全部楼层
本帖最后由 sunliezhi 于 2014-2-2 19:12 编辑

为啥不用状态机呢? delay除了用在某些时序要求比较严格的器件操作上或者while(1)之前,其它地方最好不用。

出0入0汤圆

发表于 2014-4-16 15:12:56 | 显示全部楼层
   顶一下

出0入0汤圆

发表于 2014-4-16 15:17:40 | 显示全部楼层
我晕。。。。做实验还可以

出0入0汤圆

发表于 2014-4-16 15:24:46 | 显示全部楼层
这真的累死老汉了

出0入0汤圆

发表于 2014-9-26 20:58:24 来自手机 | 显示全部楼层
实用性怎么样。

出0入0汤圆

发表于 2014-9-26 23:50:21 | 显示全部楼层
顶一下。

出5入0汤圆

发表于 2014-9-27 00:09:45 来自手机 | 显示全部楼层
有没有评估资源占用情况!

出30入0汤圆

发表于 2014-9-27 06:29:32 | 显示全部楼层
确实不错

出0入0汤圆

发表于 2014-9-27 08:17:42 | 显示全部楼层
不错,记号一下

出0入0汤圆

发表于 2014-9-27 09:21:06 | 显示全部楼层
这个不错哦!!

出0入0汤圆

发表于 2014-9-27 09:27:09 | 显示全部楼层

这个系统资源占用太大了吧

出0入0汤圆

发表于 2014-9-27 09:30:10 | 显示全部楼层
在每个t/2的地方只检测一次?建议多次采样确认位电平

出0入0汤圆

发表于 2014-9-27 11:28:08 | 显示全部楼层
有空试试,谢谢

出0入10汤圆

发表于 2014-9-27 11:40:50 | 显示全部楼层
   低端情况用用时,很好。

出0入0汤圆

发表于 2014-9-27 13:06:48 | 显示全部楼层
不错不错。

出0入0汤圆

发表于 2014-9-27 13:21:56 | 显示全部楼层
新版本的stc-isp软件带的示例里面就有软件模拟串口代码,用定时器中断做的没有delay,在STC15F104E上用过还行。

出0入0汤圆

发表于 2014-9-27 13:53:36 | 显示全部楼层
感谢楼主共享思想,但是代码中看到了delay,商业用途慎用

出0入0汤圆

发表于 2014-9-27 17:08:50 | 显示全部楼层
产品上不会这么用吧

出0入0汤圆

发表于 2015-7-28 17:15:57 | 显示全部楼层
接收数据时,程序会阻塞吧,不是我想要的。

出0入0汤圆

发表于 2015-8-7 17:44:11 | 显示全部楼层
WHILE(...)
DELAY(...)

玩玩可以,做产品,然并卵!

出0入0汤圆

发表于 2015-11-3 12:37:42 | 显示全部楼层
cool!!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2015-11-11 20:15:36 | 显示全部楼层
这个不好说啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 10:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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