用51单片机模拟IIC通信

发布者:码梦小子最新更新时间:2017-01-21 来源: eefocus关键字:51单片机  模拟IIC通信 手机看文章 扫描二维码
随时随地手机看文章

在 之前的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通信 引用地址:用51单片机模拟IIC通信

上一篇:51单片机模拟I2C总线程序
下一篇:AT89S51中的内部看门狗程序实现

推荐阅读最新更新时间:2024-03-16 15:31

单片机串行口介绍,8051单片机通信方式
串行口是单片机与外界进行信息交换的工具,8051单片机的通信方式有两种: 并行通信:数据的各位同时发送或接收。 串行通信:数据一位一位次序发送或接收。 串行通信的方式 异步通信 用一个起始位0表示字符的开始,用停止位1表示字符的结束,中间夹着8个数据位,字符能一个接一个传送 CPU与外设之间必须有字符格式和波特率两项规定 字符格式规定能使双方把0和1串理解成同一种意义,原则上自由制定,通用角度使用标准如ASCII 波特率即数据传输速率,每秒传送的二进制位数,如120字符/s,每个字符10数位,则传送波特率为1200波特 同步通信 去掉了开始结束标志提高速度,但由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端
[单片机]
单片机串行口介绍,80<font color='red'>51单片机</font>的<font color='red'>通信</font>方式
C51单片机蜂鸣器祝你平安音乐
#include reg52.h unsigned char Count; sbit _Speak =P1^5 ; unsigned char code SONG ={ //祝你平安 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0
[单片机]
51单片机存储器扩展问题
一.51的存储器从功能上来说可以分为程序存储器和数据存储器,至于到底能扩展多少存储空间,要看你扩展的是哪一类存储器。 访问存储空间时,需要用到两个指针变量,为DPTR和PC。其中pc为程序计数器,指向下一条需要执行的指令的地址,DPTR为数据指针寄存器,这两个变量的长度都为16位,这是51单片机内部结构决定的,无法改变。所以这两个指针的寻址能力都为64K。这样看来,两类存储器的扩展能力都为64K 。但是,如果你实际扩展过存储器,你就可以发现程序存储器的扩展能力并没有64K!!! 这是为什么呢? 这得从51单片机的存储空间的编址说起。这里仅作简单说明,具体可以看教科书。简单地说,内部程序存储器和外部程序存储器是一起编址的
[单片机]
51单片机C和汇编指令对比
一、单一指令比较: 字节操作 加法指令 减法指令 乘法指令 除法指令 取模指令 位测试指令 _testbit_ (bit); 左移指令 Variable = Variable 1; 右移指令 Variable = Variable 1; 位取反指令 与运算指令 或运算指令 异或运算指令 子程序调用 RESULT=BYTESUB(ARG1, ARG2); CALL BYTESUB 判断指令 CJNE R1,#0F0H,LABEL1 DJNZ R1,LABEL1 查表指令 RESULT = NUM ; MOVC A,@A+DPTR 指针操作指令 POINT = & NUM;
[单片机]
51单片机矩阵键盘扫描和显示按下的次数
KEYCARD BIT 00H ;用于标志是否有键按下 KEYCOU EQU 5AH ;用于记录按下键的次数 ORG 0000H ;程序开始 AJMP START ORG 30H ;为避免占用中断向量区,主程序从30H开始 START: MOV SP,#5FH ;设置堆栈的初始地址 MOV P3,#0FH ;P3,P2,P0的初始化 MOV P2,#00H MOV P0,#0FFH CLR KEYCARD ;有按键标志清0 MOV KEYCOU,#0 ;计数初值赋0 LOOP: ;循环扫描键盘 ACALL KEY
[单片机]
基于51单片机的直流电机PWM调速控制系统
1 引言 1.1 课题背景 1.1.2 开发背景 在现代电子产品中,自动控制系统,电子仪器设备、家用电器、电子玩具等等方面,直流电机都得到了广泛的应用。大家熟悉的录音机、电唱机、录相机、电子计算机等,都不能缺少直流电机。所以直流电机的控制是一门很实用的技术。直流电机,大体上可分为四类:几相绕组的步进电机、永磁式换流器直流电机、伺服电机、 两相低电压交流电机 直流电机的特点是启动转矩大,最大转矩大,转速控制容易,调速后效率很高。与交流调速相比,直流电机结构复杂,生产成本高,维护工作量大。随着大功率晶体管的问世以及矢量控制技术的成熟,使得矢量控制变频技术获得迅猛发展,从而研制出各种类型、各种功率的变频调速装置,并在工业上得到广泛应
[单片机]
基于<font color='red'>51单片机</font>的直流电机PWM调速控制系统
51单片机控制的LED流水灯设计
  1.引言   当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。   2.硬件组成   按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系
[单片机]
用<font color='red'>51单片机</font>控制的LED流水灯设计
51单片机串口通讯UART
1、串行通信的的基本知识 在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交换均可称为通信。 通信的方式有两种,分别为串行通信和并行通信。我们通常根据实际信息传输的距离还决定采用哪种通信方式。 并行通信: 并行通信是指数据的各位同时进行传送(发送或者接收)的通信方式。其优点是传送速度快,缺点是数据有多少位,就需要有多少根传送线。 串行通信: 串行通信是指数据 一位一位的按顺序传送的通信,他的优点是传送线少(只需要一对传输线),特别适用于远距离的数据通信,缺点是传送速度低。 其通信的原理如下图所示 串行通信的数据传输方式: 分为3
[单片机]
<font color='red'>51单片机</font>串口通讯UART
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved