专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PCF8563传数据给单片机出错....
2019-03-24 19:00
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
3871
2
1462
目前单片机向8563送数据正确,但是单片机读取8563的数据有错误,先是FF,改了程序后又变成00了.........不知道是哪里有问题...恳请大家帮忙分析一下....O(∩_∩)O谢谢 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
yixindianzi
1楼-- · 2019-03-25 01:38
加载中...
xxx564335
2楼-- · 2019-03-25 06:37
# include <reg52.h>
# include <intrins.h>
# define uchar unsigned char
#define XTAL 12000000 // CUP 晶振频率
#define baudrate 2400 // 通信波特率
sbit SDA=P1^7;
sbit SCL=P1^6;
sbit text=P0^1;
uchar min;
uchar hour;
uchar time_data;
uchar x;
uchar z;
uchar buff[3];
uchar b;
bit ack;
void _Nop(uchar i) /*定义空指令*/
{
uchar j;
for(j=0;j<i;j++);
}
void I2C_Start(void)
{
SDA=1;
_Nop(1);
SCL=1;
_Nop(5);
SDA=0;
_Nop(5);
SCL=0;
_Nop(2);
}
void I2C_Stop(void)
{
SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SDA=1;
_Nop(4);
}
void SendByte(uchar y)
{
uchar BitCnt;
for(BitCnt=0;BitCnt <8;BitCnt++)
{
uchar j;
if((y<<j)&BitCnt)
SDA=1;
else SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SCL=0;
}
_Nop(2);
SDA=1;
_Nop(2);
SCL=1;
_Nop(3);
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_Nop(2);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop(1);
SCL=0;
_Nop(4);
SCL=1;
_Nop(2);
retc=retc<<1;
if(SDA==1)retc=retc+1;
_Nop(2);
}
SCL=0;
_Nop(2);
return(retc);
}
void Ack_I2C(uchar a)
{
if(a==0)SDA=0;
else SDA=1;
_Nop(3);
SCL=1;
_Nop(5);
SCL=0;
_Nop(2);
}
void ISendByte(uchar sla,uchar suba,uchar c)
{
I2C_Start();
SendByte(sla);
_Nop(1);
SendByte(suba);
_Nop(1);
SendByte(c);
_Nop(1);
I2C_Stop();
}
uchar IRcvByte(uchar sla,uchar suba,uchar y)
{
I2C_Start();
SendByte(sla);
_Nop(10);
SendByte(suba);
_Nop(10);
I2C_Stop();
I2C_Start();
SendByte(sla+1);
_Nop(10);
for(b=0;b<y;b++)
{
buff
=RcvByte();
if (b!=y-1) Ack_I2C(0);
//z=RcvByte();
Ack_I2C(1);
I2C_Stop();
}
}
/****************************串口初始化****************************/
void init(void)
{
EA=1; // "中断总允许"
ES=1;
TMOD=0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
SCON=0x50; // 设定串行口工作方式(UART为模式1,8位数据,允许接收)
PCON=0x00; // 波特率不倍增
TR1=1; // 启动定时器1
}
void main()
{
text=0;
init();
ISendByte(0xa2,0x00,0x00);
ISendByte(0xa2,0x03,0x00);
//IsendByte(0xa2,0x04,0x06);
while(1)
{
min=IRcvByte(0xa2,0x03,0x03);
//hour=IRvByte(0xa2,0x04);
text=0;
SBUF=buff
;
while(!TI);// 等特数据传送
TI=0; // 清除数据传送标志
}
}
加载中...
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
# include <intrins.h>
# define uchar unsigned char
#define XTAL 12000000 // CUP 晶振频率
#define baudrate 2400 // 通信波特率
sbit SDA=P1^7;
sbit SCL=P1^6;
sbit text=P0^1;
uchar min;
uchar hour;
uchar time_data;
uchar x;
uchar z;
uchar buff[3];
uchar b;
bit ack;
void _Nop(uchar i) /*定义空指令*/
{
uchar j;
for(j=0;j<i;j++);
}
void I2C_Start(void)
{
SDA=1;
_Nop(1);
SCL=1;
_Nop(5);
SDA=0;
_Nop(5);
SCL=0;
_Nop(2);
}
void I2C_Stop(void)
{
SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SDA=1;
_Nop(4);
}
void SendByte(uchar y)
{
uchar BitCnt;
for(BitCnt=0;BitCnt <8;BitCnt++)
{
uchar j;
if((y<<j)&BitCnt)
SDA=1;
else SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SCL=0;
}
_Nop(2);
SDA=1;
_Nop(2);
SCL=1;
_Nop(3);
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_Nop(2);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop(1);
SCL=0;
_Nop(4);
SCL=1;
_Nop(2);
retc=retc<<1;
if(SDA==1)retc=retc+1;
_Nop(2);
}
SCL=0;
_Nop(2);
return(retc);
}
void Ack_I2C(uchar a)
{
if(a==0)SDA=0;
else SDA=1;
_Nop(3);
SCL=1;
_Nop(5);
SCL=0;
_Nop(2);
}
void ISendByte(uchar sla,uchar suba,uchar c)
{
I2C_Start();
SendByte(sla);
_Nop(1);
SendByte(suba);
_Nop(1);
SendByte(c);
_Nop(1);
I2C_Stop();
}
uchar IRcvByte(uchar sla,uchar suba,uchar y)
{
I2C_Start();
SendByte(sla);
_Nop(10);
SendByte(suba);
_Nop(10);
I2C_Stop();
I2C_Start();
SendByte(sla+1);
_Nop(10);
for(b=0;b<y;b++)
{
buff=RcvByte();
if (b!=y-1) Ack_I2C(0);
//z=RcvByte();
Ack_I2C(1);
I2C_Stop();
}
}
/****************************串口初始化****************************/
void init(void)
{
EA=1; // "中断总允许"
ES=1;
TMOD=0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
SCON=0x50; // 设定串行口工作方式(UART为模式1,8位数据,允许接收)
PCON=0x00; // 波特率不倍增
TR1=1; // 启动定时器1
}
void main()
{
text=0;
init();
ISendByte(0xa2,0x00,0x00);
ISendByte(0xa2,0x03,0x00);
//IsendByte(0xa2,0x04,0x06);
while(1)
{
min=IRcvByte(0xa2,0x03,0x03);
//hour=IRvByte(0xa2,0x04);
text=0;
SBUF=buff;
while(!TI);// 等特数据传送
TI=0; // 清除数据传送标志
}
}
一周热门 更多>