ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:16.67KB ,
资源ID:8455760      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8455760.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机普通IO口模拟IIC多机通信本人已测试通过.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

2、ned int#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=100;i+);void init() sda=1; scl=1; STROBE=1; void start() /启动I2C总线 sda = 1; delay(); scl = 1; delay(); sda = 0; delay(); / 此处scl不能拉低,否则两单片机通信时时序无法保持一致 /

3、*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_flag = 1; */void Send_Date(uchar j) unsigned char i; bit temp; scl = 1; while(STROBE); if(STROBE=0) delay(); delay();

4、delay(); for (i = 0 ;i 8 ;i+) if(ji)&0x80)temp=1; 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 = 1; STROBE=0; delay(); if(!scl)&(sda) return k; if(STROBE=0) while(scl); for(i=0;

5、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; delay(); if(!STROBE) while(scl); for(i=0;i8;i+) while(!scl); if(sda=1) j=1; else j=0; k=(k1)|j; delay(); delay(); while(scl); P0=k; R_W

6、=k&0x01; DEV_address=(k&0xfe); STROBE=1; STROBE=1;void B_work() if(STROBE) ChackRdd(); if(DEV_address=LOC_address) if(R_W) STROBE=(STROBE); Send_Date(0x55); else if(!R_W) STROBE=(STROBE); Receive_Date(); */void main() init(); while(1)/以下为测试代码。 while(STROBE) while(STROBE) start(); while(!STROBE); /*

7、while(STROBE) Send_Date(0xaa); /发送地址和写指令 while(!STROBE) Send_Date(0x99); /发送数据 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 */ while(STROBE) Send_Date(0xab); /发送地址和读指令 while(!STROBE) STROBE=1; Receive_Date(); /单片机B的代码#include#define uchar unsigned char#define uint unsigned int#define LOC_addres

8、s 0xaasbit 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=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状态,用

9、作比较 while(scl = 1 & NN-) NowState = sda; if(PreState = 1 & NowState = 0) /如果为下降沿则为开始信号 START_flag = 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)&0x80)temp=1; else temp=0; sda = temp; delay(); scl = 0

10、; delay(); scl = 1; delay(); scl = 0; sda = 1; /释放数据线 delay(); STROBE=1; STROBE=1;uchar Receive_Date() uchar i,j,k=0xff; scl = 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; re

11、turn 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+) while(!scl); if(sda=1) j=1; else j=0; k=(k1)|j; delay(); delay(); while(scl); P0=k; R_W=k&0x01; DEV_address=(k&0xfe); STROBE=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();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1