单片机的I/O口模拟I2C数据总线传输方式

发布者:chenxiaohong68最新更新时间:2016-09-26 来源: eefocus关键字:单片机  I  O口  模拟I2C  数据总线  传输方式 手机看文章 扫描二维码
随时随地手机看文章
需要做的工作小结如下:

1、MCU的I2C采用IO口模拟实现;

2、MCU作为I2C主设备与定时芯片RX-8025SA建立通信;

3、实现定时闹钟、定时唤醒及睡眠的功能;

调试过程:

1、IO口模拟I2C的代码在网上是可以找得到的。但是在具体的项目中,由于时钟的的不同在时序的控制上有区别,需要再调试。

在具体项目中调试I2C时,需要注意一下几点:

1)I 2C设备的地址,有的描述方法是7位,有的描述方法是8位。

注意只要代码和实际的设备地址相一致就好的。关于7位地址的使用方法无非描述的是8位地址的高7位,因为最后一位是固定的。(读的时候是1,写的时候是0)。

2)I2C通信协议本身并没有规定在通信过程中,传输的字节数。但是,有的设备可能只允许传输1个字节,或者两个字节,或者固定位数以内的字节。具体的规则要看从设备的规格书。

3)有的I2C设备只能写,不能读,这点也需要注意。

4)2C从设备的通信速率,即数据传输速度,不同设备之间会有所不同,所以,要考虑兼容性的问题。

5)有的设备可能是10位地址,写地址的时候,需要送两次设备地址。

6)设备的程序编写尽量规范。总线要释放的时候,最好把I/O设置为输入口。有的程序编写的做法是,释放总线即把I/O设置为高,这样不好。

7)时序的控制上,要符合设备的规格书的要求:

应用MCU的IO口模拟I2C通信实现定时功能 - 阿 朗 - 柠檬红了

手头有示波器的话,这里介绍一个比较适用且效率较高的调试方法。用示波器两路的探头直接接到I2C的数据线SDA和时钟线SCL上,上电后获取两路波形,再根据I2C通信协议读取通信数据,这样就可以看出是哪里的时序出的问题。

2、I2C通信OK就需要根据RX-8025SA的规格书来实现项目所需要的定时功能啦。

以实现闹钟功能为例说明:(请查看RX-8025SA的规格书)

1、8025芯片中有一个警报D功能:

警报D 功能指可从/INTA 引脚获得对[时+分]中断信号的功能。

即当当前时间(星期+时+分)与Alarm_D 设定时间一致时,/INTA 置L,

DALE 位置1。

2、将该/INTA连到MCU的RA5引脚上,MCU通过判断RA5引脚的L or H,

以及当前设备是否处于关机状态,当同时满足 RA5 = L 且 开机状态时,

MCU通知设备,设备再根据相关设置判断是否出闹钟提示。

3、设定警报D时间的方法如下:

1)将本DALE bit 设置为0 使Alarm_D 无效;

注:这是为了避免警报设定中现行时刻与警报时刻恰巧一致时,输出/INTA=L。

2)其次设定星期时分DAFG bit;

3)最后将DALE 设定为1 使警报D 功能有效;

4、开机初始化:将DAFG和WAFG 置0; 使警报W/警报D在开机瞬间当次无效。

3、附上模拟I2C通信的代码(网上搜索一下):

void IIC_str ( void )

{

IIC_SCL=0;

IIC_SDA=1;

_nop_();

_nop_();

IIC_SCL=1;

nops();

IIC_SDA=0; // 开始

nops();

IIC_SCL=0;

return;

}

void IIC_stop ( void )

{

IIC_SCL=0;

IIC_SDA=0;

_nop_();

_nop_();

IIC_SCL=1;

nops();

IIC_SDA=1; // 结束

nops();

return;

}

void IIC_ack ( bit ack )

{

IIC_SCL=0;

_nop_();

_nop_();

if ( ack )

IIC_SDA=0; //应答

else

IIC_SDA=1; //非应答

nops();

IIC_SCL=1;

nops();

IIC_SCL=0;

}

bit IIC_send_byte ( uchar c )

{

uchar outtime;

uchar bitnum;

outtime=0;

for ( bitnum=0; bitnum<8; bitnum++ )

{

IIC_SCL=0;

if ( ( c<// 发送一个字接

IIC_SDA=1;

else

IIC_SDA=0;

_nop_();

IIC_SCL=1;

nops();

nops();

IIC_SCL=0;

}

IIC_SDA=0;

IIC_SDA=1; // 准备接收应答信号

_nop_(); _nop_(); _nop_(); _nop_();

IIC_SCL=1; // 开始接受应答信号

while ( IIC_SDA ) // 超时判断

{

if ( ( outtime++ )>250 ) // 不能接收到应答信号,停止IIC通讯,返回0值报错

{

outtime=0;

IIC_stop();

return ( 0 ) ;

}

}

outtime=0;

IIC_SCL=0;

return ( 1 ); // 发送完毕,返回1值,通讯成功

}

uchar IIC_read_byte ( bit ack )

{

uchar retc;

uchar bitnum;

retc=0; //接收存储清0

IIC_SCL=0;

nops();

IIC_SDA=1;

for ( bitnum=0; bitnum<8; bitnum++ )

{

_nop_();

IIC_SCL=0;

IIC_SDA=1; //准备接受

nops();

IIC_SCL=1; //接收

nops();

retc<<=1;

if ( IIC_SDA ) //接收数据位判断

retc+=1;

}

IIC_SCL=0;

_nop_();

_nop_();

_nop_();

IIC_SDA=1;

IIC_ack( ack ); //应答信号

return retc;

}

void IIC_send_noadder ( uchar adder, uchar ddata )

{

bit ack;

IIC_str ();

ack=IIC_send_byte ( adder ); //发送地址

if ( !ack )

alarm=0;

return ; }

nops();

ack=IIC_send_byte ( ddata ); //发送数据

if ( !ack )

{ alarm=0;

return ; }

IIC_stop ();

return ;

}

void IIC_read_noadder ( uchar adder, uchar *buf, uchar num )

{

bit ack;

uchar i;

IIC_str ();

ack=IIC_send_byte ( adder ); //发送地址

if ( !ack )

{ alarm=0;

return ; }

nops();

for ( i=0; i

{

*( buf++ )=IIC_read_byte ( 1 ); //接收数据 存储倒*buf

}

IIC_stop ();

return ;

}

void IIC_send_adder ( uchar adder , uchar sub , uchar ddata )

{

bit ack;

IIC_str();

ack=IIC_send_byte ( adder ); //发送从机地址

if ( !ack )

{

alarm=0;

return ; }

ack=IIC_send_byte ( sub ); //发送从机子地址

if ( !ack )

{ alarm=0;

return ; }

ack=IIC_send_byte ( ddata ); //发送数据

if ( !ack )

{ alarm=0;

return ; }

IIC_stop ();

return ;

}

void IIC_read_adder ( uchar adder, uchar sub, uchar *buf, uchar num )

{

bit ack;

uchar i;

IIC_str ();

ack=IIC_send_byte ( adder ); //发送从机地址

if ( !ack )

{ alarm=0;

return ; }

ack=IIC_send_byte ( sub ); //发送从机子地址

if ( !ack )

{ alarm=0;

return ; }

for ( i=0; i

{

*( buf++ )=IIC_read_byte ( 1 ); //接收数据 存储倒*buf

}

IIC_stop ();

return ;

}

关键字:单片机  I  O口  模拟I2C  数据总线  传输方式 引用地址:单片机的I/O口模拟I2C数据总线传输方式

上一篇:GPRS模块发送信息代码
下一篇:51单片机对继电器的控制

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

51单片机怎么驱动直流电机c语言
特点 产品 PK51 CA51 A51 设备支持 经典的8051设备 Far Memory类型 ADI公司ADuC812的家庭 Dallas Semiconductor的390家庭 NXP(飞利浦)51MX家庭 μVisionIDE IDE 调试器 模拟器 编译工具 AX51汇编 CX51的C编译器 LX51连接器 OHx51目标进制转换器 A51汇编 BL51代码空间连接器 OH51对象的十六进制转换器 OC51 banked 目标转换器
[单片机]
51<font color='red'>单片机</font>怎么驱动直流电机c语言
51单片机控制的DHT11简易温湿度检测
简易温湿度测量仪,实现思路是通过温湿度传感器采集数据传送到最小系统上,并由最小系统对采集到的数据进行处理,随后发送到数码管或者液晶屏上进行显示,并对异常数据进行报警。 实验使用器材有DHT11温湿度传感器、IAP15W4K58S4最小系统、四位数码管、蜂鸣器以及发光二极管。通过最小系统发送开始信号使DHT11开始工作并采集数据判断DHT11是否正常工作,若DHT11正常工作,将采集数据进行校验,若校验结果正确,将其保存,并通过P1口显示到数码管上。随后判断数据是否超过预警值,如超过,将P2.4口电位拉高,使蜂鸣器示警,并让LED灯熄灭来进行警示。电路使用一个数码管对温湿度进行循环显示,相比较于使用2个数码管进行显示和使用液晶屏
[单片机]
51<font color='red'>单片机</font>控制的DHT11简易温湿度检测
单片机DS18B20温度测控系统
用单片机开发一个温度测量控制系统,显示用16*2的液晶,实时显示测量温度,加热输出采用通断控制,用发光二极管来模拟,能设置目标温度,能设置报警温度阈值,超过了进行报警,报警采用液晶屏幕显示。 方案分析和设计 看到设计任务的时候,因为主要是进行温度测量,所以必然会用到温度传感器。那么什么是温度传感器呢。温度传感器(temperature transducer)是指能感受温度并转换成可用输出信号的传感器。温度传感器是温度测量仪表的核心部分,品种繁多。按测量方式可分为接触式和非接触式两大类,按照传感器材料及电子元件特性分为热电阻和热电偶两类。在经过一番选择后,最终确
[单片机]
<font color='red'>单片机</font>DS18B20温度测控系统
串行1602的四位数据线程序-avr单片机
1602的四位数据线程序,节省了IO。单片机用的是Atmega16,编译环境ICC6.31A,1602驱动头文件。 1602Driver.h /*********************LCD模块1602底层驱动库*********************** * LCD模块与单片机的硬件连接: * /端口名称 /端口符号 /MCU端口 / LCD引脚号/ * * RS数据/指令选择线 * RS PD3 4 * R/W读写选择线 * R/W GND 5 * EN写使能线 * EN PD2 6 * 三态双向数据总线 * D0-D3 N
[单片机]
蓝桥杯STC15单片机复习——外部中断
前言 终于到外部中断了,其实从往届赛题来看,外部中断的使用比较少(也可能是我太菜了),不过咱得秉着宁错勿漏的精神来复习才行。 如上图所示,STC15的单片机的外部中断分别位于P32、P33(EX0、EX1),其中,外部中断0的中断号为0,外部中断1的中断号为2. 1、通过外部中断0控制LED亮灭 /* 彭某的蓝桥杯复习——外部中断 1、外部中断按键控制LED亮灭 */ #include STC15F2K60S2.h #define uint unsigned int #define uchar unsigned char void ALL_Init(); void EX0_Init(); void
[单片机]
蓝桥杯STC15<font color='red'>单片机</font>复习——外部中断
微控制器省电管理方法
新唐科技的NUC1xx包含NUC101、NUC100、NUC120、NUC130和NUC140,是以ARM Cortex-M0为核心的32位微控制器(MCU),经由不同时钟的设定,最高可以达到50MHz的运作频率。然而在一般简单控制或系统负载较低时,CPU并不需要执行在最高的运行时钟下即可应付所需要的计算量。这时候,便可以利用系统时钟的控制来降低时钟,以达到省电的目的。 另一种情况是CPU因为等待下一个工作或只需要久久工作一次时,就可以先将CPU进入Idle或Power Down模式,等到一定的时间之后或是有特定的事件发生时,才被唤醒过来进行相关事件的处理。同时,如果系统内没有用到的系统模块,也可以将其关闭以节省不必要的耗电。本
[单片机]
<font color='red'>微控制器</font>省电管理方法
基于51单片机实现静态数码管显示
前言 前面我们已经介绍了如何控制51 单片机的IO 口输出高低电平,本教程我们通过另外一个实验来讲述51 单片机IO 口的输出。通过单片机的IO 口控制板载数码管显示。可以参考前面的实验章节内容。 一、数码管介绍 1.数码管简介 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1 位、2 位、3 位、4 位、5 位、6 位、7 位等数码管。按发光二极管单元连接方
[单片机]
基于51<font color='red'>单片机</font>实现静态数码管显示
遥控LED广告牌
0 引言    LED广告牌是一种面向公众的信息显示终端,有着非常广泛的民用和商用价值。而现在大多数LED广告牌显示的信息都是事先固化在系统中的,这失去了信息的实时性,特别不方便用户更换显示内容;少数LED广告牌采用与微机直接相连,用微机来传送信息,这种系统解决了信息刷新问题,但由于有线连接,制约了系统放置的随意性,特别是对于面向多地区多客户的广告公司来说,给系统的实时更新和维护带来了许多不便。   本文提出了通过手持发射机遥控LED广告牌的新方案,实现了对广告牌内容及显示方式的灵活改变,使用非常方便。该方案以PC机为上位机,发射机和接收机均以单片机为核心,具有较高的性能价格比。 1 系统方案 1.1 无线遥控方式
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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