完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
#include
#include #define unchar unsigned char ***it SCL=P2^0; ***it SDA=P2^1; ***it A0=ACC^0; unchar jishu,ad_data; /********************** COM ***********************/ void init_com()//初始化串口 T1 {TMOD=0x21; SCON=0X40; PCON=0X00; TH1=0XFD; TL1=0XFD; TR1=1; } /********************** DELAY nop ***********************/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } void delays(unsigned int i) { for(;i>0;i--); } /********************* START *************************/ void i2c_start() { SCL=1; SDA=1; delay(); //确定总线空闲 SDA=0; delay();//起始保持4.7us 以上延时差 SCL=0; } /********************* STOP *************************/ void i2c_stop() { SDA=0; _nop_(); SCL=1; delay();//结束保持4.0us 以上延时差 SDA=1; delay(); } /****************** W ****************************/ void i2c_w(unchar w_data) {ACC=w_data; for(jishu=8;jishu>0;jishu--) { if(ACC&0x80) SDA=1; else SDA=0; _nop_(); //确保SDA保持稳定 SCL=1; //拉高SCL发送一位 delay(); SCL=0; delay(); ACC=w_data; ACC<<=(8-jishu); } } /********************* R *************************/ /*********** 重要:read后 必须紧跟ack或noack 3.4us ***********/ void i2c_r() { //SDA=1; //读入应答信号(拉高IO口) for(jishu=8;jishu>1;jishu--) { delay(); SCL=1; //拉高SCL接收一位 A0=SDA; delay(); ACC<<=1; SCL=0; } delay(); SCL=1; //拉高SCL接收一位 A0=SDA; delay(); ACC<<=1; ad_data=ACC; } /********************* ack *************************/ void i2c_ack() { SCL=0; SDA=0;//发送应答位 *************************************** delay(); SCL=1; delay(); SCL=0;//发完 delay(); } /********************* noack *************************/ void i2c_noack() { SCL=0; SDA=1;//发送应答位 *************************************** delay(); SCL=1; delay(); SCL=0;//发完 delay(); } /********************* main *************************/ void main() { init_com(); while(1) {i2c_start(); i2c_w(0x90); //addr SCL=1; //////// 等待应答 delay(); ///////// SCL=0; ///////// delay(); ////////// i2c_w(0x00); //cmd SCL=1; //////// 等待应答 delay(); ///////// SCL=0; ///////// delay(); ////////// /********************/ SDA=1; _nop_(); i2c_start(); i2c_w(0x91); //addr SCL=1; //////// 等待应答 delay(); ///////// SCL=0; ///////// delay(); ////////// i2c_r(); i2c_noack(); i2c_stop(); SBUF=ad_data; delays(100000); } } |
|
相关推荐
1个回答
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
470 浏览 0 评论
532 浏览 0 评论
660 浏览 0 评论
822 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
758 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17027 浏览 31 评论
浏览过的版块 |
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 03:56 , Processed in 0.620065 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3182