当前位置: 代码迷 >> 单片机 >> 24c02 程序只运行成功过一次,不知错在哪里,请高人指教,多谢
  详细解决方案

24c02 程序只运行成功过一次,不知错在哪里,请高人指教,多谢

热度:215   发布时间:2016-04-28 16:28:40.0
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){