3097|4

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

24c02 程序只运行成功过一次,不知错在哪里,请高人指教,谢谢! [复制链接]

#include
#include
#include

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);

}               
}


最新回复

原理图很关键哦  详情 回复 发表于 2010-4-26 00:06
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(0x00);
  iic_wait_ack();
  iic_start();   // 这之前stop一下试试,当然这个不是必须的。
  iic_send_byte(0xa1);
  iic_wait_ack();
  j=iic_receive_byte();
  iic_stop();
  P2=j;
  while(1);



程序看起来没什么问题
不过不知道楼主使用芯片是否需要将scl/sda配置成open-drain模式。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 zyzhang365 的回复:


还有就是外部需要上来。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
   mark ,有时间看看。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
原理图很关键哦
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表