专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
关于普通IO实现单线单工通信的编程思路
2020-01-19 19:36
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
5668
31
31
本帖最后由 lmt50211 于 2014-5-28 13:56 编辑
456.JPG
(96.94 KB, 下载次数: 0)
下载附件
2014-5-28 13:55 上传
这个是匠人手记里的一节,因为对发送部分没有编程思路,现发贴希望各位提出一些各自的见解,还望各位赐教。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
31条回答
lmt50211
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 上传
加载中...
查看其它31个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
根据“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 上传
一周热门 更多>