No.54440 作者:koji 邮件:deungxu0740@sina.com ID:44787 登陆:9次 文章数:5篇 最后登陆IP:116.24.163.55 最后登陆:2009/7/19 21:47:58 注册:2005/12/20 14:03:47 财富:131 发帖时间:2009/3/2 22:29:47 发贴者IP:116.24.84.126 标题:koji:24C01读写问题[求助] 摘要:No.5444024C01读写问题[求助] //-----------------------函数声明,变量定义-------------------------------------------------------- #include <reg51.h> #include <intrins.h> sbit SDA=P1^0; // 将p1.0口模拟数据口 sbit SCL=P1^1; // 将p1.1口模拟时钟口 #define NUM 8 // 接收和发送缓存区的深度 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; unsigned char idata sendbuf[NUM]; // 数据发送缓冲区 unsigned char idata receivebuf[NUM]; // 数据接收缓冲区 bit bdata SystemError; // 从机错误标志位 //-------------------------------------------------------------------------------------------------- // 函数名称: iic_start() // 函数功能: 启动I2C总线子程序 //-------------------------------------------------------------------------------------------------- void iic_start(void) { EA=0; //时钟保持高,数据线从高到低一次跳变,I2C通信开始 SDA = 1; SCL = 1; delayNOP(); // 延时5us SDA = 0; delayNOP(); SCL = 0; } //-------------------------------------------------------------------------------------------------- // 函数名称: iic_stop() // 函数功能: 停止I2C总线数据传送子程序 //-------------------------------------------------------------------------------------------------- void iic_stop(void) { SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止 SCL = 1; delayNOP(); SDA = 1; delayNOP(); SCL = 0; } //-------------------------------------------------------------------------------------------------- // 函数名称: slave_ACK // 函数功能: 从机发送应答位子程序 //-------------------------------------------------------------------------------------------------- void slave_ACK(void) { SDA = 0; SCL = 1; delayNOP(); SDA = 1; SCL = 0; } //-------------------------------------------------------------------------------------------------- // 函数名称: slave_NOACK // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束 //-------------------------------------------------------------------------------------------------- void slave_NOACK(void) { SDA = 1; SCL = 1; delayNOP(); SDA = 0; SCL = 0; } //-------------------------------------------------------------------------------------------------- // 函数名称: check_ACK // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束 //-------------------------------------------------------------------------------------------------- void check_ACK(void) { SDA = 1; // 将p1.0设置成输入,必须先向端口写1 SCL = 1; F0 = 0; if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0 F0 = 1; SCL = 0; } //-------------------------------------------------------------------------------------------------- // 函数名称: IICSendByte // 入口参数: ch // 函数功能: 发送一个字节 //-------------------------------------------------------------------------------------------------- void IICSendByte(unsigned char ch) { unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位 while(n--) { if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 { SDA = 1; // 传送位1 SCL = 1; delayNOP(); SDA = 0; SCL = 0; } else { SDA = 0; // 否则传送位0 SCL ......
>>返回讨论的主题
|