单片机
返回首页

用51单片机模拟IIC通信

2017-01-21 来源:eefocus

在 之前的MCS-51系列单片机中内部没有IIC通信资源,所如果要想用51单片机实现IIC通信,就只能通过软件模拟其时序,这样也能实现IIC通信的功 能。如下程序是我用Protues仿真IIC通信的结果,希望对大家有用,非常希望有共同爱好的朋友,多给我提出些宝贵的意见,至诚感谢!

这个是IIC的头文件,便于使用调用:

#ifndef _IIC_H_
#define _IIC_H_

/***ucahr和uint 的宏定义很重要,否则下面的函数无法正常运行******/

#define uchar unsigned char   //定义uchar型数据为无符号型
#define uint unsigned int     //定义uint型数据为无符号型

sbit SCL = P2^3;
sbit SDA = P2^4;

/***申明外部函数****/
extern void delay_1ms(void);
extern void IIC_Init(void);   //IIC初始化
extern void Signal_Start(void);  //IIC停止信号
extern void Signal_Stop(void);   //IIC停止信号
extern void Write_Byte(uchar wdata);//写一个字节数据函数
extern uchar Read_Byte();//读一个字节数据函数
extern void Write_Add(uchar add,uchar wdata,uchar comd);//向某个IIC器件写指令,地址和数据
extern uchar Read_Add(uchar add,uchar comd);//向某个IIC器件写指令读某个地址里面的数据

#endif

以下是IIC通信的C语言源代码:

#include
#include
#include'IIC.h'

#define  uchar unsigned  char 
#define  uint  unsigned  int

void IIC_Init(void)//IIC初始化
{
 SDA = 1;
 delay_1ms();
 SCL = 1;
 delay_1ms();
}
void Signal_Start(void)//IIC起始信号
{
 SDA = 1;
 delay_1ms();
 SCL = 1;
 delay_1ms();
 SDA = 0;
 delay_1ms(); 
}
void Signal_Stop(void)//IIC停止信号
{
 SDA = 0;
 delay_1ms();
 SCL = 1;
 delay_1ms();
 SDA = 1;
 delay_1ms(); 
}

void Respons(void)//答应信号
{
 uint i = 0;
 SCL = 1;
 delay_1ms();
 while((SDA == 1)&&(i<=300))
 i++;
 SCL = 0;
 delay_1ms();
}

void Write_Byte(uchar wdata)
{
 uchar i,mdata;
 mdata = wdata;

 for(i=0;i<8;i++)
 {
  mdata <<= 1;
  SCL = 0;
  delay_1ms();
  SDA = CY;
  delay_1ms();
  SCL = 1;
  delay_1ms();  
 }
 SCL = 0;
 delay_1ms();
 SCL = 1;
 delay_1ms();
}

uchar Read_Byte()
{
 uchar i,rdata = 0;
 SCL = 0;
 delay_1ms();
 SCL = 1;
 for(i=0;i<8;i++)
 {
  SCL = 1;
  delay_1ms();
  rdata = (rdata<<1)|SDA;
  SCL = 0;
  delay_1ms();
 }
 return rdata;
}

void Write_Add(uchar add,uchar wdata,uchar comd)
{
 Signal_Start();//产生一个起始信号
 Write_Byte(comd);
 Respons();  //等待答应
 Write_Byte(add);
 Respons();  //等待答应
 Write_Byte(wdata);
 Respons();  //等待答应
 Signal_Stop();//产生一个终止信号
}

uchar Read_Add(uchar add,uchar comd)
{
 uchar tdata;
 Signal_Start();   //产生一个起始信号
 Write_Byte(comd);
 Respons();     //等待答应
 Write_Byte(add);
 Respons();    //等待答应
 Signal_Start();   //再产生一个起始信号
 Write_Byte(comd|0x01);
 Respons();     //等待答应
 tdata = Read_Byte();
 Signal_Stop();   //产生一个终止信号
 return tdata;       
}
void delay_1ms(void)   //误差 0us  延时1ms
{
    uchar a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 光控电路设计与分析

  • 永不缺相启动运行的电动机控制电路

  • CCFL的工作原理及电子驱动电路解析

  • MT3608构成3.7V转12V的升压电路图

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章