这是一个单片机I2C的程序,麻烦高手帮忙指点下;为什么有时显示不行呢,虽然概率很低,要隔很长
来源:百度知道 编辑:UC知道 时间:2024/06/08 16:56:00
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0; //定义数据总线;
sbit scl=P2^1; //定义时钟总线;
void delay()
{ ;; } //延迟5毫秒左右;
void start() //启动
{
sda=1;
delay();
scl=1; //在时钟信号为高时,数据总线一个低电位,启动;
delay();
sda=0;
delay();
}
void stop()
{ //停止信号在时钟信号为高时,数据总线一个高跳变;
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void write_byte(uchar date) //写数据;
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //一位一位的写,每写一个字都是在一个时钟信号里,
scl=0;
delay(); //只有时钟为低时,才能进行数据的写;
sda=CY; //变量的高位溢出时,自动存入CY中;
delay();
scl=1;
delay();
}
scl=0; //要想改变SDA的电平,就必须先把SCL拉低;
delay();
sda=1;
delay();
}
void respons() //应答;
{
uchar i=0;
scl=1;
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0; //定义数据总线;
sbit scl=P2^1; //定义时钟总线;
void delay()
{ ;; } //延迟5毫秒左右;
void start() //启动
{
sda=1;
delay();
scl=1; //在时钟信号为高时,数据总线一个低电位,启动;
delay();
sda=0;
delay();
}
void stop()
{ //停止信号在时钟信号为高时,数据总线一个高跳变;
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void write_byte(uchar date) //写数据;
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //一位一位的写,每写一个字都是在一个时钟信号里,
scl=0;
delay(); //只有时钟为低时,才能进行数据的写;
sda=CY; //变量的高位溢出时,自动存入CY中;
delay();
scl=1;
delay();
}
scl=0; //要想改变SDA的电平,就必须先把SCL拉低;
delay();
sda=1;
delay();
}
void respons() //应答;
{
uchar i=0;
scl=1;
1、可能延时时间不够,器件读写速度慢,跟不上。
void delay()
{ ;; } //延迟5毫秒左右;
你用多少的晶振?12M的晶振标准51核,只能延时2个微秒。
2、write_byte(0xaa);
respons();
像这种写入数据的操作需要时间比较长,你的等待时间可能不够。查看你器件的datasheet,看它的写入时间需要多久。
3、拿示波器看一下你IIC总线的波形的上升时间和下降时间能不能满足IIC规范的要求。
4、嵌入式系统从稳定性考虑,最好对每个函数的操作成功与否进行判断,系统要对错误的情况进行处理。比如楼主的respons();函数,比较好的一种处理方式是:如果等待超时,那么返回错误码,由上层函数决定如何处理错误。重发or放弃,等等。 楼主刚刚开始学习不必要深究,可以思考下这方面的问题。
搜索关键字:“IIC源码 开发包” 就能找到标准的IIC驱动程序
因为它是已经成熟且经过几次升级改版的代码,再自己去写就有点多余了...
void delay()
{ ;; } //延迟5毫秒左右;
这个延时太短了
void write_byte(uchar date) //写数据;
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
scl=0;
delay(); //
sda=CY; //这里不对,应该改下
delay();
scl=1;
delay();
temp=temp<<1;
}
sda=(bit)(temp&0x80);