西宁做网站的,免费网站模板psd,家里的电脑怎样做网站赚钱,产品推广文案本帖最后由 micro_听海 于 2012-11-24 19:58 编辑这几天一直在搞AVR的twi(twi就是i2c)双机通信程序#xff0c;使用的是两块arduino开发板。因为最总要这个通信程序最总是要放在winavr的编译环境中#xff0c;所以没有使用arduino自带的库函数。但是这没关系#xff0c;因为…本帖最后由 micro_听海 于 2012-11-24 19:58 编辑这几天一直在搞AVR的twi(twi就是i2c)双机通信程序使用的是两块arduino开发板。因为最总要这个通信程序最总是要放在winavr的编译环境中所以没有使用arduino自带的库函数。但是这没关系因为arduino IDE和winavr编译器的内核都是开源gcc所以在arduino ide上同样可以使用winavr的语言赞ARDUINO!硬件上就是arduino的SCL(A5引脚)和SDA(A4引脚)互联,当然还有GND。下面上程序先上发送端#define uchar unsigned char#define STATUS (TWSR0xf8)#define SLA_W 0x32#define SLA_R 0x33#define SLAVER_ADDRESS 0x32#define START 0x08#define RE_START 0x10#define MT_SLA_WRITE_ACK 0x18#define MT_SLA_READ_ACK 0x40#define MT_DATA_ACK 0x28#define MT_READ_ACK 0x58void Start(void)//主机向从机发送i2c起始信号{TWCR(1while(!(TWCR(1}void Stop(void)//主机发送i2c停止信号{TWCR(1}void Load(uchar i)//主机发送一个字节数据或地址{TWDRi;TWCR(1while(!(TWCR(1}uchar SendByte(uchar data)//主机以广播方式向从机发送一个字节数据data{Start();//开始Load(0);//发送广播地址0Load(data);//发送数据Stop();//停止return 1;//发送成功返回1}void Init_Io(void)//io口初始化函数{DDRC~((14)(15)(12));PORTC| (14)|(15)|(12);//使能sclsda引脚内部上拉电阻TWCR(1TWBR32;//波特率 200k}uchar temp;void setup( ){Init_Io();Serial.begin(9600);}void loop( ){for(temp0;temp10;temp){SendByte(temp); //向从机发送0到9的数据delay(8);}}接收端程序#define uchar unsigned char#define STATUS (TWSR0xf8)#define SLA_W 0x32#define SLA_R 0x33#define TWI_ADDRESS 0x32#define START 0x08#define RE_START 0x10#define MT_SLA_WRITE_ACK 0x18#define MT_SLA_READ_ACK 0x40#define MT_DATA_ACK 0x28#define MT_READ_ACK 0x58#define TW_SR_DATA_ACK 0x80void Init_Io(void){DDRC~((14)(15)(12));PORTC| (14)|(15)|(12);TWARTWI_ADDRESS|(1TWCR(1asm(CLI);//关闭全局中断采用轮询方式接受数据}void setup( ){Init_Io();Serial.begin(9600);}void loop( ){uchar temp1,temp2;TWCR(1while((TWCR(1temp1STATUS;temp2TWDR;if(temp10x90){Serial.println(temp2,DEC);//打印接收数据}}上述程序已被验证打开接受端arduino自带的串口监控器可以看到0到9的不断重复数据。程序中没用到的宏可自行删除不影响最后结果。