51单片机模拟实现IIC通信

  • IIC.h
  • IIC.c
  • main.c
  • 总结

IIC.h

#ifndef _iic_h_
#define _iic_h_
#include <reg52.h>
#include <intrins.h>
sbit SDA=P2^0;
sbit SCL=P2^1;void IICstart();
void IICstop();
unsigned char  IICWriteByte(unsigned char dat);
unsigned char IICReadbyte();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char  At24c02Read(unsigned char addr);
#endif

IIC.c

#include "IIC.h"
void Delay10us()
{unsigned char i;_nop_();_nop_();i = 27;while (--i);
}void IICstart(){SDA=1;Delay10us();SCL=1;Delay10us();SDA=0;Delay10us();SCL=0;Delay10us();
}void IICstop(){// SCL=0;// Delay10us();//SCL不需要置为0,因为结束时已经设置为0SDA=0;Delay10us();SCL=1;Delay10us();SDA=1;Delay10us();
}unsigned char IICSendByte(unsigned char dat){unsigned char a=0;unsigned char i;for ( i = 0; i < 8; i++){// SDA=1;// Delay10us();不需要// SCL=1;// Delay10us();SDA=dat>>7;//dat右移,SDA读取dat<<=1;//依次移位Delay10us();//加延时SCL=1;//开始为0Delay10us();SCL=0;//这里循环与SDA只负责接收数据Delay10us();}SDA=1;//主机SDA拉高,等待应答Delay10us();SCL=1;//SCL拉高,读取应答信号,先拉高SDA以防判为终止信号while(SDA){//SDA为1说明非应答a++;//先++if(a>200){//再判断,200us没应答,发送失败SCL=0;//按照时序图SCL拉低Delay10us();//加延时return 0;}}//否则ADC=0;说明应答SCL=0;//根据时序拉低SCLDelay10us();//加延时return 1;
}
unsigned char IICReadByte(){//不需要参数,读SDA的数据到局部变量numunsigned char i;unsigned char num=0;//必须初始化为0;SDA=1;//根据时序图,从机读数据,置为1Delay10us();for ( i = 0; i < 8; i++){SCL=1;//先拉高SCLDelay10us();//延时num=num<<1;//dat开始为0,在循环内,先移位1位num=num|SDA;//或运算,从SDA最低位读取数据Delay10us();//加延时SCL=0;//SCL置为0低电平Delay10us();//10us延时}return num;//返回num的值
}
void  At24c02Writer(unsigned char addr,unsigned char dat){//单纯写数据到EEROM,无返回类型,参数为地址及写的内容IICstart();IICSendByte(0xa0);//EEROM需要先知道是写操作还是读操作IICSendByte(addr);//地址IICSendByte(dat);//数据IICstop();
}
unsigned char At24c02Read(unsigned char addr){//读数据只需要知道地址,返回读到的数据unsigned char dat;IICstart();//读数据比较特殊,需要先发送写地址,让他知道是哪个地址,再进行读数据IICSendByte(0xa0);//0xa0为EEMOR写IICSendByte(addr);IICstart();//这里不需要终止信号,但是必须重新写一个开始信号,来确定下一步的读取信号IICSendByte(0xa1);//0xa1为EEMOR读dat=IICReadByte();IICstop();//不能忘了终止信号return dat;
}

main.c

/*主函数实现实验要求:按独立按键K1记录当前数据,K2读取记录的数据,K3从0开始每按一下数据加1,K4数据清零*/
#include "IIC.h"
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
char num=0;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 dis[4];
void delay(u16 i){while (i--);
}
void keyprocess(){if(k1==0){delay(1000);if (k1==0){At24c02Writer(1,num);}while(!k1);}if(k2==0){delay(1000);if (k2==0){num=At24c02Read(1);//必须要将读到的数值赋予num,否则读到了也显示不出来}while(!k2);}if(k3==0){delay(1000);if (k3==0){num++;if(num>225){num=0;}}while(!k3);}if(k4==0){delay(1000);if (k4==0){num=0;}while(!k4);}
}void dataprocess(){//数据处理dis[0]=smgduan[num/1000];//千位,直接除以1000便得到千位dis[1]=smgduan[num%1000/100];//百位dis[2]=smgduan[num%1000%100/10];//十位dis[3]=smgduan[num%1000%100%10];//个位
}void display(){u8 i;for ( i = 0; i<4; i++){switch (i){case (0):LSA=1;LSB=1;LSC=0;break;case (1):LSA=0;LSB=1;LSC=0;break;case (2):LSA=1;LSB=0;LSC=0;break;case (3):LSA=0;LSB=0;LSC=0;break;}P0=dis[i];delay(100);P0=0x00;}
}void main(){while(1){keyprocess();dataprocess();display();}
}

总结

这是自己对照时序图写的代码,单片机开发板中有一块EEROM芯片(AT24C02),通过IIC协议完成通信。
包含的知识点:
IIC协议、AT23C02芯片通讯原理、动态数码管(74HC138译码器)、独立按键等。

51单片机开发板模拟实现IIC通信相关推荐

  1. linux gadget 模拟鼠标,HID设备--开发板模拟鼠标

    HID HID 鼠标裸数据 驱动:1 2 3 4 5 6 7Symbol: HIDRAW [=y] Type : boolean Prompt: /dev/hidraw raw HID device ...

  2. 51单片机开发系列一-51单片机开发环境搭建以及入门汇编代码

    51单片机开发系列一 51单片机开发环境搭建以及入门汇编代码 象棋小子    1048272975 1. 51单片机概述 51单片机是对所有兼容Intel 8031指令系统的单片机的统称.目前教科书基 ...

  3. 巫妖王51单片机开发板配套视频课程-朱有鹏-专题视频课程

    巫妖王51单片机开发板配套视频课程-8368人已学习 课程介绍         本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机.配合巫妖王51单片机开发 ...

  4. 使用51单片机采用中断方式进行串口通信的学习记录:

    使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...

  5. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  6. 在linux下也能进行51单片机开发吗?送你一份教程。

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 阅读文本大概需要 5 分钟. 0 写在前面 在liunx环境下,没有keil这种ID ...

  7. c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

    1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...

  8. 开发实践丨用小熊派STM32开发板模拟自动售货机

    摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...

  9. 51单片机支持python么_macOS搭建51单片机开发环境

    1.概述 鉴于好多朋友平常工作电脑为苹果,再配一台 Windows 机器来开发 51 单片机,略显多余.为此,本文详细讲解在 macOS 搭建 51 单片机开发环境. 软硬件需求:macOS 笔记本或 ...

最新文章

  1. Yii2掉index.php?r=
  2. Oracle 检索数据
  3. 【Spring MVC】自定义拦截器 Interceptor
  4. Week1 Team Homework #2 Introduction of team member with photos
  5. [SpringSecurity]web权限方案_自动登陆_原理分析和具体实现
  6. Manacher's Algorithm 马拉车算法(最长回文串)
  7. IE浏览器怎么在桌面隐藏图标
  8. 高低层特征融合【转载】
  9. jQuery链式操作[转]
  10. annotatedClasses和component-scan冲突吗
  11. excel保存快捷键_电脑技巧篇之快捷键
  12. IntelliJ IDEA For Mac 的破解方法
  13. drools规则引擎使用文档
  14. 前端代码规范【结合实际和官方】
  15. linux配置文件读写权限,Linux 服务器如何设置文件和文件夹的读写权限
  16. hbase的master启动失败 master running as process 9400. Stop it first.
  17. 当贝X3 Pro与极米H5哪个画质好,哪一款更值得购买?
  18. 可怜的码农们该如何赚钱?
  19. 计算机与昆虫关系的论文,浅谈昆虫与人类的关系.doc
  20. 批处理文件*.bat打开后闪退的处理方法

热门文章

  1. Insets动画 - 安卓R
  2. 安装redis及redis集群及解决连接不上redist问题
  3. Splashtop 与 Acronis 集成,提供可扩展的远程支持
  4. Semiconductor 技术 - DeckBulid 基本代码笔记
  5. 《芯片介绍系列》之MT7628芯片详细介绍(MT7628平台处理器)
  6. 托管IDC 机房的的几点优势
  7. 实战丨Halo-轻松部署属于自己的博客系统
  8. 麦肯锡称三年内将会发生金融AI大变革
  9. 图像滤镜艺术---最新美颜算法研究
  10. Checkmarx CxEnterprise企业版静态源代码扫描管理方案