专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
MAX485通信接法是怎样通信的,跪求例程!
2020-01-30 14:10
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
6162
15
15
MAX485通信接法是怎样通信的,写了了些程序都实现不了通信,在这里和大家讨论下!究竟是怎样实现的!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
lihw2@
2020-02-01 07:33
//发送一个字节
void Sendchar(unsigned char d)
{
SBUF=d;
while(!TI); //等待发送完成,TI置位
TI=0;
}
//发送字符串
void SendString(unsigned char *str)
{
while(*str)
{
Sendchar(*str) ;
str++;
}
}
void sen485(uchar *p,uchar i)//发送
{
uchar x;
EA=0;
REN=0;
_nop_();
_nop_();
DIR=1;//rs485 发送模式
_nop_();
_nop_();
delaycom(8000);
for(x=0;x<i;x++)
{
Sendchar(*p);
p++;
}
delaycom(5000);
DIR=0;//rs485 接收模式
REN=1;
EA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
//串口中断服务程序
void UART1_Rountine(void) interrupt 4 //放在这里 和放在main()里面是一样的
{
unsigned char idata RxData=0;
EA=0;
if(RI) //必须判断RI(接收中断标志)是否为1
{
RI=0;
RxData = SBUF;
ISP_Check(RxData); //在这里添加你的接收代码
}
EA=1;
}
void delaycom(unsigned int time)
{
while(--time);
}
//
void ISP_Check(unsigned char tmp)//判断就收数据是否符合规定的长度与协议,如ok就存到temp2。
{
static uchar big=0;
static uchar counter=0;
static uchar rsov=0;
if( ((big==0) && ((tmp==0xA0) ||(tmp==0xcf)) )||(rsov==1))
{
big=1;
rsov=1;
temp[counter]=tmp;
counter++;
if((counter>7)&&( over==0))
{
big=0;
rsov=0;
over=1;
temp2[0]=temp[0];
temp2[1]=temp[1];
temp2[2]=temp[2];
temp2[3]=temp[3];
temp2[4]=temp[4];
temp2[5]=temp[5];
temp2[6]=temp[6];
temp2[7]=temp[7];
counter=0;
}
return;
}
else
{
big=0;
rsov=0;
counter=0;
}
}
加载中...
查看其它15个回答
一周热门
更多
>
相关问题
【东软载波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
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void Sendchar(unsigned char d)
{
SBUF=d;
while(!TI); //等待发送完成,TI置位
TI=0;
}
//发送字符串
void SendString(unsigned char *str)
{
while(*str)
{
Sendchar(*str) ;
str++;
}
}
void sen485(uchar *p,uchar i)//发送
{
uchar x;
EA=0;
REN=0;
_nop_();
_nop_();
DIR=1;//rs485 发送模式
_nop_();
_nop_();
delaycom(8000);
for(x=0;x<i;x++)
{
Sendchar(*p);
p++;
}
delaycom(5000);
DIR=0;//rs485 接收模式
REN=1;
EA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
//串口中断服务程序
void UART1_Rountine(void) interrupt 4 //放在这里 和放在main()里面是一样的
{
unsigned char idata RxData=0;
EA=0;
if(RI) //必须判断RI(接收中断标志)是否为1
{
RI=0;
RxData = SBUF;
ISP_Check(RxData); //在这里添加你的接收代码
}
EA=1;
}
void delaycom(unsigned int time)
{
while(--time);
}
//
void ISP_Check(unsigned char tmp)//判断就收数据是否符合规定的长度与协议,如ok就存到temp2。
{
static uchar big=0;
static uchar counter=0;
static uchar rsov=0;
if( ((big==0) && ((tmp==0xA0) ||(tmp==0xcf)) )||(rsov==1))
{
big=1;
rsov=1;
temp[counter]=tmp;
counter++;
if((counter>7)&&( over==0))
{
big=0;
rsov=0;
over=1;
temp2[0]=temp[0];
temp2[1]=temp[1];
temp2[2]=temp[2];
temp2[3]=temp[3];
temp2[4]=temp[4];
temp2[5]=temp[5];
temp2[6]=temp[6];
temp2[7]=temp[7];
counter=0;
}
return;
}
else
{
big=0;
rsov=0;
counter=0;
}
}
一周热门 更多>