我已经测试过,绝对可以用着子程序块调用.谢谢 注:程序是<<单片机高级语言C51WINGDOWS环境编程与应用>>里的例子. ======================================================= //************************************************************// //*文件名: 24c02的读写程序.C*/ /* 功能: 24c02的读写*/ /* 日期: 2005-03-04*/ /* 创建人: 何小小*/ //***********************************************************// #include <intrins.h> #include "AT89X52.h" #include <absacc.h> #define uchar unsigned char #define uint unsigned int #define DPORTP0 #define port3 P3 #define WRITE 0xa0 #define READ 0xa1 #define DATA_SIZE 11 #define HIGH 1 #define LOW 0 #define FALSE 0 #define TRUE1 sbit SCL = P1^6 ; sbit SDA = P1^7 ; //sbit key=P3^5; extern void I_start(void); extern void I_stop(void); extern void delaytime(void); extern void I_init(void); bit I_clock(void); bit I_send(uchar I_data); extern uchar I_receive(void); void I_ack(void); extern void wait_5(void) ; extern bit E_address(uchar address); extern bit E_read_block(uchar addr); extern bit E_write_block(uchar addr); extern uchar data buffe_data[DATA_SIZE] ; /*************************************************/ /*启动iic总线*/ /************************************************/ void I_start(void) { SCL=HIGH; delaytime(); SDA=LOW; delaytime(); SCL=LOW ; delaytime(); } /*************************************************/ /*停止iic总线*/ /************************************************/ void I_stop(void) { SDA=LOW; delaytime(); SCL=HIGH; delaytime(); SDA=HIGH; delaytime(); SCL=LOW ; delaytime(); } /**************************************************/ void delaytime(void) { _nop_() ; _nop_() ; _nop_() ; } /*************************************************/ /*初始化iic总线*/ /************************************************/ void I_init(void) { SCL=LOW; I_stop(); } /*************************************************/ /*iic总线 时钟信号用来 /*传输一位数据,并返回SDA的状态*/ /************************************************/ bit I_clock(void) { bit sample; SCL = HIGH; delaytime(); sample=SDA; SCL = LOW ; delaytime(); return(sample) ; } /*************************************************/ /*iic总线主机发送8位数据*/ /*并请求一个应答信号ACK.收到为1,否则为0*/ /************************************************/ bit I_send(uchar I_data) { register uchar i ; for(i=0;i<8;i++) { SDA=(bit)(I_data&0x80) ; I_data=I_data<<1 ; I_clock(); } SDA=HIGH; return(~I_clock()); } /*************************************************/ /*iic总线主机接收8位数据*/ /*不回送应答信号ACK.调用本函数之前保证SDA信号*/ /*处于浮置状态,即使P1.7=1*/ /************************************************/ uchar I_receive(void) { uchar I_data=0 ; register uchar i ; for(i=0;i<8 ;i++) { I_data *=2 ; if(I_clock()) I_data++; } return(I_data); } /*************************************************/ /*主机向iic总线应答信号ACK*/ /*一般用于连续数据读取时*/ /************************************************/ void I_ack(void) { SDA=LOW; I_clock(); SDA=HIGH; } /*************************************************/ /*提供5MS延时*/ /************************************************/ void wait_5(void) { register int i; for(i=0;i<1000;i++) ; } /*************************************************/ /*向24C02中写入24C02的器件地址和一个指定 /*的字节地址*/ /************************************************/ bit E_address(uchar address) { I_start(); if(I_send(WRITE)) return(I_send(address)); else return(FALSE) ; } /*************************************************/ /*从24C02中读取N个字节的数据并放在数组内 */ /*如果24C02不接受指定地址则返回0*/ /************************************************/ bit E_read_block(uchar addr) { register uchar i ; if(E_address(addr)) { I_start(); if(I_send(READ)) { for(i=0;i<=DATA_SIZE;i++) { buffe_data[i]=(I_receive()); if(i!=10) I_ack(); else { I_clock(); I_stop(); } } } return(TRUE); } else{ I_stop(); return(FALSE); } } /*************************************************/ /*把数组中的数据写入24C02中的头N个字节内*/ /*如果24C02不接受指定地址或者未收到应答则返回0 */ /************************************************/ bit E_write_block(uchar addr) { register uchar i; wait: for (i=addr;i<=(DATA_SIZE+addr);i++) { if(E_address(i)) { if(I_send(buffe_data[i])) { I_stop(); wait_5(); } else goto wait; } else return(FALSE); } 作者:hexiaoxiao 2005-5-30 15:18:00 |