C51进行I²C通信

来源:互联网 发布:俞兆林内裤怎么样知乎 编辑:程序博客网 时间:2024/06/10 08:05

I²C(Inter IC Bus)是由 Philips 推出的数据总线协议。

#include <reg52.h>void display(unsigned int n){unsigned char i;char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};P2 = 0 << 2;P0 = table[n%10];for (i=0;i<25;i++);P0 = 0;P2 = 1 << 2;P0 = table[n/10%10];for (i=0;i<25;i++);P0 = 0;P2 = 2 << 2;P0 = table[n/100%10];for (i=0;i<25;i++);P0 = 0;P2 = 3 << 2;P0 = table[n/1000%10];for (i=0;i<25;i++);P0 = 0;}// IIC bussbit SCL=P2^1;sbit SDA=P2^0;// 4 keyssbit k1=P3^1;sbit k2=P3^0;sbit k3=P3^2;sbit k4=P3^3;void delay(unsigned int i){while(i--);}void I2cStart(){SDA = 1;delay(5);SCL = 1;delay(5);SDA = 0;delay(5);}void I2cStop(){SDA = 0;delay(5);SCL = 1;delay(5);SDA = 1;}void I2cSendByte(unsigned char n){signed char i;for (i=7;i>=0;i--){SCL = 0;delay(5);SDA = 0x01 & (n>>i);delay(5);SCL = 1;delay(5);}SCL = 0;delay(5);SDA = 1;delay(5);SCL = 1;delay(5);while((SDA==1)&&(i++<255));SCL = 0;delay(5);}unsigned char I2cReadByte(){unsigned char i,k;SCL = 0;delay(5);SDA = 1;delay(5);for (i = 0; i < 8; ++i){SCL = 1;delay(5);k <<= 1;k|= SDA;SCL = 0;delay(5);}delay(5);return k;}int main(){unsigned char num=0;while (1){if(k1==0){delay(1000);if(k1==0){I2cStart();I2cSendByte(0xa0);// set chipI2cSendByte(1);// set address 1I2cSendByte(num);// set valueI2cStop();}while(!k1);} else if(k2==0) {delay(1000);if(k2==0){I2cStart();I2cSendByte(0xa0);// set chip 0xa0I2cSendByte(1);// set address 1I2cStart();I2cSendByte(0xa1);// set chip 0xa1num=I2cReadByte();// read byteI2cStop();}while(!k2);} else if(k3==0) {delay(1000);if(k3==0)num++;// add 1while(!k3);} else if(k4==0) {delay(1000);if(k4==0)num=0;// set 0while(!k4);}display(num);}return 0;}

aaa

原创粉丝点击