51单片机开发板模拟实现IIC通信
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通信相关推荐
- linux gadget 模拟鼠标,HID设备--开发板模拟鼠标
HID HID 鼠标裸数据 驱动:1 2 3 4 5 6 7Symbol: HIDRAW [=y] Type : boolean Prompt: /dev/hidraw raw HID device ...
- 51单片机开发系列一-51单片机开发环境搭建以及入门汇编代码
51单片机开发系列一 51单片机开发环境搭建以及入门汇编代码 象棋小子 1048272975 1. 51单片机概述 51单片机是对所有兼容Intel 8031指令系统的单片机的统称.目前教科书基 ...
- 巫妖王51单片机开发板配套视频课程-朱有鹏-专题视频课程
巫妖王51单片机开发板配套视频课程-8368人已学习 课程介绍 本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机.配合巫妖王51单片机开发 ...
- 使用51单片机采用中断方式进行串口通信的学习记录:
使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...
- hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下
1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...
- 在linux下也能进行51单片机开发吗?送你一份教程。
点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 阅读文本大概需要 5 分钟. 0 写在前面 在liunx环境下,没有keil这种ID ...
- c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计
1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...
- 开发实践丨用小熊派STM32开发板模拟自动售货机
摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...
- 51单片机支持python么_macOS搭建51单片机开发环境
1.概述 鉴于好多朋友平常工作电脑为苹果,再配一台 Windows 机器来开发 51 单片机,略显多余.为此,本文详细讲解在 macOS 搭建 51 单片机开发环境. 软硬件需求:macOS 笔记本或 ...
最新文章
- Yii2掉index.php?r=
- Oracle 检索数据
- 【Spring MVC】自定义拦截器 Interceptor
- Week1 Team Homework #2 Introduction of team member with photos
- [SpringSecurity]web权限方案_自动登陆_原理分析和具体实现
- Manacher's Algorithm 马拉车算法(最长回文串)
- IE浏览器怎么在桌面隐藏图标
- 高低层特征融合【转载】
- jQuery链式操作[转]
- annotatedClasses和component-scan冲突吗
- excel保存快捷键_电脑技巧篇之快捷键
- IntelliJ IDEA For Mac 的破解方法
- drools规则引擎使用文档
- 前端代码规范【结合实际和官方】
- linux配置文件读写权限,Linux 服务器如何设置文件和文件夹的读写权限
- hbase的master启动失败 master running as process 9400. Stop it first.
- 当贝X3 Pro与极米H5哪个画质好,哪一款更值得购买?
- 可怜的码农们该如何赚钱?
- 计算机与昆虫关系的论文,浅谈昆虫与人类的关系.doc
- 批处理文件*.bat打开后闪退的处理方法