用PCF8574扩展单片机IO口

合集下载

简单的单片机I-O口扩展实例

简单的单片机I-O口扩展实例

简单的单片机I/O口扩展实例扩展实例 简单的I/O口扩展通常是采用TTL或CMOS电路锁存器、三态门等作为扩展芯片,通过P0口来实现扩展的一种方案。

它具有电路简单、成本低、配置灵活的特点。

下图为采用74LS244作为扩展输入、74LS273作为扩展输出的简单I/O口扩展。

 芯片及连线说明 图中电路中采用的芯片为TTL电路74LS244、74LS273。

其中,74LS244为8缓冲线驱动器(三态输出),、为低电平有效的使能端。

当二者之一为高电平时,输出为三态。

74LS273为8D触发器,为低电平有效的清除端。

当=0时,输出全为0且与其它输入端无关;CP端是时钟信号,当CP由低电平向高电平跳变时刻,D端输入数据传送到Q输出端。

P0口作为双向8位数据线,既能够从74LS244输入数据,又能够从74LS273输出数据。

输入控制信号由P2.0和相或后形成。

当二者都为0时,74LS244的控制端有效,选通74LS244,外部的信息输入到P0数据总线上。

当与74LS244相连的按键都没有按下时,输入全为1,若按下某键,则所在线输入为0。

输出控制信号由P2.0和相或后形成。

当二者都为0后,74LS273的控制端有效,选通74LS273,P0上的数据锁存到74LS273的 输出端,控制发光二极管LED,当某线输出为0时,相应的LED发光。

   I/O口地址确定 因为74LS244和74LS273都是在P2.0为0时被选通的,所以二者的口地址都为FEFFH(这个地址不是惟一的,只要保证P2.0=0,其它地址位无关)。

但是由于分别由和控制,因而两个信号不可能同时为0(执行输入指令,如MOVX A,@DPTR或MOVX A,@Ri时,有效;执行输出指令,如MOVX @DPTR,A或MOVX @Ri,A时,有效),所以逻辑上二者不会发生冲突。

 。

I2C总线8位远程IO扩展口芯片PCF8574的驱动程序

I2C总线8位远程IO扩展口芯片PCF8574的驱动程序

//...‎.....‎.....‎.....‎.....‎.....‎.....‎.....‎//名称‎: PCF‎8574(‎A).c ‎I2C扩展‎8位I/O‎芯片的接口‎程序//‎编程: 不‎详//日‎期: 20‎11102‎5//‎//发现‎问题请指点‎,谢谢!‎//...‎.....‎.....‎.....‎.....‎.....‎.....‎.....‎//CP‎U: 89‎C55 1‎1.059‎2MHz‎//环境:‎Keil‎C51 ‎V8.01‎//引脚‎定义:/‎/CPU‎_P2.0‎--- ‎P CF85‎74X_S‎C L 时钟‎// C‎P U_P2‎.1 --‎-PCF‎8574X‎_SDA ‎数据//‎CPU_‎P2.2 ‎--- P‎C F857‎4X_IN‎T中断‎//...‎.....‎.....‎.....‎.....‎.....‎.....‎.....‎#inc‎l ude ‎<Publ‎i c.h>‎#inc‎l ude ‎<Intr‎i ns.h‎>#in‎c lude‎"del‎a y_s.‎h"#i‎n clud‎e "pc‎f8574‎.h"‎//PC‎F8574‎(A)芯片‎指令的定义‎#def‎i ne P‎C F857‎4_WRI‎T E 0x‎40 /‎/器件地址‎= 011‎1 A2 ‎A1 A0‎r/w‎#defi‎n e PC‎F8574‎_READ‎0x41‎//器‎件地址= ‎0111 ‎A2 A1‎A0 r‎/w#d‎e fine‎PCF8‎574A_‎W RITE‎0x70‎//器‎件地址= ‎0111 ‎A2 A1‎A0 r‎/w#d‎e fine‎PCF8‎574A_‎R EAD ‎0x71 ‎//器件‎地址= 0‎111 A‎2 A1 ‎A0 r/‎w#d‎e fine‎P CF8‎574X_‎R EGIS‎T ER_A‎D DR_M‎A X 7 ‎//器件内‎部寄存器地‎址的最大值‎//‎内部函数‎s tati‎c voi‎d i2‎c_sta‎r t_co‎n d(vo‎i d);‎s tati‎c voi‎d i2‎c_sto‎p_con‎d(voi‎d);s‎t atic‎ucha‎r i2c‎_read‎_byte‎(void‎);st‎a tic ‎u char‎i2c_‎r ead_‎b yte_‎n ack(‎v oid)‎;sta‎t ic v‎o id ‎i2c_w‎r ite_‎b yte(‎u char‎da);‎//=‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎= ====‎=====‎=====‎=//接‎口调用函数‎部分//‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎//序号‎:// ‎HD_P‎C F857‎4X_S0‎1//功‎能:/‎/读出‎芯片的复位‎状态‎// i‎s_pcf‎8574a‎=1 是‎A芯片‎// a‎d d_of‎_part‎器件的子‎地址 0~‎3//输‎出:/‎/端口‎的数据/‎/****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**uc‎h ar P‎C F857‎4X_re‎a d_io‎(ucha‎r is_‎p cf85‎74a, ‎u char‎add_‎o f_pa‎r t){‎ucha‎r i;‎i2c_‎s tart‎_cond‎();‎i f(is‎_pcf8‎574a ‎!=0)‎{‎i2c_w‎r ite_‎b yte(‎P CF85‎74A_R‎E AD |‎((add‎_of_p‎a rt <‎<1) &‎0x0E)‎);//器‎件地址=0‎111 A‎2 A1 ‎A0 r/‎w}‎else‎{‎i2c‎_writ‎e_byt‎e(PCF‎8574_‎R EAD ‎|((ad‎d_of_‎p art ‎<<1) ‎&0x0E‎));//‎器件地址=‎0100 ‎A2 A1‎A0 r‎/w}‎i =‎i2c_r‎e ad_b‎y te_n‎a ck()‎;/‎/顺序读的‎方式读出一‎个字节‎i2c_s‎t op_c‎o nd()‎;re‎t urn(‎i);}‎//*‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎****‎//序号:‎// ‎H D_PC‎F8574‎X_S02‎//功能‎://‎写数据‎到I/O端‎口//输‎入:/‎/is‎_pcf8‎574a ‎=1 是A‎芯片/‎/ad‎d_of_‎p art:‎器件的‎子地址 0‎~7//‎dat‎:写入‎的字节/‎/输出: ‎// ‎无//*‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎void‎PCF8‎574X_‎w rite‎_io(u‎c har ‎i s_pc‎f8574‎a, uc‎h ar a‎d d_of‎_part‎, uch‎a r da‎t){‎i2c_‎s tart‎_cond‎();‎i f(is‎_pcf8‎574a ‎!=0)‎{‎i2c_w‎r ite_‎b yte(‎P CF85‎74A_W‎R ITE ‎|((ad‎d_of_‎p art ‎<<1) ‎&0x0E‎)); /‎/器件地址‎=0111‎A2 A‎1 A0 ‎r/we‎l se‎{i‎2c_wr‎i te_b‎y te(P‎C F857‎4_WRI‎T E |(‎(add_‎o f_pa‎r t <<‎1) &0‎x0E))‎;//器‎件地址=0‎100 A‎2 A1 ‎A0 r/‎w}‎i2c‎_writ‎e_byt‎e(dat‎);‎i2c_s‎t op_c‎o nd()‎;}‎//===‎=====‎=====‎=//内‎部调用函数‎部分//‎=====‎=====‎====‎//--‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎----‎//I2C‎发启始条‎件:时钟线‎为高时数据‎线发生下降‎沿跳变/‎/----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎--st‎a tic ‎v oid ‎i2c_s‎t art_‎c ond(‎v oid)‎{C‎O DE_S‎C L_LO‎W;_‎D ELAY‎_NOP3‎;CO‎D E_SD‎A_HIG‎H;_‎D ELAY‎_NOP3‎;CO‎D E_SC‎L_HIG‎H;_‎D ELAY‎_NOP3‎;CO‎D E_SD‎A_LOW‎;_D‎E LAY_‎N OP3;‎}/‎/----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-//I‎2C 发结‎束条件:时‎钟线为高时‎数据线发生‎上升沿跳变‎//--‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎---s‎t atic‎void‎i2c_‎s top_‎c ond(‎v oid)‎{C‎O DE_S‎C L_LO‎W;_‎D ELAY‎_NOP3‎;CO‎D E_SD‎A_LOW‎;_D‎E LAY_‎N OP3;‎COD‎E_SCL‎_HIGH‎;_D‎E LAY_‎N OP3;‎COD‎E_SDA‎_HIGH‎;_D‎E LAY_‎N OP3;‎}/‎/----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-// ‎I2C 读‎取一个中间‎字节的数据‎//--‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎---/‎*sta‎t ic u‎c har ‎i2c_r‎e ad_b‎y te(v‎o id)‎{uc‎h ar i‎;uc‎h ar d‎a=0;‎for(‎i =0;‎i<8;‎i++)‎{‎da <‎<=1; ‎//传输‎的数据高位‎在前‎C ODE_‎S CL_L‎O W;‎_DEL‎A Y_NO‎P3;‎CODE‎_SCL_‎H IGH;‎//时‎钟为高时读‎数据‎//‎N OP3;‎if‎(JUD‎G E_PC‎F8574‎X_SDA‎) da+‎+;}‎COD‎E_SCL‎_LOW;‎_DE‎L AY_N‎O P3;‎CODE‎_SDA_‎L OW; ‎//发‎送应答位‎_DEL‎A Y_NO‎P3;‎C ODE_‎S CL_H‎I GH;‎_DEL‎A Y_NO‎P3;‎C ODE_‎S CL_L‎O W;‎_DELA‎Y_NOP‎3;C‎O DE_S‎D A_HI‎G H;‎r etur‎n(da)‎;}*‎///-‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎----‎// I2‎C读取一‎个结尾字节‎的数据/‎/----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-sta‎t ic u‎c har ‎i2c_r‎e ad_b‎y te_n‎a ck(v‎o id)‎{uc‎h ar i‎;uc‎h ar d‎a =0;‎for‎(i =‎0; i<‎8; i+‎+){‎da‎<<=1‎;C‎O DE_S‎C L_LO‎W;‎_DELA‎Y_NOP‎3;‎C ODE_‎S CL_H‎I GH;‎‎//NOP‎3;‎i f(JU‎D GE_P‎C F857‎4X_SD‎A) da‎++;‎}CO‎D E_SC‎L_LOW‎;_D‎E LAY_‎N OP3;‎COD‎E_SDA‎_HIGH‎;_D‎E LAY_‎N OP3;‎COD‎E_SCL‎_HIGH‎;_D‎E LAY_‎N OP3;‎COD‎E_SCL‎_LOW;‎ret‎u rn( ‎d a );‎}/‎/----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-// ‎I2C 写‎入一个字节‎的数据/‎/----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-sta‎t ic v‎o id i‎2c_wr‎i te_b‎y te(u‎c har ‎d a )‎{uc‎h ar i‎;fo‎r(i =‎0; i<‎8; i+‎+){‎CO‎D E_SC‎L_LOW‎;i‎f(da&‎0x80)‎{‎CO‎D E_SD‎A_HIG‎H;‎}e‎l se‎{‎CODE‎_SDA_‎L OW;‎}‎CODE‎_SCL_‎H IGH;‎da‎<<=1‎;}‎CODE‎_SCL_‎L OW; ‎//第8‎个SCL下‎降沿,写入‎8位数据‎_DEL‎A Y_NO‎P3;‎C ODE_‎S DA_H‎I GH;‎_DEL‎A Y_NO‎P3;‎C ODE_‎S CL_H‎I GH;‎}//‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎=====‎== ===‎=====‎=====‎==/‎/End ‎O f Fi‎l e‎‎。

I2C总线I/O器件PCF8574的原理与应用

I2C总线I/O器件PCF8574的原理与应用

I2C总线I/O器件PCF8574的原理与应用
朱明荣;汪立森
【期刊名称】《电子技术应用》
【年(卷),期】1994(000)012
【摘要】介绍I^2C总线I/O器件PCF8574的特点,重点介绍了该器
件的时序,以及作猖输入、独立输出、某些输入和某些位输出、中断等方面的应用,并给出了实用程序,由于该器件体积小、电路连接简单、不占用系统地址总线和数据总线的优点,使其功能上远远超过传统的用串行口扩展的寄存器作并行I/O口,故应用前景广泛。

【总页数】4页(P30-33)
【作者】朱明荣;汪立森
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP336
【相关文献】
1.I2C总线器件与非I2C总线单片机之间数据传输的软硬件设计 [J], 杨青川;甄兴福;李芳
2.I2C总线控制的环绕声处理的TA8776N电路原理与应用 [J], 王锡胜
3.一种利用可编程器件扩展I2C总线的方法 [J], 林聚承
4.I2C总线器件编程开发关键技术 [J], 黄忠良
5.I~2C总线I/O器件PCF8574的原理与应用 [J], 朱明荣;汪立森
因版权原因,仅展示原文概要,查看原文内容请购买。

一种I2C接口扩展器的设计

一种I2C接口扩展器的设计

一种I2C接口扩展器的设计邱永华【摘要】介绍一种基于PCF8574和数字开关的I2C接口扩展器,通过I2C控制PCF8574将串行输入的数据并行输出,再将PCF8574的I0输出信号连接到数字开关控制信号上,对数字开关进行自由切换,从而实现在I2C总线上扩展出更多的I2C接口.通过多片PCF8574和数字开关的组合,最多可以实现数百个I2C模块的接入,选用不同规格的I2C接口扩展器可满足不同系统的需求.【期刊名称】《电子产品可靠性与环境试验》【年(卷),期】2012(030)006【总页数】3页(P61-63)【关键词】扩展器;接口;总线【作者】邱永华【作者单位】广东女子职业技术学院,广东广州 510450【正文语种】中文【中图分类】TP274+.20 引言嵌入式系统是当前最热门、最有发展前途的IT应用技术之一,从随身携带的MP3、语言复读机、手机和PDA到家庭中的智能电视、智能冰箱和机顶盒,再到工业生产、娱乐中的机器人,无不采用嵌入式技术。

串行扩展总线技术是嵌入式技术发展的一个显著特点 [1]。

其中Philips公司推出的I2C总线最为著名。

与并行扩展总线相比,串行扩展总线有突出的优点:电路结构简单,程序编写方便,易以实现用户系统软硬件的模块比、标准化等。

目前I2C总线技术已为许多著名公司所采用,并广泛地应用于各种嵌入式系统中。

1 I2C总线简介I2C(Inter-Integrated Circuit)总线是由 Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。

它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点 [2]。

I2C总线的特征如下:1)只要求两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL);2)每个连接到总线的器件都可以通过唯一的地址和一直存在的、简单的主机/从机关系软件所设定的地址来识别,主机可以作为主机发送器或主机接收器来使用;3)它是一个真正的多主机总线,如果两个或更多的主机同时初始化,数据传输就可以通过冲突检测和仲裁来防止数据被破坏;4)串行的8位双向数据传输位速率在标准模式下可达100 kbit/s,快速模式下可达400 kbit/s,高速模式下可达3.4 Mbit/s;5)连接到相同总线的IC数量仅受到总线的最大电容400 pF的限制。

PCF8574T_I2C_并行口扩展电路

PCF8574T_I2C_并行口扩展电路
250
注 1 上电复位电路复位 I2C 总线逻辑 并将所有 I/O 口都置位为 1
25 典型值
1
最大值 300
10 10 4
+1 4 4 +0.3VDD VDD+0.5 +250
mA 单位
∝A mA
pF pF
∝s ∝s ∝s
mA ∝A
∝s ∝s
V V nA
I2C 总线时序特性
标号
参数
I2C 总线时序 见图 12
图 9 多个 PCF8574 的中断应用
图 10 I/O 口 P5 的输入变化产生中断
5
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925
准双向 I/O 口(见图 11) 准双向 I/O 口可用作输入和输出而不需要通过控制寄存器定义数据的方向 上电时 I/O 口为高电 平 该模式中只有 VDD 提供的电流有效 在大负载输出时提供额外的强上拉以使电平迅速上升 当输出 写为高电平时打开强上拉 在 SCL 的下降沿关闭 I/O 口用作输入之前应当为高电平
上电复位电压
输入 SCL 输入/输出 SDA
工作模式; VDD=6V; 无负载; VI= VDD 或 VSS
fSCL=100KHz 备用模式; VDD=6V; 无负载; VI= VDD 或 VSS
VDD=6V;无负载; VI= VDD 或 VSS ; 注 1
VIL VIH IOL IL Ci I/O 口
SO16 塑料小型表面封装 16 脚 本体宽 7.5mm
8
IOL 标号
低电平输出电流 参数
VOL=1V; VDD=5V 条件

I2C接口的输入与输出驱动的PCF8574_

I2C接口的输入与输出驱动的PCF8574_

I2C接口的输入与输出驱动的PCF8574_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))< p="">#define CLRBIT(VAR,Place) (VAR&=((1<<place)^255))< p=""> 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{}欢迎您的光临,Word文档下载后可修改编辑双击可删除页眉页脚谢谢!希望您提出您宝贵的意见,你的意见是我进步的动力。

PCF8574调试的沉痛经历

PCF8574调试的沉痛经历

PCF8574调试的沉痛经历最近一个超声项目需要用到端口扩展功能,经过一番调研,决定选用PCF8574这款I2C总线的芯片,然后开始看数据手册,组实验板,经过一番忙碌,材料齐全,准备开始调试,之前已经做好了I2C的程序,烧入单片机,运行,状态不对?诧异,很是诧异,然后我就开始了我那冤屈的、痛苦的苦难之旅,为什么这么说,看官您请往下看。

开始我以为是程序中时序匹配的问题,于是开始用示波器查看,经过一番查找,最后确定时序没问题,开始郁闷&mdash;&mdash;。

然后我以为是硬件损坏,然后检查PCF8574,型号是PCF8574T,没错,然后在数据手册中曾看到中断是自动响应的,然后我就在输出管脚上加逻辑电平,高低,高低,高高低低,反复测试后,最后确认,芯片的中断脚是有输出的,说明芯片应该或者说基本是好的,没坏,然后对程序进行了简单修改,测试,当满怀信心的测试后发现,芯片还是没响应,情绪开始低落,很是郁闷&mdash;&mdash;。

为了确认芯片的好坏,我在这之后还是决定不管三七二十几,换芯片!!!然后准备烙铁、工具等,焊下原有芯片(在焊下的一瞬间,脑子里飞快的闪过一念头,坏的扔了得了,但是抬头一看老板在,马上作出了违背我良心的决定,保存!!!鄙视我一次),装上新的芯片,清理工作台,重新测试,老状况,老现象,崩溃!!!!于是我就开始疯狂的修改程序,加延时,测试,不行;加逻辑,测试、不行;加协议代码,测试,不行;单字节通信,测试,不行;多字节通信,不行;只读,测试,不行;只写,测试,不行,这时候我感觉我自己要崩溃了,程序作了这么多年,硬件调了那么多次,难不成今天我黑腿哥要将一世英名丢在此吗?不行,重来,将上面的过程重复一便,还是不行,崩溃了,感觉被打败了&mdash;&mdash;!!!于是将手册打出来,重新翻看了几遍,没想法?再看,还是没发现,情绪开始低落,资料扔在一边,上网,聊大天&mdash;&mdash;,经过一阵休整,刚要准备重新来过,却发现天色已晚,算了,下老子的班,让老板瞪眼去吧!!!!!!!转过天来,本将军经过一夜休整,精神抖擞,豪气万丈,上班第一件决定就是管他他奶奶的,再战江湖,于是第一天的情景又重新演义了一遍,到下班时,调试结果还是涛声依旧,一如既往,没有任何反映,PCF8574就好象死了一样,怎么都没反映,就好象是哑巴聋子一样,不管你怎么招呼,他就是没有反映,已经彻底崩溃,于是决定再次休战,明日再来!!!!!!又是迷乱的一夜,晚上做梦时,看到PCF8574就象一座大山,横在心上,太他*的堵心了,老子今天不调了,你不是不理我吗?老子也不理你,看谁吊!!!!!于是收拾,洗梳,上班。

虚拟I2C总线扩展IO口

虚拟I2C总线扩展IO口

4、中断请求
当PCF8574输入端P0~P7电平状态改变时,中 断请求输出端INT会出现低电平(滞后时间约 4s),可触发80C51产生中断。在对PCF8574进 行一次读写操作后,INT端撤销中断请求,复位 为高电平。
5、数据输入/输出操作格式
⑴ 输出操作 S SLAW A ⑵ 输入操作 S SLAR A POdata A P
解:编制程序如下: 主程序:
VSDA VSCL SLA NUMB MTD MRD WORK:MOV MOV MOV LCALL SETB SETB SETB SJMP EQU P1.0 EQU P1.1 EQU 50H EQU 51H EQU 30H EQU 40H MTD,#0FFH SLA,#40H NUMB,#1 WRNB EA EX1 IT1 $ ;定义虚拟I2C总线数据线端口 ;定义虚拟I2C总线时钟线端口 ;定义发送/接收寻址字节内RAM存储单元为50H ;定义发送/接收数据字节数N内RAM存储单元为51H ;定义发送数据内RAM存储区首地址为30H ;定义接收数据内RAM存储区首地址为40H ;PCF8574初始化,置P0~P3输入态,D0~D3灯灭 ;置发送寻址字节 ;置发送字节数 ;FFH写入PCF8574 ;CPU开中 ;INT1开中 ;置INT1边沿触发方式 ;等待PCF8574 P0~P3口状态变化触发中断
2、电路设计
PCF8574与80C51 I2C总线接口应用电路。
3、寻址字节
PCF8574的器件地址是 0100,A2A1A0为引脚 地址,全接地时为 000 , R/W=1 时,接收寻址 字 节 SLAR=41H =01000001B ; R/W=0 时 , 发 送 寻址字节SLAW=40H =01000000B。

I2C 总线8 位远程IO 扩展口芯片PCF8574 的原理与应用

I2C 总线8 位远程IO 扩展口芯片PCF8574 的原理与应用

I2C总线8位远程I/O扩展口芯片PCF8574的原理与应用一概述PCF8574是PHILIPS公司推出的一款带I2C总线,具有CMOS电路可使大多数MCU实现远程I/O口扩展该器件包含一个8位准双向口和一个I2C总线接口PCF8574电流消耗很低且口输出锁存具有大电流驱动能力可直接驱动LED它还带有一条中断接线INT可与MCU的中断逻辑相连通过INT发送中断信号远端I/O口不必经过I2C 总线通信就可通知MCU是否有数据从端口输入这意味着PCF8574可以作为一个单被控器下面将主要的性能指标作一综合1. 操作电压2.5~6.0V;低备用电流10A;2.3. I2C并行口扩展电路;开漏中断输出;4.5.I2C总线实现8位远程I/O口;与大多数MCU兼容;6.口输出锁存具有大电流驱动能力可直接驱动LED;7.通过3个硬件地址引脚可寻址8个器件PCF8574A可多达16个;8.DIP16SO16或SSOP20形式封装.9.二PCF8574的基本组成INT 13中断输出低电平有效SCL 14串行时钟线SDA 15串行数据线16二P CF8574与微控制器的接口软件及功能应用举例按I2C总线规约PCF8574的器件地址为40h, PCF8574A的器件地址为70h, 当然,由于硬件地址引脚A0-A2 可寻址8个器件,所以器件地址并不唯一,例如:A0接GND,A1接VCC,A2接VCC,则PCF8574的器件地址为4Ch.下面首先给出基本的应用原理图(以4个按键输入和4个LED为例)然后说明各种功能的应用PCF8574应用电路原理图P87LPC764采用内部振荡内部复位电路1作为准双向口输出作为准双向口扩展功能使用时无需任何控制寄存器来进行输入或输出设定参照上面的原理图举例说明作为输出控制LED的设定欲使LED1LED3亮LED2LED4灭软件模块如下Output_Control:MOV SlvAdr,#40h ; 取PCF8574的器件地址MOV ByteCnt,#1传送字节个数为1MOV XmtDat,#0F5h 传送的字节内容为#0F5h; 并口P0-P7的输出值为11110101ACALL SendData 调用数据发送模块RET 返回调用处2作为准双向口输入作为准双向口扩展功能使用时无需任何控制寄存器来进行输入或输出设定参照上面的原理图举例说明作为按键输入的设定首先请用户特别注意PCF8574的/INT输出在上电复位或进行了输出操作之后一直保持低电平因此用户在进行输入操作之前如果想等待/INT中断再处理的话必须进行输入检测之前的预操作之后可采取查询或中断方式来判断/INT输出Input_Check:MOV SlvAdr,#40h ; 取PCF8574的器件地址MOV ByteCnt,#1传送字节个数为1ACALL RcvData 调用数据接收模块; 接收预处理完毕JB P1.4,$ ; PCF8574无数据输出则在此等待MOV ByteCnt,#1接收字节个数为1ACALL RcvData 调用数据接收模块RET 返回调用处以上程序调用了I2C总线的基本数据发送(SendData)和接收(RcvData)模块,这些模块的源程序清单以及MCU的内部RAM定义在附录中给出。

单片机串行口IO端口扩展介绍

单片机串行口IO端口扩展介绍
是否兼容
08
检查串行口IO端 口的电源供应是
否正常
09
检查串行口IO端 口的接地是否正

10
检查串行口IO端 口的抗干扰措施
是否正确
串行口IO端口扩展应 用案例
实际应用场景
智能家居:通过串行口IO端口扩展,实现对家电 设备的远程控制和监测。
工业自动化:通过串行口IO端口扩展,实现对工 业设备的远程监控和操作。
单片机与网络设备通信:通过串行口扩展IO端口,实现 单片机与网络设备的通信,实现网络控制和数据传输。
串行口IO端口扩展硬 件设计
硬件结构设计
单片机串行口IO端口 扩展硬件主要包括单 片机、串行口、IO端 口扩展芯片等部分。
IO端口扩展芯片负责 将单片机的IO端口进 行扩展,增加硬件的
IO端口数量。
利用单片机的IO 端口进行扩展
使用串行口扩展 板进行扩展
扩展应用实例
单片机与传感器通信:通过串行口扩展IO端口,实现单 片机与各种传感器的通信。
单片机与显示屏通信:通过串行口扩展IO端口,实现单 片机与显示屏的通信,显示各种信息。
单片机与无线模块通信:通过串行口扩展IO端口,实现 单片机与无线模块的通信,实现无线数据传输。
端口扩展程序
1 端口扫描:检测可用端口并进行编号 2 端口配置:设置端口参数,如波特率、数据位、停止位等 3 数据收发:实现数据的接收和发送 4 错误处理:检测并处理通信错误,如超时、数据丢失等 5 端口管理:实现端口的添加、删除、修改等操作 6 用户界面:提供友好的用户界面,方便用户操作和查看端口状态
校验方式等
串行通信接口:用于连 接串行设备的物理接口
串行通信波特率:数据 传输的速率,单位为bps

PCF8574T I2C 并行口扩展电路

PCF8574T I2C 并行口扩展电路

5. 管脚描述
标号
A0 A1 A2 P0 P1 P2 P3 VSS P4 P5 P6 P7 INT SCL SDA VDD
管脚 SO16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
管脚配置(SO16)
描述
地址输入 0 地址输入 1 地址输入 2 准双向 I/O 口 0 准双向 I/O 口 1 准双向 I/O 口 2 准双向 I/O 口 3 地 准双向 I/O 口 4 准双向 I/O 口 5 准双向 I/O 口 6 准双向 I/O 口 7 中断输入 低电平有效 串行时钟线 串行数据线 电源
PCF8574 和 PCF8574A 的唯一区别仅在于器件地址不相同
3. 订单信息
型号
名称
PCF8574T PCF8574AT
SO16
4. 功能框图
封装 描述
塑料小型表面封装
1
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925
图 6 PCF8574 和 PCF8574A 的从地址
图 7 写模式 输出
4
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925
图 8 读模式 输入 中断 见图 9 10 PCF8574 提供一个可以连接到 MCU 对应输入端的开漏输出口 INT 这样可使 PCF8574 能够启 动系统中另外一处的动作 在输入模式中 口输入信号的上升或下降沿产生中断 在时间 tiv 之后 INT 有效 当口数据变为初始值或产生中断端口的数据写入/读出时 中断电路复位并重新激活 在下列条件 下发生复位 读模式中 SCL 信号上升沿之后的应答位 写模式中 SCL 信号从高到低的跳变之后的应答位 应答时钟脉冲期间的中断复位可能会导致中断的丢失 中断复位后 I/O 口的每个变化都会被检测 并在下一个时钟上升沿作为 INT 发送 对另一个器件 的读写不影响中断电路

ATmega16单片读取PCF8574键盘扩展并串行在12864液晶显示

ATmega16单片读取PCF8574键盘扩展并串行在12864液晶显示

ATmega16单片机扩展键盘输入口,使用PCF8574芯片,在调试过程中一定要注意读取和写入的寄存器,不管买的是PCF8574A还是PCF8574,都试下0x70、0x71和0x40、0x41,我买的这个是PCF8574,按照厂商给的资料应该是访问0x40、0x41的,但是最后用的时候访问的是0X70和0X71,所以大家注意了,参考的时候,如果读取不对,立马进行更换。

#define F_CPU 1000000UL#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#define scl PC0#define scl_out DDRC|=_BV(scl)#define scl_in DDRC&=_~BV(scl)#define scl_1 PORTC|=_BV(scl)#define scl_0 PORTC&=~_BV(scl)#define sda PC1#define sda_out DDRC|=_BV(sda)#define sda_in DDRC&=~_BV(sda)#define sda_1 PORTC|=_BV(sda)#define sda_0 PORTC&=~_BV(sda)#define sda_read PINC&_BV(sda)unsigned int key_value=255;const unsigned char tabn[]={"0123456789"};/*串行写液晶12864*//*PB0,PB1,PB2分别对应CS,SID,和SCLK*//*对CS引脚进行定义与设置*/#define cs_out DDRB|=_BV(PB0)#define cs_in DDRB&=~_BV(PB0)#define cs_1 PORTB|=_BV(PB0)#define cs_0 PORTB&=~_BV(PB0)/*对sid引脚进行定义与设置*/#define sid_out DDRB|=_BV(PB1)#define sid_in DDRB&=~_BV(PB1)#define sid_1 PORTB|=_BV(PB1)#define sid_0 PORTB&=~_BV(PB1)#define sid_read PINB&_BV(PB1)/*对使能sclk引脚进行定义与设置*/#define sclk_out DDRB|=_BV(PB2)#define sclk_in DDRB&=~_BV(PB2)#define sclk_1 PORTB|=_BV(PB2)#define sclk_0 PORTB&=~_BV(PB2)/*向液晶写入一个字节的数据*/void write_byte(unsigned char byte){unsigned char i;sid_out; //数据引脚为输出模式for(i=0;i<8;i++){sclk_0;if(byte&0x80) //从高位开始往液晶中写入一个8位数据sid_1;elsesid_0;sclk_1;_delay_us(2); //出现一个下降沿sclk_0;byte=byte<<1;}}/*从12864液晶中读取一个字节的数据*/unsigned char read_byte(){unsigned char i,temp1=0,temp2=0;unsigned char date;sid_in; //数据引脚为输入模式for(i=0;i<8;i++) //从12864中读取高四位数据{sclk_0;sclk_1;_delay_us(2);sclk_0;temp1=temp1<<1;if(sid_read)temp1|=0x01;}for(i=0;i<8;i++) //从12864中读取低四位数据{sclk_0;sclk_1;_delay_us(2);sclk_0;temp2=temp2<<1;if(sid_read)temp2|=0x01;}sid_out; //数据引脚转为输出模式date=(temp1&0xf0)+((temp2&0xf0)>>4);return date;}/*液晶忙检测函数*/void check_busy(){do{write_byte(0xfc);}while(0x80&read_byte());}/*向液晶写命令*/void write_com(unsigned char addr){cs_1; //片选check_busy(); //检验是否忙write_byte(0xf8); //写入写命令_delay_us(1);write_byte(addr&0xf0); //写入命令的高四位_delay_us(1);write_byte((addr&0x0f)<<4); //写入命令的低四位cs_0; //片选关闭}/*向液晶写数据*/void write_date(unsigned char date){cs_1; //片选check_busy(); //检验是否忙write_byte(0xfa); //写入写数据_delay_us(1);write_byte(date&0xf0);//写入数据的高四位_delay_us(1);write_byte((date&0x0f)<<4); //写入数据的低四位cs_0; //片选关闭}/*初始化液晶函数*/void init_lcd(){DDRB|=0x07;PORTB&=0xf8;write_com(0x30);_delay_us(20);write_com(0x0c);_delay_us(10);write_com(0x01);_delay_us(10);write_com(0x06);_delay_us(10);}/*向LCD写入一个字符串*/void write_string(const unsigned char *s){while(*s>0) //写入一串字符{write_date(*s);s++;_delay_us(1);}_delay_ms(1);}/*向LCD某个地址写入一个字符串*/void write_addstr(unsigned char add,const unsigned char *s ) {write_com(add); //找到地址while(*s>0) //写入一串字符{write_date(*s);s++;_delay_us(1);}}/*pcf8674开始信号*/void PCF8574_start(){sda_out;sda_1;scl_1;_delay_us(5);sda_0;_delay_us(5);scl_0;}/*PCF8574停止信号*/void PCF8574_stop(){sda_out;sda_0;scl_1;_delay_us(5);sda_1;_delay_us(5);}/*初始化PCF8574*/void init_8574(){scl_out;sda_out;scl_0;sda_0;}/*PCF8574发送应答信息*/ void send_ack(unsigned char ack) {sda_out;if(ack==1)sda_1;elsesda_0;scl_1;_delay_us(5);scl_0;_delay_us(5);}/*接收应答信息*/unsigned char revieve_ack() {unsigned char i;scl_1;_delay_us(5);sda_in;if(sda_read)i=1;elsei=0;scl_0;_delay_us(5);return i;}/*向PCF8574写一个字节的数据*/void write_iic(unsigned char date){unsigned char i;sda_out;for(i=0x80;i>0;i>>=1){if(i&date)sda_1;elsesda_0;scl_1;_delay_us(5);scl_0;}revieve_ack();}/*接收来自PCF8574中的一个字节数据*/ unsigned char receive_iic(){unsigned char i,date=0;sda_out;sda_1;sda_in;for(i=0x80;i>0;i>>=1){scl_1;if(sda_read)date|=i;scl_0;}return date;}/*向pcf8574输出一个八位数据*/void write_pcf8574(unsigned char reg_add) {PCF8574_start();write_iic(0x70);write_iic(reg_add);PCF8574_stop();}/*读取PCF8574读取八位数据*/unsigned char recieve_pcf8574(){unsigned int temp;PCF8574_start();write_iic(0x71);temp=receive_iic();PCF8574_stop();_delay_ms(10);return temp;}void display_keyscan(unsigned int key){write_com(0x82);write_date(tabn[((key%1000)/100)%10]);write_date(tabn[((key%100)/10)%10]);write_date(tabn[key%10]);}void init_interrupt(){MCUCR=0x02;GICR=0x40;SREG=0x80;}int main(){init_8574(); //初始化键盘扩展8574init_lcd(); //初始化液晶显示_delay_ms(100);write_com(0x01);init_interrupt(); //初始化中断变量,并开启外部中断_delay_ms(100);while(1){display_keyscan(key_value);_delay_ms(50); //延时}}//中断服务程序ISR(INT0_vect){unsigned int key_no;SREG=0x00; //关中断key_no=recieve_pcf8574(); //获取键盘值if(key_no!=255) //如果按下键盘,key_value=key_no; //获得按键值SREG=0x80; //重新开中断}。

单片机IO口扩展(一)2024

单片机IO口扩展(一)2024

单片机IO口扩展(一)引言概述:在嵌入式系统设计中,单片机的IO口数量通常是有限的,这限制了我们对外部设备的连接和控制。

为了解决这一问题,我们可以通过扩展单片机的IO口数量来满足实际应用需求。

本文将介绍单片机IO口扩展的第一部分,包括外部设备选择、驱动芯片选型和IO 口扩展电路设计等方面。

正文:1. 外部设备选择- 根据实际需求确定需要连接和控制的外部设备,如LED灯、按键、数码管等。

- 考虑外部设备的电压、电流、接口类型等因素,选择合适的外部设备。

2. 驱动芯片选型- 根据外部设备的特性和单片机的IO口电流输出能力,选择合适的驱动芯片。

- 考虑驱动芯片的工作电压、电流、IO口数量等因素,以及其与单片机之间的通信接口,如I2C、SPI等。

3. IO口扩展电路设计- 根据选定的驱动芯片和外部设备的接口类型,设计IO口扩展电路。

- 确定IO口扩展的连接方式,如并行连接、串行连接等。

- 根据电路的功能需求,设计合适的电路板布局和元件连接方式。

4. IO口扩展程序设计- 根据扩展IO口的功能需求,编写相应的程序代码。

- 设置单片机的IO口模式和功能,以及与驱动芯片之间的通信方式。

- 实现与外部设备的数据传输和控制。

5. IO口扩展的测试与调试- 对已完成的IO口扩展电路进行测试,检查电路连接是否正常、IO口控制是否准确。

- 对程序进行测试,确保IO口扩展功能能够正常工作。

- 如有问题,进行调试和优化,直至IO口扩展功能正常工作。

总结:本文介绍了单片机IO口扩展的相关内容,包括外部设备选择、驱动芯片选型、IO口扩展电路设计、程序设计和测试与调试等方面。

通过扩展IO口数量,我们可以实现更多的外部设备连接和控制,满足实际应用需求。

在实际应用中,我们还需根据具体情况进行系统的需求分析和设计,以及进一步优化和调试,以确保IO口扩展功能的稳定性和可靠性。

用两片I_2C总线接口通用器件PCF8574扩展的8_8键盘

用两片I_2C总线接口通用器件PCF8574扩展的8_8键盘
( 二) I2C 中断服务程序 I2C 中断后 ,即执行状态处理的散转程序转向相 应的状态处理程序 。因 I2C 中断只有 1 个 ,而状态处 理程序的入口地址多达 26 个 ,所以采用子程序返回 。
SIDA T (DA H)
D7 D6 D5 D4 D3 D2 D1 D0 SD7 SD6 SD5 SD4 SD3 SD2 SD1 SD0
它为串行输入输出结构的核心部分 ,用来存放一
个发送的数据字节或刚收到的一个数据字节 。
的编址方法 ,避免了片选线的连接方法 。 5. 所有带 I2C 总线接口的外围器件都具有应答功
(单片机 、微处理器等) 、外围器件等都连到同名端的
SIADR (DB H)
D7 D6 D5 D4 D3 D2 D1 D0 × × × × × × × GC
自己从地址
SDA (串行数据线) 、SCL (串行时钟线) 上 ,并通过这两 根线在器件之间传送信息 。
2. 系统中 有 多 个 主 器 件 时 , 任 何 一 个 主 器 件 在 I2C 上工作时都可成为主控制器 (无中心主机) 。
RET
;状态处理程序高、低位地址进入 PC
( 三) I2C 总线初始化及通用读写子程序
D7 D6 D5 D4 D3 D2 D1 D0
一般情况下 ,可把 I2C 总线的初始化和通用读写
0100 器件地址
× × × R/ W 引脚地址
子程序合写为一个包括 I2C 总线初始化的通用读写子 程序 。使用时只需满足通用读写子程序的入口条件 , 直接调用通用读写子程序 ,就可完成包括启动 I2C 总
I2C 总线 的 状 态 产 生 开 始 信 号 或 重 复 开 始 信 号 ; 当 STA = 0 时 ,SIO1 不产生开始信号或重复开始信号 。

i2c转ttl芯片

i2c转ttl芯片

I2C转TTL芯片是一种集成电路,用于将I2C(Inter-Integrated Circuit)信号转换为TTL(Transistor-Transistor Logic)信号。

这种转换通常需要在不同的电平和接口之间进行数据传输或通信。

一种常见的I2C转TTL芯片是PCF8574,它是一个8位I/O扩展器,可以将I2C 总线上的信号转换为TTL级别的信号。

PCF8574芯片有多个引脚,包括SDA(串行数据线)、SCL(串行时钟线)以及8个GPIO引脚。

通过连接适当的电平转换电路,可以将PCF8574的输出信号转换为TTL级别的信号。

使用I2C转TTL芯片的一个常见应用是与微控制器或单片机进行通信。

通过将I2C总线连接到I2C转TTL芯片的引脚上,然后将TTL级别的信号连接到目标微控制器的引脚上,可以实现两者之间的通信。

需要注意的是,选择适当的I2C转TTL芯片取决于具体的应用需求和系统设计。

在选择芯片时,应考虑电气特性、工作电压、速度要求以及其他系统集成的因素。

建议参考相关的芯片规格表和应用说明来选择最合适的I2C转TTL芯片。

1。

单片机扩展电路(二)2024

单片机扩展电路(二)2024

单片机扩展电路(二)引言概述:在单片机应用中,扩展电路是必不可少的,它能够有效地提升单片机的功能和性能。

本文将介绍单片机扩展电路的设计原则和一些常用的扩展电路,旨在帮助读者更好地理解和应用单片机的扩展电路。

正文内容:一、IO扩展电路1. 使用74HC595芯片进行8位输出扩展2. 使用PCF8574芯片进行8位输入扩展3. 使用双向移位寄存器实现输入输出模式切换4. 使用IO扩展板实现大量IO口的扩展5. 使用IO扩展芯片实现I2C总线扩展二、ADC和DAC扩展电路1. 使用ADC0804芯片进行模拟量采集2. 使用MAX11615芯片进行多通道模拟量采集3. 使用DAC0832芯片进行模拟量输出4. 使用R-2R网络实现更高精度的模拟量输出5. 使用PWM信号和低通滤波器实现模拟量输出三、串口扩展电路1. 使用MAX232芯片进行RS232电平转换2. 使用USB转串口模块实现USB接口扩展3. 使用蓝牙模块实现无线串口扩展4. 使用WiFi模块实现无线串口扩展5. 使用以太网模块实现网络串口扩展四、定时器和计数器扩展电路1. 使用74HC161芯片进行多位计数2. 使用74HC4040芯片进行二进制计数3. 使用CD4541B芯片进行定时器功能扩展4. 使用定时器模块实现精确的时间测量5. 使用定时器和中断实现实时时钟功能五、存储器扩展电路1. 使用24CXX系列芯片进行I2C存储器扩展2. 使用AT24C256芯片进行大容量存储器扩展3. 使用SD卡进行存储器扩展4. 使用EEPROM芯片进行非易失性存储器扩展5. 使用Flash芯片进行可擦写存储器扩展总结:单片机扩展电路的设计具有很大的灵活性,可以根据具体应用需求选择不同的扩展电路。

本文对IO扩展电路、ADC和DAC扩展电路、串口扩展电路、定时器和计数器扩展电路以及存储器扩展电路进行了详细介绍,希望读者能够通过学习掌握单片机扩展电路的设计方法和应用技巧,为自己的项目开发提供更多的选择和可能性。

PCF8574调试的沉痛经历

PCF8574调试的沉痛经历

PCF8574调试的沉痛经历
最近一个超声项目需要用到端口扩展功能,经过一番调研,决定选用PCF8574 这款I2C 总线的芯片,然后开始看数据手册,组实验板,经过一番忙碌,材料齐全,准备开始调试,之前已经做好了I2C 的程序,烧入单片机,运行,状态不对?诧异,很是诧异,然后我就开始了我那冤屈的、痛苦的苦难之旅,为什么这么说,看官您请往下看。

开始我以为是程序中时序匹配的问题,于是开始用示波器查看,经过一番查找,最后确定时序没问题,开始郁闷。

然后我以为是硬件损坏,然后检查PCF8574,型号是PCF8574T,没错,然后在数据手册中曾看到中断是自动响应的,然后我就在输出管脚上加逻辑电平,高低,高低,高高低低,反复测试后,最后确认,芯片的中断脚是有输出的,说明芯片应该或者说基本是好的,没坏,然后对程序进行了简单修改,测试,当满怀信心的测试后发现,芯片还是没响应,情绪开始低落,很是郁闷。

为了确认芯片的好坏,我在这之后还是决定不管三七二十几,换芯片!
!!然后准备烙铁、工具等,焊下原有芯片(在焊下的一瞬间,脑子里飞快的闪过一念头,坏的扔了得了,但是抬头一看老板在,马上作出了违背我良心的决定,保存!!!鄙视我一次),装上新的芯片,清理工作台,重新测试,老
状况,老现象,崩溃!!!!
于是我就开始疯狂的修改程序,加延时,测试,不行;加逻辑,测试、不行;加协议代码,测试,不行;单字节通信,测试,不行;多字节通信,不行;只读,测试,不行;只写,测试,不行,这时候我感觉我自己要崩溃了,程序作了这么多年,硬件调了那么多次,难不成今天我黑腿哥要将一世英名丢在此吗?不行,重来,将上面的过程重复一便,还是不行,崩溃了,感觉被打败了!!!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
_nop_();
}
//******************************************
void Write_A_Byte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
//*****************延时************************
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
_nop_();
}
void delay_nms(unsigned int n) //N ms延时函数
delay_nms(1000);
Write_Random_Address_Byte(0x27,0xf7);
delay_nms(1000);
Write_Random_Address_Byte(0x27,0xef);
delay_nms(1000);
Write_Random_Address_Byte(0x27,0xdf);
{
while(1)
{
Write_Random_Address_Byte(0x27,0xfe);
delay_nms(1000);
Write_Random_Address_Byte(0x27,0xfd);
delay_nms(1000);
Write_Random_Address_Byte(0x27,0xfb);
{
Start(); //启动总线
Write_A_Byte(add<<1|0); //发送器件地址
if(ack==0)return(0);
Write_A_Byte(dat); //发送数据
if(ack==0)return(0);
Stop(); //结束总线
return(1);
}
void main(void)
void Start()
{
SDA=1;
_nop_();
SCL=1;
nop4();
SDA=0;
nop4();
SCL=0;
_nop_();
_nop_();
}
void Stop()
{
SDA=0p4();//>4us后SCL跳变
SCL=1;
nop4();
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
if(SDA==1)ack=0;
elseack=1; //判断是否接收到应答信号
SCL=0;
_nop_();
_nop_();
}
bit Write_Random_Address_Byte(unsigned char add,unsigned char dat)
delay_nms(1000);
Write_Random_Address_Byte(0x27,0xbf);
delay_nms(1000);
Write_Random_Address_Byte(0x27,0x7f);
delay_nms(1000);
}
}
{
unsigned int i,j;
for (i=0;i<n;i++)
for (j=0;j<1140;j++);
}
void nop4()
{
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
}
//***************************************
{
if((c<<BitCnt)&0x80) SDA=1; //判断发送位
else SDA=0;
_nop_();
SCL=1; //置时钟线为高,通知被控器开始接收数据位
nop4();
_nop_();
SCL=0;
}
_nop_();
_nop_();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_nop_();
用PCF8574扩展单片机IO口
用PCF8574做流水灯
#include <reg52.h>
#include <intrins.h>
sbit SCL = P1^5;
sbit SDA = P1^4;
bit ack;
unsigned char LCD_data=0x08;
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
相关文档
最新文档