登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
51单片机论坛
›
单片机串口程序调不通?????
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版
单片机串口程序调不通?????
[复制链接]
1245
0
ad***
管理员
发表于 2012-9-3 01:39:07
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
主机程序://#include<AT89X52.h>
#include<AT892051.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define SLAVE 0x78 //从机地址
#define BN 4
uchar idata rbuf[4];
uchar idata tbuf[4]={0x7f,0xfb,0x7b,0xff};
sbit P13=P1^3;
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++)
{
_nop_();
}
}
void err(void) //发复位FFH命令
{
SBUF=0xff;
while(!TI);
TI=0;
}
uchar master(uchar addr,uchar command) //主机函数
{
uchar aa,i,p;
while(1)
{
SBUF=SLAVE; //发呼叫地址
while(!TI);
TI=0;
while(!RI); //等待从机回答
RI=0;
P1=SBUF;
if(SBUF!=addr)
{
err(); //地址错,发复位命令
}
else
{ //地址相符
TB8=0; //清地址标志
SBUF=command; //发命令
while(!TI);
TI=0;
delay(200000000);
while(!RI);
RI=0; //等待从机命令答复
aa=SBUF;
P1=SBUF;
if((aa&0x80)==0x80)
{
TB8=1; //命令出错,发复位命令
err();
}
else
{
if(command==0xf0) //是发送命令
{
if((aa&0xf0)==0xf0) //从机准备好接收
{
do{
p=0; //清校验和
for(i=0;i<BN;i++)
{
SBUF=tbuf[i]; //发送一字节
p+=tbuf[i];
while(!TI);
TI=0;
delay(200000000);
}
SBUF=p; //发校验和
while(!TI);
TI=0;
while(!RI);
RI=0; //等待校验和的应答
}while(SBUF!=0); //接收出错,重发。00h为正确,ffh为错误
TB8=1; //接收正确,置地址标志
return(0);
}
}
else
{
if((aa&0x02)==0x02) //从机准备好发送
{
while(1)
{
p=0; //清校验和
for(i=0;i<BN;i++)
{
while(!RI);
RI=0;
rbuf[i]=SBUF; //接受一数据
p+=rbuf[i];
}
while(!RI);
RI=0;
if(SBUF==p)
{
SBUF=0x00; //校验和相同,发00h
while(!TI);TI=0;
break; //退出
}
else
{
SBUF=0xff; //校验和不同,发0FF,重新接收
while(!TI);TI=0;
}
}
TB8=1; //置地址标志
return(0);
}
}
}
}
}
}
void init()
{
//P0=0xff;
P1=0xff;
//P2=0xff;
P3=0xff;
TMOD=0x20; //T1方式3
TH1=0xf9;
TL1=0xf9; /*传输波特率4800,设SYSDCLK=12Mhz,T1M=0(按振荡器的12分频计数),SMOD0=0*/
PCON=0x00;
TR1=1;
SCON=0xf8;
}
char code SST516[3]_at_ 0x003b;
void main()
{
init();
delay(200000000);
P13=0; //UART0方式3,SM20=1,REN0=1,TB80=1
master(SLAVE,0xf0);
//master(SLAVE,0x02);
}
从机程序:#include<AT892051.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define SLAVE 0x78
#define BN 4
uchar idata trbuf[4];
uchar idata rebuf[4];
bit tready;
bit rready;
sbit P13=P1^3;
void str(void); //函数声明
void sre(void);
void inint()
{
P1=0xff;
P3=0xff;
TMOD=0x20;
TH1=0xf9;
TL1=0xf9;
PCON=0x00;
TR1=1;
SCON=0xf0;
//EA=1;
//PS=1;
//ES=1;
}
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++)
{
_nop_();
}
}
void serial()
//void serial () interrupt 4 using 3 //中断函数
{
uchar a;
RI=0;
//ES=0; //关串行口中断
P1=SBUF;
if(SBUF!=SLAVE)
{
//ES=1;
goto reti;
} //非本机地址,继续监听
SM2=0;
SBUF=SLAVE; //回送从机地址
while(!TI);
TI=0;
delay(200000000);
while(!RI);
RI=0; //接收命令
if(RB8==1)
{
SM2=1;
//ES=1;
goto reti;
} //是复位命令,继续监听
P1=SBUF;
a=SBUF;
if(a==0xf0) //接收主机数据命令
{
if(rready==1)
{
SBUF=0xf0; //发准备好接收状态字
}
else
{
SBUF=0x80; //发未准备好接收状态字
}
while(!TI);
TI=0;
delay(200000000);
while(!RI);
RI=0;
if(RB8==1)
{
SM2=1;
//ES=1;
goto reti;
}
sre();
}
else
{
if(a==0x02) //向主机发送数据的命令
{
if(tready==1)
{
SBUF=0x02; //发准备好接收状态字
}
else
{
SBUF=0x00; //发未准备好接收状态字
}
while(!TI);
TI=0;
str();
}
else
{
SBUF=0x08; //发送非法命令状态字
while(!TI);
TI=0;
SM2=1;
//ES=1; //恢复监听
}
}
reti: ;
}
//char code SST516[3]_at_ 0x003b;
void main()
{
inint();
P13=0;
delay(200000000);
while(1)
{
tready=1;
rready=1;
if(RI)
{
serial();
}
}
}
void sre(void) //接收数据块
{
uchar p,i;
rready=0;
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(!RI);
RI=0;
P1=SBUF;
rebuf[i]=SBUF;
p+=rebuf[i];
}
while(!RI);
RI=0;
if(SBUF==p) //校验相同,发FF
{
SBUF=0x00;
while(!TI);
TI=0;
break;
}
else
{
SBUF=0xff;
while(!TI);TI=0;
}
}
}
void str(void) //发送数据块
{
uchar p,i;
tready=0;
do
{
p=0;
for(i=0;i<BN;i++) //发送BN字节数据
{
SBUF=trbuf[i];
p+=trbuf[i];
while(!TI);
TI=0;
}
SBUF=p; //发送校验和
while(!TI);
TI=0;
while(!RI);
RI=0; //接收主机应答
}while(SBUF!=0); //主机接受不正确,重新发送
SM2=1;
//ES=1;
}
不知道是不是程序有问题,总是的不到我想要的数据,请版主和各位大侠看看,指导!
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
可支持14×4的点阵LED显示面板数码管LED驱
VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁 存
数显驱动器原厂-数显LED显示驱动芯片VK1620
VK1620B是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、 数据锁
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
产品品牌:永嘉微电/VINKA 产品型号:VK1618 封装形式:SOP18/DIP18 概述 VK161
更多
精华推荐
数显屏驱动原厂-VK1668 SOP24抗干扰数显LED
抗干扰LED数码管显示屏驱动芯片/3线串行接
抗干扰能力强/点阵数显LED屏驱动/数码管驱
可支持14×4的点阵LED显示面板数码管LED驱
数显驱动器原厂-数显LED显示驱动芯片VK1620
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
VK1616 SOP16/DIP16点阵LED数显驱动芯片/数
点阵数显驱动芯片/LED数码管显示屏驱动VK16
更多
社区学堂
抗干扰LED数码管显示屏驱动芯片/3线串
抗干扰能力强/点阵数显LED屏驱动/数码
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
可支持14×4的点阵LED显示面板数码管LED驱
VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁 存
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表