《I2C总线读写程序通用.doc》由会员分享,可在线阅读,更多相关《I2C总线读写程序通用.doc(4页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、/=头文件加载=#include /加载52系列单片机头文件/=端口声明=sbit CLK=P36; /74hc574时钟信号线sbit G=P24; /74hc574使能sbit IIC_SDA=P26; /声明IIC总线的数据线接在单片机的P2.5端口。sbit IIC_SCL=P25; /声明IIC总线的时钟线接在单片机的P2.7端口。unsigned char tabl=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0BF,0x8C;/0,1,2,3,4,5,6,7,8,9,-,P/=函数声明=void display(unsi
2、gned char aa);void delay(unsigned int t);void delay_IIC(void);void IIC_Init(void);void IIC_start(void);void IIC_stop(void);bit IIC_Tack(void);void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data);unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Wa
3、ddr);void IIC_write_byte(unsigned char Data);unsigned char IIC_read_byte(void);/=主函数=void main() /主函数unsigned char Data=2,addr=0x01; /-系统初始化- IIC_Init();/初始化IIC总线。 /P1=0x7f;/LED8先亮。 while(1) /死循环 IIC_single_byte_write(0xa0,0x02,Data);/保存LED的状态 delay(50000);/延时约0.5S Data=IIC_single_byte_read(0xa0,0x0
4、2);/读出LED的状态if(Data10)Data+;elseData=0;display(Data);delay(50000);/延时约0.5S /=功能子函数=void delay(unsigned int t)/延时函数 while(t)t-; /延时循环计数/-void delay_IIC(void) /IIC总线限速延时函数。/该函数是空函数,延时4个机器周期。;/-void IIC_Init(void)/IIC总线初始化函数 IIC_SDA=1;/释放IIC总线的数据线。 IIC_SCL=1;/释放IIC总线的时钟线。/-void IIC_start(void)/IIC总线产生起
5、始信号函数 IIC_SDA=1;/拉高数据线 IIC_SCL=1;/拉高时钟线 delay_IIC(); IIC_SDA=0;/在时钟线为高电平时,拉低数据线,产生起始信号。 delay_IIC(); IIC_SCL=0;/拉低时钟线/-void IIC_stop(void) /IIC总线产生停止信号函数 IIC_SDA=0;/拉低数据线 delay_IIC(); IIC_SCL=1;/拉高时钟线。 delay_IIC(); IIC_SDA=1;/时钟时线为高电平时,拉高数据线,产生停止信号。 delay_IIC();/-bit IIC_Tack(void)/接收应答信号函数 bit ack;
6、/定义一个位变量,来暂存应答状态。 IIC_SDA=1;/释放数据总线,准备接收应答信号。 delay_IIC(); IIC_SCL=1;/拉高时钟线。 delay_IIC(); ack=IIC_SDA;/读取应答信号的状态。 delay_IIC(); IIC_SCL=0;/拉低时钟线。 delay_IIC(); return ack;/返回应答信号的状态,0表示应答,1表示非应答。/-void IIC_write_byte(unsigned char Data)/向IIC总线写入一个字节的数据函数 unsigned char i; for(i=0;i8;i+)/有8位数据 IIC_SDA=D
7、ata&0x80;/写最高位的数据 delay_IIC(); IIC_SCL=1; /拉高时钟线,将数写入到设备中。 delay_IIC(); IIC_SCL=0;/拉低时钟线,允许改变数据线的状态 delay_IIC(); Data=Data1;/数据左移一位,把次高位放在最高位,为写入次高位做准备 /-unsigned char IIC_read_byte()/从IIC总线读取一个字节的数据函数 unsigned char i; unsigned char Data; /定义一个缓冲寄存器。 for(i=0;i8;i+)/有8位数据 IIC_SCL=1;/拉高时钟线,为读取下一位数据做准备
8、。 delay_IIC(); Data=Data1;/将缓冲字节的数据左移一位,准备读取数据。 delay_IIC(); if(IIC_SDA)/如果数据线为高平电平。 Data=Data|0x1;/则给缓冲字节的最低位写1。 IIC_SCL=0;/拉低时钟线,为读取下一位数据做准备。 delay_IIC(); return Data;/返回读取的一个字节数据。/-void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data)/向任意地址写入一个字节数据函数 IIC_start();/
9、产生起始信号 IIC_write_byte(Daddr);/写入设备地址(写) IIC_Tack();/等待设备的应答 IIC_write_byte(Waddr);/写入要操作的单元地址。 IIC_Tack();/等待设备的应答。 IIC_write_byte(Data);/写入数据。 IIC_Tack();/等待设备的应答。 IIC_stop();/产生停止符号。/-unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr)/从任意地址读取一个字节数据函数 unsigned char Data;/定义
10、一个缓冲寄存器。 IIC_start();/产生起始信号 IIC_write_byte(Daddr);/写入设备地址(写) IIC_Tack();/等待设备的应答 IIC_write_byte(Waddr);/写入要操作的单元地址。 IIC_Tack();/等待设备的应答。 IIC_start();/产生起始信号 IIC_write_byte(Daddr+1);/写入设备地址(读)。 IIC_Tack();/等待设备的应答。 Data=IIC_read_byte();/写入数据。 IIC_stop();/产生停止符号。 /-返回读取的数据- return Data;/返回读取的一个字节数据。/-void display(unsigned char aa)P2=0xf0; G=0; /74hc574使能CLK=0; /n产生上升沿,数据写入74hc574P0=tablaa;/n给数码CLK=1; /=