主机
#include "Timer.h" //添加定时器库函数
#include <Wire.h> //添加IIC通信库函数
int pin = 13; //定义LED引脚
int flag=0,count=0; //定义计数变量
byte LEDflag=0;
byte x=0; //定义IIC接收状态
volatile int state = LOW; //LED状态
Timer t; //创建一个Timer对象
void setup() //初始化函数
{
Serial.begin(9600); //定义串口波特率
Wire.begin(); //开始IIC通信
pinMode(pin, OUTPUT); //定义脚输出模式
attachInterrupt(0, blink, FALLING); //中断定义
// t.oscillate(pin, 100, LOW);
t.every(1000, takeReading); //定时器定义
delay(500);
Wire.requestFrom(3, 1); //通知3号从机上传1个字节(其实是主机)
}
void loop() //程序无限循环函数
{
if(flag==1){ //中断标志判断
flag=0;
x=1;
Wire.beginTransmission(3); //IIC数据发送
Wire.write(x); //发送内容
Wire.endTransmission(); //停止发送
}
LEDflag=Wire.read();
if(LEDflag==5){
t.update(); //定时器更新函数
LEDflag=4;
}
if(LEDflag!=5){
t.update(); //定时器更新函数
}
}
void takeReading() //定时器中断函数
{
count++;
if(count==10){ //判断是否到达10秒钟
count=0; //计数清零
state=~state;
digitalWrite(pin,state); //LED状态改变
}
}
void blink() //外部中断函数
{
flag++;
}
从机
#include <Wire.h> //添加IIC库函数
int LED=13; //定义LED引脚
int x=0; //数据接收标志
void setup() //初始化函数
{
Wire.begin(3); //IIC定义,开始
Wire.onReceive(receiveEvent); //注册两个事件
Wire.onRequest(requestEvent);
pinMode(LED,OUTPUT); //定义输出模式
// Serial.begin(9600); //测试用
}
void loop() //无限循环
{
if(x==1){ //IIC数据判断后执行相应操作
digitalWrite(LED,HIGH);
delay(3000); //灯亮3秒后灭掉
digitalWrite(LED,LOW);
x=0; //数据清零
}
}
void receiveEvent(int howMany) //接收数据事件回调函数
{
x = Wire.read(); //读取IIC数据
// Serial.println(x);
}
void requestEvent() //数据请求回调函数
{
Wire.write(5); //IIC数据发送
}
|