预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

#include"main.h" #include"iic.h" voiddelay1ms500us(void)//误差-0.434027777778us { unsignedchara,b; for(b=153;b>0;b--) for(a=3;a>0;a--); } //延时函数 voiddelay(void)//误差-0.659722222222us { } //IIC通信起始信号 voidiic_start(void) { SCL=1; delay(); SDA=1; delay(); SDA=0; delay(); SCL=0; } //IIC通信结束信号 voidiic_stop(void) { SCL=0; delay(); SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } //应答位读取函数 //返回0:应答位ACK=0 //返回1:非应答位NACK=1 bitread_ack(void) { SDA=1; delay(); SCL=1; delay(); if(SDA) { SCL=0; iic_stop(); return1; } else { SCL=0; return0; } } //主机发送应答信号 //ack=0:发送应答位0 //ack=1:发送非应答1 voidsend_ack(bitack) { if(ack) SDA=1; else SDA=0; delay(); SCL=1; delay(); SCL=0; delay(); SDA=1; delay(); } //IIC总线发送一个8位数据 voidiic_sendbyte(uint8dat) { uint8i; for(i=0;i<8;i++) { if(dat&0x80) SDA=1; else SDA=0; dat<<=1; delay(); SCL=1; delay(); SCL=0; } } //IIC总线接收一个8位数据 //返回读取的8位数据 uint8iic_receivebyte(void) { uint8i,byte=0; for(i=0;i<8;i++) { SCL=1; delay(); byte<<=1; if(SDA) byte|=0x01; delay(); SCL=0; delay(); } returnbyte; } /*voidh() { ENLED=0; ADDR3=0; ADDR0=0; ADDR1=0; ADDR2=0; P0=0xfe; }*/ //向eeprom指定地址写入一个8位数据 //addr:数据在eeprom中的存储地址 //dat:要发送的数据 bitiic_writebyte(uint8addr,uint8dat) { iic_start(); iic_sendbyte(CONTROL); if(read_ack())return1; iic_sendbyte(addr); if(read_ack())return1; iic_sendbyte(dat); if(read_ack())return1; iic_stop(); delay1ms500us(); return0; } //从eeprom指定地址读取一个8位数据 //addr:要读取的数据在eeprom中的存储地址 //dat:读出数据存储在dat中 bitiic_readbyte(uint8addr,uint8*dat) { iic_start(); iic_sendbyte(CONTROL); if(read_ack())return1; iic_sendbyte(addr); if(read_ack())return1; iic_start(); iic_sendbyte(CONTROL+1); if(read_ack())return1; *dat=iic_receivebyte(); send_ack(1); iic_stop(); return0; } //向eeprom中连续的存储单元连续写入8位数据 //addr:数据在eeprom中的存储地址 //len:写入数据的个数 //buf:要写入数据的首地址 bitiic_writebuf(uint8*buf,uint8addr,uint8len) { while(len--) { if(iic_writebyte(addr+