24c02 程序只运行成功过一次,不知错在哪里,请高人指教,谢谢!
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDA = P1^0; /* iic数据传送位 */
sbit SCL = P1^1; /* iic时钟控制位 */
sbit P1_4 = P1^4;
sbit P1_3 = P1^3;
sbit P1_5 = P1^5;
/* 函数声明 */
void iic_wait(void); /* iic延时 */
void iic_start(void); /* 开启iic总线 */
void iic_stop(void); /* 关闭iic总线 */
void iic_ack(void); /* 发送ACK信号 */
void iic_no_ack(void); /* 发送NOACK信号 */
bit iic_wait_ack(void); /* 等待ACK信号 */
void iic_send_byte(uchar demand); /* MCU向iic设备发送一个字节 */
uchar iic_receive_byte(void); /* MCU从iic设备接收一个字节 */
/* 声明结束 */
void delay_1s(void)
{
uchar i;
uchar j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
/* iic延时 */
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 开启iic总线 */
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
/* 关闭iic总线 */
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
/* 发送ACK信号 */
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/* 发送NOACK信号 */
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack
功 能:等待ACK信号
说 明:
入口参数:
返 回 值:1-ACK 0-ERROR
设 计:蓝海微芯
***********************************************************************/
bit iic_wait_ack(void)
{
uchar errtime=255;
//uint errtime = 1000;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA)
{
errtime--;
if(!errtime)
return 0;
}
SCL=0;
return 1;
}
/********************************************************************
函 数 名:iic_send_byte
功 能:MCU向iic设备发送一个字节
说 明:
入口参数:sbyte 待发送的字节数据
返 回 值:
设 计:蓝海微芯
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i = 8;
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte
功 能:MCU从iic设备接收一个字节
说 明:
入口参数:
返 回 值:ddata 接收数据
设 计:蓝海微芯
***********************************************************************/
uchar iic_receive_byte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/**********************主程序**********************/
main()
{
while(1){
uint i;
uchar j;
P1_4=1;
P1_4=0;
P1_5=1;
P1_3=1;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(0x00);
iic_wait_ack();
iic_send_byte(0xcc);
iic_wait_ack();
iic_stop();
for(i=100;i>0;i--);
for(i=100;i>0;i--);
for(i=100;i>0;i--);
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(0x00);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
j=iic_receive_byte();
iic_stop();
P2=j;
while(1);
}
}
[解决办法]