关于普通IO实现单线单工通信的编程思路

2020-01-19 19:36发布

本帖最后由 lmt50211 于 2014-5-28 13:56 编辑

456.JPG (96.94 KB, 下载次数: 0) 下载附件 2014-5-28 13:55 上传 这个是匠人手记里的一节,因为对发送部分没有编程思路,现发贴希望各位提出一些各自的见解,还望各位赐教。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
zyw19987
1楼-- · 2020-01-21 12:29
顺便问这种方式硬件如何做到几千米的距离?
lmt50211
2楼-- · 2020-01-21 17:52
zyw19987 发表于 2014-5-29 13:50
顺便问这种方式硬件如何做到几千米的距离?

这个暂时就不知道了,我这个应用在只有几米的产品上。
lmt50211
3楼-- · 2020-01-21 19:40
本帖最后由 lmt50211 于 2014-5-29 15:30 编辑

根据“jinbangzhou” 提供的代码,调整后可以实现通信,但通信的质量还需要进一步测试。
现附上相应代码,请各位提点。。

1)  发送部分  MCU   HT   BS84B08-3    内部16M   定时器: 250us中断一次(2K无源蜂鸣器)
#define p_data_out           _pa1    //通信口
#define temp_send_byte   4         //4字节数据,后2字节为前2字节的反码
bit b_send_ok;      //发送数据完成标志位
unsigned char r_send_cnt; //发送时基
unsigned char r_send_cnts;//Bit0,Bit1计数
unsigned char r_send_mode;//发送数据状态
unsigned char r_send_data[temp_send_byte];//发送数据缓存器
unsigned char r_send_num; //发送数据位数
unsigned char r_send_byte;//发送数据字节数
//====================================================================
//===          测试函数              ===//
void test_process(void)
{
        bit b_send_ok = 0;   //清发送完成标志位
        r_send_data[0] = 0x04;
        r_send_data[1] = 0xf0;
        r_send_data[2] = 0xfb;
        r_send_data[3] = 0x0f;
}
//====================================================================
//===          中断服务函数          ===//
#pragma vector  Interrupt_Extemal        @ 0x0c
void Interrupt_Extemal()
{
//======================================//       
        r_t2500us ++;
        if(r_t2500us >= 10)
        {
                r_t2500us = 0;
                b_t2500us = 1;
                r_t100ms ++;       
                if(r_t100ms >= 40)
                {
                        r_t100ms = 0;
                        b_t100ms = 1;
                }
                r_t500ms ++;
                if(r_t500ms >= 200)
                {
                        r_t500ms = 0;
                        b_t500ms = 1;       
                }
        }
//======================================//
        if(b_send_ok == 0)//发送请求
        {
                r_send_cnt++;
            switch(r_send_mode)
            {
                case 0:
                    if(r_send_cnt <= 80)
                    {
                        p_data_out = 1;   
                    }   
                    else if(r_send_cnt <= 160)//发送起始码
                    {
                        p_data_out = 0;   
                    }
                    else
                    {
                        r_send_cnt = 0;
                        r_send_mode = 1;//进入发送数据码
                    }
                    break;
                case 1:
                    if(r_send_data[r_send_byte] & (1 << r_send_num))
                    {
                        r_send_cnts = 20;      
                    }
                    else
                    {
                        r_send_cnts = 10;   
                    }
                    if(r_send_cnt <= (r_send_cnts / 2))// 脉冲一半时间发低电平
                    {
                        p_data_out = 0;   
                    }
                    else if(r_send_cnt <= r_send_cnts)// 脉冲一半时间发高电平
                    {
                        p_data_out = 1;
                    }
                    else
                    {
                        r_send_cnt = 0;
                        r_send_num ++;
                        if(r_send_num >= 8)//发送完8位
                        {
                            r_send_num = 0;
                            r_send_byte++;
                            if(r_send_byte >= temp_send_byte)//发送多字节
                            {
                                r_send_byte = 0;
                                r_send_mode = 2;//进入结束码
                            }   
                        }   
                    }
                    break;
                case 2://结束码
                    if(r_send_cnt <= 20)
                    {
                        p_data_out = 0;   
                    }
                    else if(r_send_cnt <= 40)
                    {
                        p_data_out = 1;
                    }
                    else
                    {
                        p_data_out = 0;
                        r_send_cnt = 0;
                        b_send_ok = 1;//发送完成  
                        r_send_mode = 0;//恢复到头码状态  
                    }
                    break;
                default:
                    break;
            }
        }
}
波形图:

123.jpg (98.54 KB, 下载次数: 0)

下载附件

2014-5-29 15:23 上传

lmt50211
4楼-- · 2020-01-22 01:31
 精彩回答 2  元偷偷看……
Vampireyifeng
5楼-- · 2020-01-22 07:07
mark一下,普通IO实现单线单工通信
ZJetWay
6楼-- · 2020-01-22 07:54
早三年见到这个就好了.

一周热门 更多>