找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1296|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机I2C写数据到存储器再从存储器读到P1口,发光二极管一直显示同一个值不会改变

[复制链接]
跳转到指定楼层
楼主
ID:92973 发表于 2015-10-19 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit SDA=P2^0;
sbit SCL=P2^1;
void delay() //延时函数
{
_nop_();_nop_();
_nop_();_nop_();
}
void I2C_init() //初始化函数
{
SDA=1;
_nop_();
SCL=1;
_nop_();
}


void I2C_Start()// 启动函数
{
SDA=1;
_nop_();
SCL=1;
delay();
SDA=0;
delay();
}


void I2C_Stop() //停止函数
{
SDA=0;
_nop_();
SCL=1;
delay();
SDA=1;
delay();
}


void I2C_send_byte(uchar dat) //发送一字节
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
_nop_();
SDA=(bit)dat&0x80;
_nop_();
SCL=1;
_nop_();
dat<<=1;
}
SCL=0;
_nop_();
SDA=1;
_nop_();
}
uchar I2C_read_byte()//接收一字节
{
uchar dat,i;
for(i=0;i<8;i++)
{
dat<<=1;
SCL=1;
_nop_();
if(SDA) dat+=1;
SCL=0;
_nop_();
}
return dat;
}


bit Test_ACK() //从机应答检测
{
SCL=1;
delay();
if(SDA)
{
SCL=0;
I2C_Stop();
return 0;
}
else
{
SCL=0;
return 1;
}
}


void MASTER_ACK(uchar i) //主机应答
{
SCL=0;
_nop_();
if(i)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();
SCL=0;
_nop_();
SDA=1;
_nop_();
}


bit I2C_SEND(uchar dat)//发送函数
{
I2C_Start();
I2C_send_byte(0xa0);
if(!Test_ACK())return 0;
I2C_send_byte(255);
if(!Test_ACK())return 0;
I2C_send_byte(dat);
if(!Test_ACK())return 0;
I2C_Stop();
return 1;
}
uchar I2C_READ()//接收函数
{
uchar dat;
I2C_Start();
I2C_send_byte(0xa0);
if(!Test_ACK())return 0;
I2C_send_byte(255);
if(!Test_ACK())return 0;
I2C_Start();
I2C_send_byte(0xa0+1);
if(!Test_ACK())return 0;
dat=I2C_read_byte();
MASTER_ACK(0);
I2C_Stop();
return dat;
}


void main()
{
I2C_init();
I2C_SEND(0xff);
while(1)
{
P1=I2C_READ();
}
}






程序如上,感觉没什么问题,发送不同的十六进制但是P1口的发光二极管一直显示同一个值不会改变,求大婶看看
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:92973 发表于 2015-10-20 13:05 | 只看该作者
来个大婶看看是那里出错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表