×
单片机 > 单片机程序设计 > 详情

用51单片机模拟IIC通信

发布时间:2020-05-28 发布时间:
|

在 之前的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--);
}


关键字:51单片机  模拟IIC通信

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM硬件设计四 - EBI总线