模拟IIC通信(没有用应答)
#include<reg52.h>#include <INTRINS.H>typedef unsigned char uint8;typedef unsigned int uint16;sbit SCL = P3^7;sbit SDA = P3^6;void delay(){_nop_();_nop_();_nop_();_nop_();//用_nop_()需要用INTRINS.H}void IIC_init(){ SDA=1; SCL=1;}void IIC_start(){ SCL=0; delay(); SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; delay();}void IIC_stop(){ SCL=0; delay(); SDA=0; delay(); SCL=1; delay(); SDA=1; delay();}void IIC_send(uint8 byte){ uint8 mask,i,j; mask=0x80; for(i=0;i<8;i++) { SCL=0;delay();if((mask&&byte)==0) SDA=0; else SDA=1;delay();mask>>=1;SCL=1;delay(); } SCL=0; delay(); SDA=1; delay(); SCL=1; delay(); j=SDA; SCL=0; delay();}uint8 IIC_read(){ uint8 byte,i; byte=0; for(i=0;i<8;i++) { SCL=0; delay(); SDA=1; delay(); SCL=1; delay(); if(SDA==1) { byte|=0x01; } byte<<=1; } SCL=0; delay(); SDA=1; delay(); SCL=1; delay();; SCL=0; delay(); return byte;}void write(uint8 addr,uint8 datebyte){ IIC_start(); IIC_send(0xa0); IIC_send(addr); IIC_send(datebyte); IIC_stop();}uint8 read(uint8 addr){ uint8 datebyte; IIC_start(); IIC_send(0xa0); IIC_send(addr); IIC_start(); IIC_send(0xa1); datebyte=IIC_read(); IIC_stop(); return datebyte;}void UART_init(void){SCON = 0x50;TMOD = 0x20;TH1 = 0xFD;TL1 = 0xFD;TR1 = 1;//ES = 1;//EA = 1;}void UART_send_byte(uint8 dat){SBUF = dat;while(!TI);TI = 0;}main(){uint8 addr = 0x00, databyte = 0x11;uint8 c = 0;uint16 i;UART_init();IIC_init();while(1){write(addr, databyte);for(i = 0; i < 1000; i++){delay();}c = read(addr);UART_send_byte(c);addr++; //地址往下加databyte++;if(addr == 0xff) {addr = 0;}if(databyte == 0xff) {databyte = 0;}for(i = 0; i < 1000; i++){delay();} }}
代码不理解的欢迎留言