2402存储一个数据
来源:互联网 发布:慈善协会网站源码 编辑:程序博客网 时间:2024/06/05 05:56
#include <reg52.h> //头文件的包含#include <intrins.h>#define _Nop() _nop_() //定义空指令// 常,变量定义区 sbit SDA=P2^1; //模拟I2C数据传送位sbit SCL=P2^0; //模拟I2C时钟控制位 bit ack; //应答标志位 void DelayUs2x(unsigned char t);//函数声明 void DelayMs(unsigned char t);void DelayUs2x(unsigned char t){ while(--t);}void DelayMs(unsigned char t){ while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); }}void Start_I2c(){ SDA=1; //发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); //起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; //发送起始信号 _Nop(); //起始条件锁定时间大于4μ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; //钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();}void Stop_I2c(){ SDA=0; //发送结束条件的数据信号 _Nop(); //发送结束条件的时钟信号 SCL=1; //结束条件建立时间大于4μ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; //发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop();}void SendByte(unsigned char c){ unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 { if((c<<BitCnt)&0x80)SDA=1; //判断发送位 else SDA=0; _Nop(); SCL=1; //置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop(); //保证时钟高电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; //8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; //判断是否接收到应答信号 SCL=0; _Nop(); _Nop();}unsigned char RcvByte(){ unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; //置时钟线为低,准备接收数据位 _Nop(); _Nop(); //时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1; //置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中 _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc);}void Ack_I2c(void){ SDA=0; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; //清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); }void NoAck_I2c(void){ SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; //清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); }/*bit ISendByte(unsigned char sla,unsigned char c){ Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); //发送数据 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1);}*/----------------------------------------------------------------*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(suba); //发送器件子地址 if(ack==0)return(0); for(i=0;i<no;i++) { SendByte(*s); //发送数据 if(ack==0)return(0); s++; } Stop_I2c(); //结束总线 return(1);}/*bit IRcvByte(unsigned char sla,unsigned char *c){ Start_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 if(ack==0)return(0); *c=RcvByte(); //读取数据 NoAck_I2c(); //发送非就答位 Stop_I2c(); //结束总线 return(1);}*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(suba); //发送器件子地址 if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i<no-1;i++) { *s=RcvByte(); //发送数据 Ack_I2c(); //发送就答位 s++; } *s=RcvByte(); NoAck_I2c(); //发送非应位 Stop_I2c(); //结束总线 return(1);}void main(){ unsigned char doflye; // 定义临时变量 unsigned char i; IRcvStr(0xae,4,&doflye,1); //调用存储数据 while(1) { P1=doflye; //数值用二进制显示,直接用8个LED表示 for(i=0;i<5;i++) DelayMs(200); doflye++; //1s钟变量自加1,改变值后存储到24c02 //下次开机时将显示当前数值 ISendStr(0xae,4,&doflye,1); //写入24c02 } }
0 0
- 2402存储一个数据
- 2402存储一个数据
- 数据存储的一个想法
- 定义一个单利存储数据
- 一个将数据分页的存储过程
- 一个将数据分页的存储过程
- 一个将数据分页的存储过程
- 一个将数据分页的存储过程
- 一个简单的存储过程数据分页
- 一个简单的存储过程数据分页
- 一个将数据分页的存储过程
- 一个简单的存储过程数据分页
- 一个将数据分页的存储过程
- 用存储过程生成一个数据字典!
- 使用存储过程返回一个数据集
- 一个将数据分页的存储过程
- 一个将数据分页的存储过程
- 一个分页取数据的存储过程
- Bootstrap 表格内容水平、垂直居中
- 1009. Product of Polynomials (25)
- Huffman编码原理(C++,java实现)
- 最长回文 hdu3068 manacher
- SpringBoot非官方教程 | 第五篇:springboot整合 beatlsql
- 2402存储一个数据
- java从服务器上传本地图片到图片服务器
- 配置faster_rcnn的坑
- java性能优化
- 代码Python入门(五、循环语句(一))
- 排序算法的性能问题
- jQuery 选择器
- Java--BigInteger类型
- C++抽象编程——接口(2)——接口的用途