单片机普通IO口模拟IIC多机通信,本人已测试通过

上传人:飞*** 文档编号:32711001 上传时间:2018-02-12 格式:DOC 页数:10 大小:54.50KB
返回 下载 相关 举报
单片机普通IO口模拟IIC多机通信,本人已测试通过_第1页
第1页 / 共10页
单片机普通IO口模拟IIC多机通信,本人已测试通过_第2页
第2页 / 共10页
单片机普通IO口模拟IIC多机通信,本人已测试通过_第3页
第3页 / 共10页
单片机普通IO口模拟IIC多机通信,本人已测试通过_第4页
第4页 / 共10页
单片机普通IO口模拟IIC多机通信,本人已测试通过_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《单片机普通IO口模拟IIC多机通信,本人已测试通过》由会员分享,可在线阅读,更多相关《单片机普通IO口模拟IIC多机通信,本人已测试通过(10页珍藏版)》请在金锄头文库上搜索。

1、/* 说明,该程序是模拟 IIC 的通信思想,但也不全是,首先本人设计的不是从机与主机的通信,而是两单片机是平等的,单片机 A 可以向 B 或其他任何单片机发送数据(通过各个单片机所设置的地址来加以区分) ,同时单片机 A 可以也向 B 或其他任何单片机读取数据。反之单片机 B 或其他单片机也可以向 A 发送数据或读取 A 的数据,所以各个单片机的代码基本上是一样的,只需根据具体不同的需要调用就行。由于本人初学单片机,代码写的并不是很好。望各位多多指教!*/单片机 A 的代码#include#define uchar unsigned char#define uint unsigned int

2、#define LOC_address 0x48sbit sda=P10;sbit scl=P11;sbit STROBE = P12;bit R_W;bit START_flag=0;uchar DEV_address;void delay()uint i;for(i=0;i#define uchar unsigned char#define uint unsigned int#define LOC_address 0xaasbit sda=P10;sbit scl=P11;sbit STROBE = P12;bit R_W;bit START_flag=0;uchar DEV_addres

3、s;void delay()uint i;for(i=0;i=100;i+);/*void start() /启动 I2C 总线 sda = 1; delay(); scl = 1; delay(); sda = 0; delay(); */void start_scan()bit PreState;bit NowState;char NN = 10;PreState = sda; /记录当前 SDA 状态,用作比较while(scl = 1 & NN-)NowState = sda;if(PreState = 1 & NowState = 0) /如果为下降沿则为开始信号 START_fla

4、g = 1;void Send_Date(uchar j) unsigned char i;bit temp;scl = 1;while(STROBE);if(STROBE=0) delay();delay();delay();for (i = 0 ;i 8 ;i+)if(ji)else temp=0;sda = temp; delay(); scl = 0; delay(); scl = 1; delay();scl = 0;sda = 1; /释放数据线 delay();STROBE=1; STROBE=1;uchar Receive_Date()uchar i,j,k=0xff;scl

5、= 1;STROBE=0;delay();if(!scl)&(sda)return k;if(STROBE=0)while(scl);for(i=0;i8;i+)while(!scl);if(sda=1)j=1;else j=0;k=(k1)|j;delay();delay();while(scl);P2=k;return k;return k;void ChackRdd()uchar i,j,k=0xff;scl = 1;STROBE=0;/置低信号告诉单片机 A、单片机 B 已做好准备接收delay();if(!STROBE)while(scl);/等待 A 响应for(i=0;i8;i+

6、)while(!scl);if(sda=1) j=1;else j=0;k=(k1)|j;delay();delay();while(scl);P0=k;R_W=kDEV_address=(kSTROBE=1; STROBE=1;void B_work()if(STROBE)start_scan();if(START_flag)START_flag=0;STROBE=0;delay();STROBE=1;ChackRdd();if(DEV_address=LOC_address) if(R_W)STROBE=(STROBE);STROBE=1;/必须再次置高,使得两单片机在发送和接收数据时时序保持一致Send_Date(0x80);else if(!R_W)STROBE=(STROBE); Receive_Date(); void main()STROBE=1;scl=1;while(1) B_work();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号