1. 51单片机操作24c08,IIC应答时,以下程序怎样反应出来是为0和为1呢
这是程序设计者偷懒的结果,因为大多数正常情况下不会出现应答为1的情况。程序没有写出错处理,出错处理也就是把结果向上一级函数返回,IIC_single_byte_write定义为 bit型,返回IIC_Tack的值。
正常情况下 程序设计合理,电路器件正常,基本不会出错。程序设计不合理调试不会通过,电路器件不正常,程序也没办法,只是知道错了而已。解决不了问题,所以很多时候程序员都会舍去这部分出错处理程序。
2. 单片机 iic 应答信号程序中有一句 while((sda==1)&&(i<250))i++ 我想知道 为什么i<250,250这个数字从哪
首先这段程序是一个等待ACK的程序
先看一下IIC规范是怎么说的:
IIC总线上的所有数据都是以8位字节传送的,发送端每发送一个字节,就在第9个时钟脉冲期间释放数据线,由接收端反馈一个应答信号。对于有效应答信号ACK的要求是,接收方在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。
好了,现在针对你的程序进行解读:
注意这句“接收方在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平”,程序中首先设置了SCL=1,然后开始等待,如果sda一直为1且i<250(可以根据情况酌情设定,一般设置为250),则说明没有应答信号到来(sda=1)且未超时(i<250),那么继续等待ACK。如果sda一直deng一直为1,则说明一直没有应答信号,那么等待250次就不再等待了(不可能一直等待下去),如果等到sda=0,说明等到了应答信号,则将scl至0。scl从1到0的变化就是为了产生第9个时钟脉冲。
只是我觉得你是初学者吧,说太简略了你肯定不懂,我当初也是这样的,好好用功吧.
3. I2C 单片机程序 在检测从机应答的时候,SDA是什么时候变化的
这个I2C的协议决定的。当你发送完数据之后,将SCL(时钟线)和SDA(数据线)同时置高,等待应答信号,应答信号就会将SDA的电平变低,从而实现应答的效果。你记住一点就是I2C是两个设备之间的通信,将两个线置高的是主设备,然后等待从设备将SDA数据线拉低,主设备检测到SDA线拉低,就说明从设备应答了。从而实现两者之间的通信
4. I2C的应答子程序如何使用,单片机从外部器件读取数据后,该怎么进行应答操作,这个子程序是否要返回值
void respons()
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}
SCL在高电平期间,SDA被从设备拉低标示应答。
while((SDA==1)&&(i<255))标示若一定时间内没收到应答,则默认收到,不再等待,以免从设备无应答时程序永远停在这里。
5. C51单片机模拟IIC总线,应答函数的疑问
应答是接收设别自动产生的,不一定是从机。在IIC上除了开始,停止和重复开始外,所有数据都在在时钟的低电平变化的,也就是为高后,数据就应该稳定了。所以如果是模拟总线,应先有下降沿,再设为输入,然后读ACK,如果是从机的应答,是自动产生的,是作为数据通信正确的判断标志,为了可靠,是要判断的。主机的应答一般是程序控制的,如果要结束总线,可以给也可以不给应答;如果要继续读数据,就必须给出应答。
6. 向大神求助,有没有C语言的基于485的51单片机的主从应答的程序啊,就是主机向各个从机发送地址码要求应答
这个问题很简单,用485通讯的话,思路如下
思路:
PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试助手
单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令
我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序
#include <reg51.h> //选用晶振11.0592MHz
#include <absacc.h>
#define DATA51 DBYTE[0x80] //80H存数据
#define AddressID 0x31 //本机地址1
sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态
sbit MAX485_DIR=P3^7;
main()
{
//****************通讯设置
SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口优先级高
// TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (11.0592M)
TL1 = 0xf4;
TR1 = 1; //开启定时器1
EA = 1; // 开总中断
ES = 1; //开串口中断
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
while(1);
}
void counter4(void) interrupt 4 using 2 //串口中断
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
{
while(RI==0);
RI=0;
if(SBUF==0x01) //发送指令
{
MAX485_DIR=1; //开发送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //发送o
while(TI==0);
TI=0;
SBUF=0x6b; //发送k
MAX485_DIR=0; //开接收
}
if(SBUF==0x00) //接收
{
//这里怎么处理就看你自己要怎么做了,你没要求,我也不好怎么写,就自己写吧
}
}
}
程序调试通过,可以直接套用
7. 51单片机软件实现iic通信的应答程序
呵呵不知道你是从哪里看的?这个应答是肯定有用的。在进行写操作的时候,一定需要检测应答信号来判断是否写入有效?在进行读的时候,也要发送应答信号继续和非应答信号停止读写。
8. 在单片机中IIC中如果没有应答信号单片机如何处理
IIC总线是每发送一个字节(8位)数据后,从动设备将主动将SDA引脚拉低,表示数据正常。
如果没有拉低,说明在发送过程中出现了总线时序错误,可能会导致意外情况,那么为了将这种意外降到最低,当没有应答信号时,应采取以下措施:
1.
数据重新发送,以覆盖原来的错误
2.
设置合理的超时时间,以在超时后允许系统重发。
3.
对于重要数据,比如需要保存的系统参数,在无应答信号时,需要将数据读回进行校验,防止出现写错误。
9. 单片机模拟i2c协议读写2408,为什么主程序中只检测应答并没有对返回的应答值进行处理。
这个是程序偷懒的方法,就算主程序给2408的应答时,2408也没有要求重发的指令,2408只是个接受体,即使命令错误了它也没有办法。如果是两个单片机之间I2C就必须有ACK了。