I2C接口的输入与输出驱动的
- 格式:doc
- 大小:33.00 KB
- 文档页数:12
I2C详解1、基本概念主机初始化发送,产⽣时钟信号和终⽌发送的器件从机被主机寻址的器件发送器发送数据到总线的器件接收器从总线接收数据的器件多主机同时有多于⼀个主机尝试控制总线但不破坏报⽂仲裁是⼀个在有多个主机同时尝试控制总线,但只允许其中⼀个控制总线并使报⽂不被破坏的过程同步两个或多个器件同步时钟信号的过程2、硬件结构每⼀个I2C总线器件内部的SDA、SCL引脚电路结构都是⼀样的,引脚的输出驱动与输⼊缓冲连在⼀起。
其中输出为漏极开路的场效应管、输⼊缓冲为⼀只⾼输⼊阻抗的同相器。
这种电路具有两个特点:(1)由于SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;(2)引脚在输出信号的同时还将引脚上的电平进⾏检测,检测是否与刚才输出⼀致。
为“时钟同步”和“总线仲裁”提供硬件基础。
3、时钟同步如果从机希望主机降低传送速度可以通过将SCL主动拉低延长其低电平时间的⽅法来通知主机,当主机在准备下⼀次传送发现SCL的电平被拉低时就进⾏等待,直⾄从机完成操作并释放SCL线的控制控制权。
这样以来,主机实际上受到从机的时钟同步控制。
可见SCL 线上的低电平是由时钟低电平最长的器件决定;⾼电平的时间由⾼电平时间最短的器件决定。
这就是时钟同步,它解决了I2C总线的速度同步问题。
4、主机发送数据流程(1)主机在检测到总线为“空闲状态”(即SDA、SCL 线均为⾼电平)时,发送⼀个启动信号“S”,开始⼀次通信的开始(2)主机接着发送⼀个命令字节。
该字节由7 位的外围器件地址和1 位读写控制位R/W 组成(此时R/W=0)(3)相对应的从机收到命令字节后向主机回馈应答信号ACK(ACK=0)(4)主机收到从机的应答信号后开始发送第⼀个字节的数据(5)从机收到数据后返回⼀个应答信号ACK(6)主机收到应答信号后再发送下⼀个数据字节(7)当主机发送最后⼀个数据字节并收到从机的ACK 后,通过向从机发送⼀个停⽌信号P结束本次通信并释放总线。
I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在芯片之间进行数据传输。
它由飞利浦半导体(现在的恩智浦半导体)于1982年开发,并广泛应用于各种电子设备中。
I2C具有简单、高效和可靠的特点,成为众多芯片和模块之间常用的通信接口之一。
本文将详细介绍I2C的基本工作原理。
一、总线架构I2C采用了主从结构的总线架构,其中主设备(Master)负责发起数据传输请求,而从设备(Slave)则在接收到请求后进行响应。
一个I2C总线上可以连接多个从设备,每个从设备都有一个唯一的地址。
主设备通过发送起始信号(Start)来启动通信,然后选择要与之通信的从设备地址,最后发送停止信号(Stop)结束通信。
二、物理层I2C使用双线制进行数据传输,包括数据线(SDA)和时钟线(SCL)。
数据线上的信号是双向的,用于传输数据。
时钟线则由主设备控制,用于同步数据传输。
三、起始和停止信号I2C通信以起始信号(Start)和停止信号(Stop)来标识通信的开始和结束。
起始信号由主设备产生,它表示将要发起一次新的通信。
停止信号同样由主设备产生,表示一次通信的结束。
四、数据传输格式I2C采用了基于字节的数据传输格式。
每个字节都由8位二进制数据组成,包括7位数据位和1位数据方向位。
数据方向位为0表示发送数据,为1表示接收数据。
在每个字节的传输过程中,都会先发送数据方向位,然后再发送数据位。
五、时钟同步I2C使用时钟同步机制来确保通信的准确性。
时钟线由主设备产生,并控制整个数据传输过程的时序。
在每个时钟周期中,数据线上的数据必须稳定,并且只有在时钟线为低电平时才能改变。
六、地址传输在I2C通信中,每个从设备都有一个唯一的7位地址。
主设备通过发送地址来选择要与之通信的从设备。
地址由8个位组成,最高位是固定的0或1,用于表示读(1)或写(0)操作。
其余的7位用于指定从设备的地址。
七、数据传输流程I2C通信的数据传输流程如下:1. 主设备发送起始信号(Start)。
i2c输入和输出低电平摘要:I2C 输入和输出低电平1.I2C 总线简介2.I2C 输入低电平3.I2C 输出低电平4.低电平在I2C 通信中的重要性5.总结正文:I2C(Inter-Integrated Circuit)是一种串行通信总线,广泛应用于各种电子设备之间的低速通信。
I2C 总线由两根信号线组成:数据线(SDA)和时钟线(SCL)。
在I2C 通信过程中,设备通过这两根信号线发送和接收数据。
1.I2C 总线简介I2C 总线是一种串行通信协议,具有设备地址和数据传输功能。
它由两根信号线组成:SDA(串行数据线)和SCL(串行时钟线)。
I2C 总线支持多主控制器和从控制器,通过仲裁和时钟同步实现设备之间的通信。
2.I2C 输入低电平在I2C 通信过程中,设备需要通过输入低电平来表示数据0,或者在空闲状态下保持低电平。
为了实现低电平输入,设备需要配置相应的输入缓冲器,使其在接收数据时能够捕获低电平信号。
同时,设备还需要具备抗干扰能力,以防止外部噪声影响输入信号的准确性。
3.I2C 输出低电平在I2C 通信过程中,设备需要通过输出低电平来表示数据0。
为了实现低电平输出,设备需要配置相应的输出缓冲器,使其能够在发送数据时输出低电平信号。
同时,设备还需要具备足够的驱动能力,以保证在长距离传输或高噪声环境下,输出信号仍然能够被准确地接收。
4.低电平在I2C 通信中的重要性低电平信号在I2C 通信中具有重要作用。
首先,低电平信号用于表示数据0,是数据传输的基础。
其次,在I2C 通信过程中,设备之间需要进行时钟同步,而时钟信号是通过发送低电平信号实现的。
最后,低电平信号还用于表示设备的状态,如片选(CS)信号等。
5.总结I2C 输入和输出低电平在I2C 通信中具有重要意义。
为了实现低电平输入和输出,设备需要配置相应的缓冲器和抗干扰能力。
外转子无刷电机驱动板接口定义外转子无刷电机驱动板是一种用于控制外转子无刷电机的电路板,它提供了与外转子无刷电机进行通信和控制的接口。
该驱动板通常由多个功能模块组成,包括功率模块、控制模块和通信模块等。
下面将详细介绍外转子无刷电机驱动板的接口定义。
一、电源接口1. 电源输入:该接口用于连接外部直流电源,提供给驱动板和外转子无刷电机供电。
通常为两个引脚,正极(+)和负极(-)。
2. 电源输出:该接口用于连接其他需要供电的设备,如传感器等。
通常为两个引脚,正极(+)和负极(-)。
二、控制接口1. 速度控制:该接口用于输入速度控制信号,以调整外转子无刷电机的转速。
通常为一个模拟输入或数字输入引脚。
2. 方向控制:该接口用于输入方向控制信号,以改变外转子无刷电机的旋转方向。
通常为一个数字输入引脚。
3. 刹车/使能控制:该接口用于输入刹车或使能控制信号,以控制外转子无刷电机的停止或使能状态。
通常为一个数字输入引脚。
三、编码器接口1. 编码器信号输入:该接口用于连接外转子无刷电机的编码器输出信号,以提供位置反馈。
通常为两个或四个数字输入引脚。
2. 编码器电源:该接口用于连接编码器的供电引脚,以为编码器提供所需的电源。
通常为两个引脚,正极(+)和负极(-)。
四、通信接口1. UART:该接口用于通过串行通信与外转子无刷电机进行数据传输和控制。
通常包括一个发送引脚(TX)和一个接收引脚(RX)。
2. I2C:该接口用于通过I2C总线与外转子无刷电机进行数据传输和控制。
通常包括一个时钟引脚(SCL)和一个数据引脚(SDA)。
3. SPI:该接口用于通过SPI总线与外转子无刷电机进行数据传输和控制。
通常包括一个时钟引脚(SCK)、一个主从选择引脚(SS)、一个主输出从输入引脚(MOSI)和一个主输入从输出引脚(MISO)。
五、保护接口1. 过流保护:该接口用于检测外转子无刷电机的电流是否超过设定阈值,并触发保护措施,如降低电机转速或切断电源。
I2C接口的输入与输出驱动的PCF8574-pcf8574采用I2C接口,有8个准双向口,可以和外部电路连接,来实现输入输出功能,可以用来对口线进行扩展有几点需要注意1.某位作为输入的时候,必须首先置为高电平2.地址是0100 A2 A1 A0 R/W3.最多可以扩展8片4.低电流损耗,静态电流10uA,驱动电流比较大,而且有索存功能,能够驱动LED 发光管5.带有外部中断输出,低电平有效我作了一个电路,其中P7-P4作为输入检测开关状态,P3-P0作为输出来驱动LED灯程序如下#include "reg51.h"#define SETBIT(VAR,Place) (VAR|=(1<<Place))#define CLRBIT(VAR,Place) (VAR&=((1<<Place)^255)) sbit IC_SCL=P3^6;sbit IC_SDA=P3^7;unsigned char IC_Re_Time;unsigned char IC_Err_Flag;void Timer0_Init(void){TMOD=0x00; //timer0工作定时器方式0,13位技术TH0=0x1e; //5msTL0=0x0c; //5msTR0=1; //启动时钟0ET0=1; //允许时钟0进行中断EA=1; //开放所有中断}void Delay(void){unsigned char i;for(i=0;i<=10;i++){;}}unsigned char VALBIT(unsigned int Val,unsigned char Bit) {unsigned int Buf;Buf=0x0001;if(Bit)Buf<<=Bit;Val&=Buf;if(Val)return(0xff);elsereturn(0x00);}/********************************************** 下面是PCF8574的操作程序1.通信方式:I2C2.通信端口:IC_SCL(P3.6),IC_SDA(P3.7)3.通信地址:0x0101000x***********************************************/ void IC_Start(void) //启动IC通信{IC_SDA=1;Delay();IC_SCL=1;Delay();IC_SDA=0;Delay();IC_SCL=0;Delay();}void IC_Stop(void) //停止IC通信{IC_SDA=0;Delay();IC_SCL=1;Delay();IC_SDA=1;Delay();}void IC_Receive_Ack(void) //接受ACK {IC_SDA=1;IC_SCL=1;Delay();IC_Re_Time=0;while(IC_Re_Time<=30){if(IC_SDA==0){IC_Err_Flag=0;break;}else{IC_Err_Flag=1;}}IC_SCL=0;Delay();}//void IC_Send_ACK(void) //发送ACK//{ //if read many datas at a time,this can be used // IC_SDA=0;// Delay();// IC_SCL=1;// Delay();// IC_SCL=0;// Delay();// IC_SDA=1;//}void IC_Send_NAck(void) //发送NACK{IC_SDA=1;Delay();IC_SCL=1;IC_SCL=0;Delay();}void IC_Write_Byte(unsigned char Data) //写数据到8574 {unsigned char i;for(i=0;i<=7;i++){if(VALBIT(Data,(7-i))) //data out msbIC_SDA=1;elseIC_SDA=0;IC_SCL=1;IC_SCL=0;Delay();}}unsigned char IC_Read_Byte(void) //从8574读取一个数据{unsigned char i;unsigned char Data;for(i=0;i<=7;i++){IC_SCL=1;Delay();IC_SDA=1;Delay();if(IC_SDA)SETBIT(Data,(7-i)); //data in msb too elseCLRBIT(Data,(7-i));IC_SCL=0;Delay();}return(Data);}void IC_Write_Data(unsigned char Data) {unsigned char write_time;unsigned char write_data;write_data=Data;for(write_time=0;write_time<=2;write_time++) {IC_Start();IC_Write_Byte(0x40);IC_Receive_Ack();IC_Write_Byte(write_data);IC_Receive_Ack();IC_Stop();if(IC_Err_Flag==0)break;}}unsigned char IC_Read_Data(void){unsigned char Return_Data;unsigned char read_time;for(read_time=0;read_time<=2;read_time++) {IC_Start();IC_Write_Byte(0x41);IC_Receive_Ack();Return_Data=IC_Read_Byte();IC_Send_NAck();IC_Stop();if(IC_Err_Flag==0){return(Return_Data);break;}}}void PCF8574_Init(void){IC_Write_Data(0xf0); //输入状态的必须开始的时候置为1,输出为0 }void main(void){unsigned char temp3;Timer0_Init();PCF8574_Init();while(1)temp3=IC_Read_Data();IC_Write_Data(0x0f);Delay();;中间可以添加你需要的模块,比如显示或者其他的操作等 }}/********************************************************* * 中断服务子程序**********************************************************/ extern void external0_rt(void)interrupt 0//INT0{}extern void eit0_rt(void)interrupt 1//T0,标准,定时中断TH0=0x1e;TL0=0x0c;IC_Re_Time++;}void external1_rt(void)interrupt 2 using 1//INT1 {}void eit1_rt(void)interrupt 3 using 1//T1,标准{}void sci_rt(void)interrupt 4 using 1//UART{}void eit2_rt(void)interrupt 5 using 1//T2 3种工作模式,输入捕捉、自动重载和波形发生器{}void PCA_rt(void)interrupt 6 using 1//PCA{}void KBDIT_rt(void)interrupt 7 using 1//keyboard{}void spi_rt(void)interrupt 9 using 1//SPI{}电信诈骗宣传标语、警示语、防骗口诀1.天上不会掉馅饼退税中奖是骗局;2.陌生电话不牢靠,安全账户是骗局;3.QQ视频可造假,要求打款风险大;4.网购骗局花样多,网上交易要小心;5.积极加强自我防范意识,共同提高识骗防骗能力;6.电信欠费要核实,大额汇款要当心;7.虚拟电话设陷阱,回拨号码能问明;8.陌生电话勿轻信,银行客服问究竟;安全账户子虚有,大额汇款要三思;个人信息顶重要,密码账号保管好;提防非法假网银,登录网址记清楚;网上购物便利多,支付限额要设好;大额支付用转账,现金最好少搬家;合法购汇勿贪小,中行网点容易找;刷卡消费莫离眼,防止盗刷盯着点;钱卡证件分开放,挂失要快莫等闲。
i2c工作原理
I2C(Inter-Integrated Circuit)是一种同步串行通信协议,它允
许微控制器或芯片之间进行简单而高效的通信。
I2C总线由两
条信号线组成,即串行数据线(SDA)和串行时钟线(SCL)。
工作原理如下:
1. 起始条件:主设备(通常是微控制器)将SCL拉高,并将SDA从高拉至低电平(起始位)。
2. 寻址:主设备发送一个地址字节,包括从设备地址和读/写位。
地址字节由7位从设备地址和1位读/写位组成。
当主设
备将SDA拉高时,从设备响应并发送一个应答位。
3. 数据传输:主设备根据需要向从设备发送或读取数据。
数据以字节为单位传输,每个字节后需要一个应答位。
发送数据时,主设备将数据写入SDA线,然后拉高SCL线以将数据发送给
从设备。
接收数据时,从设备将数据放置在SDA线上,主设
备通过读取SDA线上的数据来获取数据。
每个字节的最高有
效位(MSB)先传输。
4. 停止条件:在传输完成后,主设备将SCL从高拉至低电平,并随后将SDA从低拉至高电平,表示停止位。
总的来说,I2C是一种主从式通信方式,主设备负责发起通信
并控制数据传输,从设备负责响应和接收数据。
通过起始条件、
寻址、数据传输和停止条件的组合,实现了利用两条信号线进行简单而高效的通信。
i2c总线工作原理I2C总线是一种用于连接微控制器和外部设备的串行通信协议。
它采用两根信号线,分别是时钟线(SCL)和数据线(SDA),通过这两根线实现数据的传输和通信。
I2C总线的工作原理如下:1. 总线结构:I2C总线由一个主设备和多个从设备组成。
主设备负责发起通信并控制总线,从设备则接受主设备的指令并返回数据。
2. 起始信号和结束信号:通信开始时,主设备发出起始信号。
起始信号由将SCL线拉低,然后再将SDA线由高电平拉低构成,表示通信即将开始。
通信结束时,主设备发出结束信号,由将SCL线保持高电平的同时将SDA线由低电平拉高构成,表示通信结束。
3. 数据传输:数据传输通过时钟线(SCL)和数据线(SDA)进行。
时钟线由主设备控制,用于驱动数据传输。
数据线上的数据必须在时钟线为低电平时才能改变,而在时钟线为高电平时必须保持稳定。
4. 主设备和从设备地址:主设备发送数据时,首先发送从设备的地址。
地址由7位或10位构成,前7位是从设备的地址,最高位是读/写位。
读/写位为0表示写操作,为1表示读操作。
从设备接收到自己的地址后,确认信号应答ACK返回给主设备。
5. 数据传输确认:数据传输时,每传输一个字节后,接收方需要发送一个应答信号ACK给发送方,表示已成功接收。
如果接收方不能接收数据或者接收错误,会发送应答信号NAK给发送方。
6. 时钟速率:I2C总线的时钟速率可以根据需求设定,其中标准模式下的时钟速率为100 kbit/s,快速模式为400 kbit/s,高速模式可达到3.4 Mbit/s。
总的来说,I2C总线通过起始和结束信号进行通信的开始和结束,通过时钟线和数据线实现数据的传输和控制。
主设备发送地址和数据,从设备接收并返回数据。
通过应答信号确认数据是否成功传输。
I2C接口的输入与输出驱动的PCF8574-pcf8574采用I2C接口,有8个准双向口,可以和外部电路连接,来实现输入输出功能,可以用来对口线进行扩展有几点需要注意1.某位作为输入的时候,必须首先置为高电平2.地址是0100 A2 A1 A0 R/W3.最多可以扩展8片4.低电流损耗,静态电流10uA,驱动电流比较大,而且有索存功能,能够驱动LED 发光管5.带有外部中断输出,低电平有效我作了一个电路,其中P7-P4作为输入检测开关状态,P3-P0作为输出来驱动LED灯程序如下#include "reg51.h"#define SETBIT(VAR,Place) (VAR|=(1<<Place))#define CLRBIT(VAR,Place) (VAR&=((1<<Place)^255))sbit IC_SCL=P3^6;sbit IC_SDA=P3^7;unsigned char IC_Re_Time;unsigned char IC_Err_Flag;void Timer0_Init(void){TMOD=0x00; //timer0工作定时器方式0,13位技术TH0=0x1e; //5msTL0=0x0c; //5msTR0=1; //启动时钟0ET0=1; //允许时钟0进行中断EA=1; //开放所有中断}void Delay(void){unsigned char i;for(i=0;i<=10;i++){}}unsigned char VALBIT(unsigned int Val,unsigned char Bit) {unsigned int Buf;Buf=0x0001;if(Bit)Buf<<=Bit;Val&=Buf;if(Val)return(0xff);elsereturn(0x00);}/**********************************************下面是PCF8574的操作程序1.通信方式:I2C2.通信端口:IC_SCL(P3.6),IC_SDA(P3.7)3.通信地址:0x0101000x***********************************************/void IC_Start(void) //启动IC通信IC_SDA=1;Delay();IC_SCL=1;Delay();IC_SDA=0;Delay();IC_SCL=0;Delay();}void IC_Stop(void) //停止IC通信{IC_SDA=0;Delay();IC_SCL=1;Delay();IC_SDA=1;Delay();}void IC_Receive_Ack(void) //接受ACK {IC_SDA=1;IC_SCL=1;Delay();IC_Re_Time=0;while(IC_Re_Time<=30){if(IC_SDA==0){IC_Err_Flag=0;break;}else{IC_Err_Flag=1;}}IC_SCL=0;Delay();}//void IC_Send_ACK(void) //发送ACK//{ //if read many datas at a time,this can be used // IC_SDA=0;// Delay();// IC_SCL=1;// Delay();// IC_SCL=0;// Delay();// IC_SDA=1;//}void IC_Send_NAck(void) //发送NACK{IC_SDA=1;Delay();IC_SCL=1;Delay();IC_SCL=0;Delay();}void IC_Write_Byte(unsigned char Data) //写数据到8574{unsigned char i;for(i=0;i<=7;i++){if(VALBIT(Data,(7-i))) //data out msbIC_SDA=1;elseIC_SDA=0;IC_SCL=1;Delay();IC_SCL=0;Delay();}}unsigned char IC_Read_Byte(void) //从8574读取一个数据{unsigned char i;unsigned char Data;for(i=0;i<=7;i++){IC_SCL=1;Delay();IC_SDA=1;Delay();if(IC_SDA)SETBIT(Data,(7-i)); //data in msb tooCLRBIT(Data,(7-i));IC_SCL=0;Delay();}return(Data);}void IC_Write_Data(unsigned char Data){unsigned char write_time;unsigned char write_data;write_data=Data;for(write_time=0;write_time<=2;write_time++) {IC_Start();IC_Write_Byte(0x40);IC_Receive_Ack();IC_Write_Byte(write_data);IC_Receive_Ack();IC_Stop();if(IC_Err_Flag==0)break;}unsigned char IC_Read_Data(void){unsigned char Return_Data;unsigned char read_time;for(read_time=0;read_time<=2;read_time++) {IC_Start();IC_Write_Byte(0x41);IC_Receive_Ack();Return_Data=IC_Read_Byte();IC_Send_NAck();IC_Stop();if(IC_Err_Flag==0){return(Return_Data);break;}}}void PCF8574_Init(void)IC_Write_Data(0xf0); //输入状态的必须开始的时候置为1,输出为0 }void main(void){unsigned char temp3;Timer0_Init();PCF8574_Init();while(1){temp3=IC_Read_Data();IC_Write_Data(0x0f);Delay();;中间可以添加你需要的模块,比如显示或者其他的操作等}}/********************************************************** 中断服务子程序**********************************************************/extern void external0_rt(void)interrupt 0//INT0{extern void eit0_rt(void)interrupt 1//T0,标准,定时中断{TH0=0x1e;TL0=0x0c;IC_Re_Time++;}void external1_rt(void)interrupt 2 using 1//INT1{}void eit1_rt(void)interrupt 3 using 1//T1,标准{}void sci_rt(void)interrupt 4 using 1//UART{}void eit2_rt(void)interrupt 5 using 1//T2 3种工作模式,输入捕捉、自动重载和波形发生器{void PCA_rt(void)interrupt 6 using 1//PCA{}void KBDIT_rt(void)interrupt 7 using 1//keyboard {}void spi_rt(void)interrupt 9 using 1//SPI{}。
i2c的基本工作原理
I2C(Inter-Integrated Circuit)是由Philips公司开发的两线式串行总线,产生于20世纪80年代,用于连接微控制器及其外围设备。
I2C总线简单而有效,占用PCB(印制电路板)空间很小,芯片引脚数量少,设计成本低。
I2C总线的工作原理如下:
1.I2C总线由两根双向信号线组成:数据线(SDA)和时钟线(SCL)。
2.I2C总线通过上拉电阻接正电源。
当总线空闲时,上拉电阻使SDA和SCL
线都保持高电平(SDA=1,SCL=1)。
3.为了避免总线信号混乱,要求各设备连接到总线的输出端必须是开漏输
出或集电极开路输出的结构。
根据开漏输出或者集电极开路输出信号的
“线与”逻辑,连到I2C总线的任一器件输出低电平,都会使相应总线
上的信号变低。
4.I2C总线通过上拉电阻接正电源,空闲时为高电平。
连接到总线的器件
输出级必须是漏极开路或集电极开路才能执行线与的功能。
5.工作时,主机发送数据到从机,从机在接收到数据后返回给主机。
以上信息仅供参考,如需了解更多信息,请查阅相关书籍或咨询专业人士。
I2C接口的输入与输出驱动的PCF8574-
pcf8574采用I2C接口,有8个准双向口,可以和外部电路连接,来实现输入输出功能,可以用来对口线进行扩展
有几点需要注意
1.某位作为输入的时候,必须首先置为高电平
2.地址是0100 A2 A1 A0 R/W
3.最多可以扩展8片
4.低电流损耗,静态电流10uA,驱动电流比较大,而且有索存功能,能够驱动LED 发光管
5.带有外部中断输出,低电平有效
我作了一个电路,其中P7-P4作为输入检测开关状态,P3-P0作为输出来驱动LED 灯
程序如下
#include "reg51.h"
#define SETBIT(VAR,Place) (VAR|=(1<<Place))
#define CLRBIT(VAR,Place) (VAR&=((1<<Place)^255))
sbit IC_SCL=P3^6;
sbit IC_SDA=P3^7;
unsigned char IC_Re_Time;
unsigned char IC_Err_Flag;
void Timer0_Init(void)
{
TMOD=0x00;//timer0工作定时器方式0,13位技术
TH0=0x1e;//5ms
TL0=0x0c;//5ms
TR0=1;//启动时钟0
ET0=1;//允许时钟0进行中断
EA=1;//开放所有中断
}
void Delay(void)
{
unsigned char i;
for(i=0;i<=10;i++)
{
;
}
}
unsigned char VALBIT(unsigned int Val,unsigned char Bit) {
unsigned int Buf;
Buf=0x0001;
if(Bit)
Buf<<=Bit;
Val&=Buf;
if(Val)
return(0xff);
else
return(0x00);
}
/********************************************** 下面是PCF8574的操作程序
1.通信方式:I2C
2.通信端口:IC_SCL(P
3.6),IC_SDA(P3.7)
3.通信地址:0x0101000x
***********************************************/ void IC_Start(void)//启动IC通信
{
IC_SDA=1;
Delay();
IC_SCL=1;
Delay();
IC_SDA=0;
Delay();
IC_SCL=0;
Delay();
}
void IC_Stop(void)//停止IC通信
{
IC_SDA=0;
Delay();
IC_SCL=1;
Delay();
IC_SDA=1;
Delay();
}
void IC_Receive_Ack(void)//接受ACK {
IC_SDA=1;
IC_SCL=1;
Delay();
IC_Re_Time=0;
while(IC_Re_Time<=30)
{
if(IC_SDA==0)
{
IC_Err_Flag=0;
break;
}
else
{
IC_Err_Flag=1;
}
}
IC_SCL=0;
Delay();
}
//void IC_Send_ACK(void)//发送ACK
//{//if read many datas at a time,this can be used //IC_SDA=0;
//Delay();
//IC_SCL=1;
//Delay();
//IC_SCL=0;
//Delay();
//IC_SDA=1;
//}
void IC_Send_NAck(void)//发送NACK
{
IC_SDA=1;
Delay();
IC_SCL=1;
Delay();
IC_SCL=0;
Delay();
}
void IC_Write_Byte(unsigned char Data)//写数据到8574
{
unsigned char i;
for(i=0;i<=7;i++)
{
if(VALBIT(Data,(7-i)))//data out msb
IC_SDA=1;
else
IC_SDA=0;
IC_SCL=1;
Delay();
IC_SCL=0;
Delay();
}
}
unsigned char IC_Read_Byte(void)//从8574读取一个数据{
unsigned char i;
unsigned char Data;
for(i=0;i<=7;i++)
{
IC_SCL=1;
Delay();
IC_SDA=1;
Delay();
if(IC_SDA)
SETBIT(Data,(7-i));//data in msb too
else
CLRBIT(Data,(7-i));
IC_SCL=0;
Delay();
}
return(Data);
}
void IC_Write_Data(unsigned char Data)
{
unsigned char write_time;
unsigned char write_data;
write_data=Data;
for(write_time=0;write_time<=2;write_time++) {
IC_Start();
IC_Write_Byte(0x40);
IC_Receive_Ack();
IC_Write_Byte(write_data);
IC_Receive_Ack();
IC_Stop();
if(IC_Err_Flag==0)
break;
}
}
unsigned char IC_Read_Data(void)
{
unsigned char Return_Data;
unsigned char read_time;
for(read_time=0;read_time<=2;read_time++) {
IC_Start();
IC_Write_Byte(0x41);
IC_Receive_Ack();
Return_Data=IC_Read_Byte();
IC_Send_NAck();
IC_Stop();
if(IC_Err_Flag==0)
{
return(Return_Data);
break;
}
}
}
void PCF8574_Init(void)
{
IC_Write_Data(0xf0);//输入状态的必须开始的时候置为1,输出为0 }
void main(void)
{
unsigned char temp3;
Timer0_Init();
PCF8574_Init();
while(1)
{
temp3=IC_Read_Data();
IC_Write_Data(0x0f);
Delay();
;中间可以添加你需要的模块,比如显示或者其他的操作等
}
}
/*********************************************************
*中断服务子程序 *
*********************************************************/
extern void external0_rt(void)interrupt 0//INT0
{
}
extern void eit0_rt(void)interrupt 1//T0,标准,定时中断
{
TH0=0x1e;
TL0=0x0c;
IC_Re_Time++;
}
void external1_rt(void)interrupt 2 using 1//INT1
{
}
void eit1_rt(void)interrupt 3 using 1//T1,标准
{
}
void sci_rt(void)interrupt 4 using 1//UART
{
}
void eit2_rt(void)interrupt 5 using 1//T2 3种工作模式,输入捕捉、自动重载和波形发生器
{
}
void PCA_rt(void)interrupt 6 using 1//PCA
{
}
void KBDIT_rt(void)interrupt 7 using 1//keyboard
{
}
void spi_rt(void)interrupt 9 using 1//SPI {
}
Welcome !!! 欢迎您的下载,资料仅供参考!。