nbhkdz.com冰点文库

基于51单片机的IIC总线控制程序

时间:2011-10-18


////////////////////////////////////////////////////////////////////////////////// //函数功能:void iic_start() 启动信号 // void iic_stop(void) 停止信号 // void iic_check_answer() 应答信号 // void iic_write_byte(uchar dat) 写字节函数 // void iic_write_n_byte(uchar *buffer,uchar n) 写 n 个字节函数 // void iic_write_at_addr(uchar addr,uchar dat) 指定地址写字节函数 // uchar iic_read_byte(void) 读字节函数 // // uchar iic_read_at_addr(uchar addr) 读指定地址字节 ///////////////////////////////////////////////////////////////////////////////////

#ifndef __iic_H__ #define __iic_H__

sbit scl=P1^0; sbit sda=P1^1;

//延时 4us@12mhz void delay_iic() { ;;; }

//启动 iic 总线的函数,当 scl 为高电平时使 sda 产生一个负跳变 void iic_start(void) { sda=1; delay_iic(); scl=1; delay_iic(); sda=0; delay_iic(); }

//终止 iic 总线,当 scl 为高电平时使 sda 产生一个正跳变 void iic_stop(void) { sda=0;

delay_iic(); scl=1; delay_iic(); sda=1; delay_iic(); }

//发送完一个字节后检验设备的应答信号 void iic_check_answer() { uchar i; scl=1; delay_iic(); while((sda==1) && (i<250)) i++; scl=0; delay_iic(); }

//向 iic 总线写一个字节 void iic_write_byte(uchar dat) { uchar i,temp; temp=dat; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay_iic(); sda=CY; delay_iic(); scl=1; delay_iic(); } scl=0; delay_iic(); sda=1; delay_iic(); }

//向 I2C 总线写 n 个字节 void iic_write_n_byte(uchar *buffer,uchar n) { uchar i; iic_start(); for(i=0;i<n;i++) { iic_write_byte(buffer[i]); } iic_stop(); }

//向芯片的指定地址,写入字节 void iic_write_at_addr(uchar addr,uchar dat) { iic_start(); //设定地址,AT24C02 固定地址为 1010,再加上 设定的地址, iic_write_byte(0xa0); //最后一位表示读或写,0 表示写,所以为 1010 0000,即 0xa0 iic_check_answer(); //等待芯片应答 iic_write_byte(addr); //设置要写入数据的地址 iic_check_answer(); //等待芯片应答 iic_write_byte(dat); //写入要保存的数据 iic_check_answer(); //等待芯片应答 iic_stop(); } //从 I2C 总线读一个字节 uchar iic_read_byte(void) { uchar i,k; scl=0; delay_iic(); sda=1; delay_iic(); for(i=0; i<8; i++) { scl=1; delay_iic();

k =(k<<1)|sda; scl=0; delay_iic(); } return k; }

/*//从 I2C 总线读 n 个字节 bit iic_read_n_byte(uchar SlaveAdr,uchar n,uchar *buffer) { uchar i; iic_start(); Write_byte(SlaveAdr); //向总线发送接收器地址 if(!check_answer()) //等待接收器应答信号 return 0; for(i=0;i<n;i++) { buffer[i]=READ_byte(); if(i!=n) SEND_0(); //发送应答 else SEND_1(); //发送非应答 } iic_stop(); return 1; } */ //读取芯片指定地址的数据 uchar iic_read_at_addr(uchar addr) { uchar dat; iic_start(); iic_write_byte(0xa0);//向芯片发送一个写操作信号 iic_check_answer(); iic_write_byte(addr);//设置要读取的地址 iic_check_answer(); iic_start(); iic_write_byte(0xa1);//向芯片发送一个读操作信号 iic_check_answer(); dat=iic_read_byte(); iic_stop(); return dat; }

#endif


赞助商链接

51单片机的模拟IIC总线程序

51单片机的模拟IIC总线程序 - #include <reg764.h> #include <intrins.h> #define #define #define /*头文件的包含*/ u...

51单片机IIC总线操作及24c02指定地址的读写

51 单片机 IIC 总线操作及 24c02 指定地址的读写 (单片机用 STC89C58RD+) //24c02 数据读写操作。程序实现每一秒钟往 24c02 的指定地址内写入数据(既每...

51单片机IIC程序

标签: 信息通信| 单片机| 程序|51单片机IIC程序_信息与通信_工程科技_专业资料。基于51单片机的IIC通信程序,其中IIC协议实现是通过单片机模拟时序完成 ...

51单片机IO口模拟IIC总线协议

编写程序使用 AT89C51 的 IO 口模拟实现 IIC 总线协议进行通信, 并向 24C02 存储器内从字节 0 到字节 FF 写入数字 0 到 FF。 51 系列单片机本身没有 IIC...

51单片机模拟iic总线协议使用EEPROM器件AT24C02

51单片机模拟iic总线协议使用EEPROM器件AT24C02_电子/电路_工程科技_专业资料。51单片机以软件实现IIC工作时序基础51 单片机软件实现 iic 总线的工作时序所用 EEPROM ...

L3G4200D 51单片机IIC 测试程序

L3G4200D 51单片机IIC 测试程序 - //这是 L3G4200D 51 单片机 IIC 测试程序 //这是 1602 头文件 保存为 1602.h #define DataPort...

51单片机IO口线模拟IIC总线3部曲之第3部

51单片机IO口线模拟IIC总线3部曲之第3部 - 51 单片机 IO 口线模拟 IIC 总线 3 部曲之第 3 部.txt12 思念是一首诗,让你在普通的日子里 读出韵律来;思念...

基于PIC单片机的IIC功能例程

基于PIC单片机的IIC功能例程_信息与通信_工程科技_...下面是该例子的 C 语言程序。 #include <pic.h>...51单片机模拟iic总线协议... 暂无评价 5页 免费 ...

单片机课程设计-IIC总线式EEPROM存储器应用设计

28 1 IIC 总线式 EEPROM 存储器应用设计 1 设计要求利用 51 单片机和 IIC ...Y 下一步操作 图 6.2 确认查询流程图 11 启动 IIC 总线 发送控制字节 N ...

单片机做iic从机

单片机做 iic 从机 2009-03-05 15:22 为启动从机接收模式, TWAR 与 TWCR...单片机IIC通信 11页 1下载券 基于51单片机的IIC总线控... 5页 2下载券 ©...