没仔细看你写的,参考一下我这个。前几天刚调试的,调试可以。 你对照看一下,分析你那为何不可以。
/*********************************************
实验:IO口模拟IIC,EEPROM之AT24C02,往24C02
地址5、6处写入不同数据,读出写入数据,
以LED显示读回数据。
其他说明见头文件24C02new.h或24C02.h
编写:风的世界
时间:2013-10-30
*********************************************/
#include
#define uchar unsigned char
#define uint unsigned int
#include"24C02new.h"
void delayms(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;//关看门狗定时器
uchar num1,num2;
P1SEL = 0x00;
P1DIR = 0xff;
P2SEL &= ~(BIT0+BIT1);//P2.0 P2.1设置为普通IO口
Byte_Write(5,0x55);
delayms(10);
Byte_Write(6,0xAA);
delayms(10);
num1=Random_Read(5);
num2=Random_Read(6);
while(1)
{
P1OUT = num1;
delayms(800);
P1OUT = num2;
delayms(800);
}
}
/************IIC24C02初始化***************
========头文件:24C02.h================
说明:写操作、读操作仅仅是适用于24C02
其他IIC芯片需另行编写。
适用于430单片机
分析:以P2.0控制SDA,P2.1控制SCL方式编写
欲改用其他IO控制,程序要修改处较多。
采用宏定义端口方式灵活性较好。
连线:P2.0~SDA
P2.1~SCL
编写:风的世界
时间:2013-10-30
************************************/
void delay()
{
;;
}
/*=============总线初始化==============*/
void init()
{
P2DIR |= BIT0+BIT1;//P2.0 P2.1端口方向设置为输出
P2OUT |= BIT1; //SCL=1,时钟线置高
delay();
P2OUT |= BIT0;//SDA=1,数据线置高
delay();
}
/*==============启动信号===========*/
void start()
{
P2OUT |= BIT1; //SCL=1
P2OUT |= BIT0; //SDA=1
delay();//延时时间要大于4.7us
P2OUT &= ~BIT0; //SDA=0
delay();//延时时间应大于4us
P2OUT &= ~BIT1; //SCL=0
}
/*============终止信号==========*/
void stop()
{
P2OUT |= BIT1; //SCL=1
P2OUT &= ~BIT0; //SDA=0
delay();//延时时间应大于4us
P2OUT |= BIT0; //SDA=1
delay();//延时时间应大于4.7us
}
/*============应答信号=============*/
void Ask()
{
P2OUT &= ~BIT0; //SDA=0
delay();
P2OUT |= BIT1; //SCL=1
delay();//延时时间应大于4us
P2OUT &= ~BIT1; //SCL=0
delay();
}
/*=============非应答信号============*/
void NoAsk()
{
P2OUT |= BIT0; //SDA=1
delay();
P2OUT |= BIT1; //SCL=1
delay();//应大于4us
P2OUT &= ~BIT1; //SCL=0
delay();
}
/*==========写一个字节=================*/
void write_byte(uchar Data)
{
uchar i;//i用以计算发送的位数
for(i=0;i<8;i++)
{
P2OUT &= ~BIT1; //SCL=0,SCL为低时,允许数据变化
delay();
if((Data<
P2OUT |= BIT0;//送1位数据
else
P2OUT &= ~BIT0;
delay();
P2OUT |= BIT1; //SCL=1,SCL为1时,要求数据稳定,将数据写入内存
delay();
}
P2OUT &= ~BIT1; //SCL=0
delay();
P2OUT |= BIT0; //SDA=1,释放数据线
delay();
}
/*=========读取一个字节=========
在每次SCL由0变1时,读取一位,
读8位,一字节
==============================*/
uchar read_byte()
{
uchar i,temp;
P2OUT &= ~BIT1; //SCL=0
delay();
P2OUT |= BIT0; //SDA=1
delay();
P2DIR &= ~BIT0;//SDA端口方向改为输入,因为此后要读入数据
for(i=0;i<8;i++)
{
P2OUT |= BIT1; //SCL=1
delay();
temp<<=1;
if(P2IN&BIT0)
temp|=0x01;//获取P2.0口读回的数
P2OUT &= ~BIT1; //SCL=0
delay();
}
delay();
P2DIR |= BIT0; //读完1Byte数据,SDA口方向设置为输出
return temp;
}
/********写操作*********/
void Byte_Write(uchar address,uchar Data)
{
P2DIR |= BIT0+BIT1;//P2.0 P2.1端口方向设置为输出
start();//启动IIC
write_byte(0xa0);//写器件地址,实验板上器件高4位为1010,低3位接了地,最地位为R/W,现在是写,最低位也为0
Ask();
write_byte(address);//写数据地址,即欲将该数据存放于何处,address在0~255取值
Ask();
write_byte(Data);
Ask();
stop();
}
/********读操作***********************
说明:随机读取,程序分析参见操作时序
*************************************/
uchar Random_Read(uchar address)
{
P2DIR |= BIT0+BIT1;//P2.0 P2.1端口方向设置为输出
uchar Data;
start();
write_byte(0xa0);//写器件地址,写,最低位为0
Ask();
write_byte(address);//广播数据存放的地方
Ask(); //得到应答后开始读数据
start();
write_byte(0xa1);//器件地址最低位为read,为1,表明此时24C02将发送数据,MCU接收数据
Ask();
Data=read_byte();//读取数据赋给Data
NoAsk();
stop();
return Data;
} |