立即注册 登录
逆天PCB论坛 返回首页

jklooo的个人空间 https://bbs.ntpcb.com/?1571 [收藏] [复制] [RSS]

日志

单片机485通讯实例程序

已有 944 次阅读2012-6-8 12:33 |个人分类:程序

/*******************************************************************
单片机与MAX485通信子程序
*******************************************************************/

#include<stdio.h>
#include<reg52.h>
#include<intrins.h>
//unsigned int len;
//unsigned char rxdbuf[len];
//unsigned char txdbuf[len];     不能在定义数组时使用变量

#define LEN 8     //可以在这里加个宏,然后将数组长度设为该宏
unsigned int len;
unsigned char rxdbuf[LEN];
unsigned char txdbuf[LEN];



/* 函数预定义 */
void initial();
void received(unsigned char *rxdbuf,unsigned char len);
void sendd(unsigned char *txdbuf, unsigned char len);
void sendbyte(unsigned char kk);
unsigned char receivebyte();

main()
{
unsigned char re;
initial(); /*串口初始化*/
while (1)
{
re=receivebyte(); /*接收命令信息*/
if(re==0x32) /*命令字0x32表示请求发送*/
sendd(txdbuf,len);
elseif(re==0x22) /*命令字0x22表示请求接收*/
received(rxdbuf,len);
else
sendbyte(0xff); /*发送错误信息“0xff”*/
}
/*************************串口初始化子程序 ******************************/
void initial()
{
TMOD=0x20; /*定时器定义*/
TH1=0xfd; /*波特率9600bps*/
TL1=0xfd;
SCON=0xd0; /*串口通信采用方式3*/
PCON=0x80;
TR1=1;
}

/****************************接收数据函数******************************/
void received(unsigned char *rxdbuf,int len)
/*接收数据函数,参数定义:其中rxdbuf存放数据起始地址,len为接收数据个数*/
{
unsigned char a=0x00;
unsigned char j;
P0_4=0;
for(j=0;j<len;j++)
{
while(RI==0);
RI=0;
rxdbuf[j]=SBUF;
a=a+rxdbuf[j];
}
while (RI==0)
RI=0;
rxdbuf [len]=SBUF;
if((SBUF^a)==0) /*比较校验和*/
{
SBUF=0x00; /*校验正确发送“0x00”*/
While(TI==0)
TI=0;
break;
}
else
{
SBUF=0xff; /*校验错误发送“0xff”*/
While(TI==0)
TI=0;
}
}

/******************************发送数据函数******************************/
void sendd(unsigned char *txdbuf,int len)
/*发送数据函数,参数:txdbuf发送数据起始地址,len发送数据个数*/
{
unsigned char a=0x00;
unsigned char j;
do{
P0_4=1;
SBUF=0x32;
while(TI!=1);
TI=0;
for(j=0;j<len;j++)
{
SBUF=txdbuf[j];
a=a+txdbuf[j];
while(TI==0);
TI=0;
}
SBUF=a;
while(TI!=1)
TI=0;
while(RI!=1)
RI=0;
}While(SBUF!=0x00); /*对方接收有错则重新联络发送数据*/
}

/*****************************发送单字节函数*****************************/
void sendbyte(unsigned char kk) /*发送单字节,参数定义:kk待发送的数据*/
{
P0_4=1;
SBUF=kk;
while(TI==0)
TI=0;
}

/*****************************接收单字节函数*****************************/
unsigned char receivebyte() /*接收单字节,返回接收值*/
{
P0_4=0;
while(RI==0)
RI=0;
return(SBUF);
}
}

路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (1 个评论)

回复 2dmin 2012-6-10 00:43
9998

facelist

您需要登录后才可以评论 登录 | 立即注册

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
返回顶部