注射水光针多少费用一针一针的价格是多少钱呀 – 手机爱问

转自:.cn/s/blog_4e6ca7bb.html
看看自己的博客,实在不忍心眼睁睁看着它成为图片传播站。但自己对将别人的技术文章或程序转来转去也没感觉有多大意思,干脆把上个月写的个小程序放上来吧。参看过类似程序,自己编写了这个程序。I2C虽是较简单的通信协议,但要完全理解透彻可也并非那么轻而易举,自己也是在不断加深对它的理解。这个程序已通过实验验证,并加上个人非常详细的注释(复制过来显示有点乱,没时间一一调整了),但如果使用它还是请慎重。
//*************************************************************************************
//**程序名称:51单片机实现对24C02进行页写、顺序读取并显示验证
//**编写人:海右愚叟&&&&&&&&&&&&&&&&&修改人:海右愚叟&&&&
//**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信
//**功能描述:51单片机将8个字节数据写入24C02的一页中,然后顺序读出,每隔1秒送P0口LED显示
//**其他说明:本程序是采用某51开发板,若在其他地方验证可更改相关端口及延时程序等。
//**&&&&&&&&&程序编写前曾参考过多个教程,最终自己编程通过,并详加注释。
//**&&&&&&&&&可供初学者参考,并不对程序的可靠性等作保证。
//**开发工具:keil 7.50(C51)&&&&&&日期:
//*************************************************************************************
#include &REGX51.H&
#include&intrins.h&&//因为用到_nop_();
sbit SCL =P3^3;&&&&&//注意P1、P2、P3口有内部上拉电阻,可直接连SDA和SCL,若想用P0需外接上拉电阻,否则连上无法输出高电平!
sbit SDA = P3^4;
&&&&//用于计数50ms的个数的全局变量
uchar code ToSDAdataBuffer[8] = {
0xfe,0xfc,0xf8,0xf0,
0xe0,0xc0,0x80,0x00
};&&&&&&//写入24C02的一组数据,8个字节对应24C02的一页(共32页),这里把这些要验证的常数放到程序存储区
uchar ReceivedData[8];//用于存储接收的8个字节数据(1页)的数组
//本例51为单主机,24C02为从机,不需要总线裁决
//延时5us子程序
void delay5us(void)
&_nop_();&//时序图要求开始建立时间tSU.STA大于4.7us,开始保持时间tHD.STA大于4us。51中每个_nop_();延时1个CPU cycle,即1us。
&_nop_();&//如考虑不同CPU频率不同,可用带参数的延时,参数在前面宏定义。
//50ms定时器0中断函数
void timer0() interrupt1&&&&//j是个全局变量,不是返回值,所以这里还是void。
&TH0 = ()/256;&//11.0592MHz时每50ms一次定时器中断
&TL0 = ()%256;
&j++;&&&&&&&&&&&&&&&&&&&&&//也可以把判断j到20,并给P0口送显示数据的程序放在中断里处理
//延时1秒的子程序,用于将读取的数据每隔一秒显示在LED上
void delay1s(void)
&TMOD =0x01;&&&//方式1的16位计数器
&TH0& = ()/256;
&TL0& = ()%256;
&EA&& = 1;
&ET0& = 1;
&TR0& =1;&&&&//启动定时器0工作
&while(j & 20)&//j达到20之前空操作,达到20时说明已到1s,下面关中断和定时器0
&EA&& = 0;
&ET0& = 0;
&TR0& = 0;&&&&&&&&
//约2ms的延时
void delay(uchar t)
&uchar x,y;
&for(x=0;x&t;x++)
&&for(y=0;y&250;y++)
//I2C初始化
void InitI2C(void)
&SDA = 1;&&//总线空闲时,因各设备都是集电极或漏极开路,上拉电阻使SDA和SCL线都保持高电平。
&SCL = 1;&
&delay5us();
//产生I2C开始信号
void StartI2C(void)
&SDA = 1;&&//SDA在SCL为高期间由高变低表示开始,所以先要高
&delay5us();&&//时序图要求tSU.STA(Start Set-up Time)大于4.7us
&SDA = 0;&&//注意SDA拉低前后都要维持5us以上!
&delay5us();&&//tHD.STA(Start Hold Time)大于4us
&SCL = 0;&&//拉低SCL,准备发送或接收数据(这两句也可在写或读字节的程序中先将SCL置0,延时)
&delay5us();
//产生I2C结束信号
void StopI2C(void)
&SDA = 0;&&//SDA在SCL为高期间由低变高,说明结束
&delay5us();
&delay5us();
//发送方在发完一个字节后检测接收方有没有应答。返回应答成功否。
bit ChkAck(void)
&SDA&&&&=&
1;&//释放SDA(置1),然后等待接收方应答将它拉低。确切的说,应是24C02发送字节最后一位的第8个时钟周期下降沿后经tAA
&//(SCL变低到SDAOUT有效的时间)约0.1-4.5us后拉低SDA,并随第9个时钟后结束。所以24C02正常时,SDA为1并不体现
&//(第8脉冲后马上被拉低了),但若器件坏了,就需要靠这个置1后不变来判断!(若不置1而上次发的数据最后一位为0就不好判断了)
&//从24C02的BlockDiagram看,它只能在SDA为1时通过控制内部的Dout来把SDA拉低,但不能在SDA为0时将其置高!故主机要常将SDA置1,而SCl置0。
&SCL&&&&=&
1;&//WriteI2CByte中写完一字节后又将SCL拉低,这里拉高产生第9个时钟上升沿,然后在SCL为高期间对SDA进行检测
&delay5us();
&SDAtemp = SDA; //如果不用暂存变量,直接returnSDA,就不会执行后面的SCL = 0,检测期间的第9个时钟就不完整了
&SCL&&&&=&
&delay5us();
&return SDA
//51作为主机时,如果接收数据,模拟产生应答时序。形参Ack为0,则应答0,为1不应答。
void AckAsMaster(bit Ack)
&&SDA = 0;
&&SDA = 1;
&delay5us();
&SCL =1;&&//主机控制SCL时序。关键是保证在SCL脉冲上升沿之前SDA数据已稳定即可。
&delay5us();
&delay5us();
void WriteI2CByte(uchar);
uchar ReadI2CByte();
//页写。输入两参数,一个为首字地址,另一个是指向待写入数据数组的指针(括号内第二个参数也可写作ucharToSDAdataBuffer[],即数组名代表首地址)。
bit PageWrite(uchar WordAddress,uchar *ToSDAdataBuffer)
&&&//下面的程序我用的if嵌套,网上有些程序是顺序结构,但因为遇到return就返回主程序不再往下执行,所以效果是一样的。
&StartI2C();
&WriteI2CByte(0xa0);//之所以没设DeviceAddress这个参数,是因为最后一位不属于地址。E2PROM一般前四位为1010,这里A2~A0接地,为0,最后一位0表示写
&if(!ChkAck()){&&&//检查应答函数返回0说明从机应答0成功。
&&WriteI2CByte(WordAddress);&//写8-bitdata wordaddress,即写到哪个存储单元(24C02有2kbits,所以数据字有6个,故地址线有8位)
&&if(!ChkAck()){
&&&for(i = 0; i& 8; i++){
&&&&WriteI2CByte(ToSDAdataBuffer[i]);
&&&&if(ChkAck()){
&&&&&&&&&&&&&&&&//这里可添加错误处理代码。如用几个LED的亮灭组合表示此I2C器件有问题,类似主板错误提示。
&&&&&return1;//一般返回1表示异常,且遇到return就退出整个子程序。&
&&&StopI2C();&&&&&//写完发送结束信号。
&&&return0;&&&&&&&//一般返回0表示程序正常
&&else{&&&
&&&return1;&&&&&&&//之前可添加错误处理代码。
&&return1;&
//不能用Current AddressRead,因为那是24C02数据字地址计数器上次操作后加1的值;而SEQUENTIAL_READ如果不给一个要读取的开始地址,会从头输出,
//所以需要Random Read的开始部分,但不要停止信号。
bit SequentialRead(uchar WordAddress)
&StartI2C();
&WriteI2CByte(0xa0);
&if (!ChkAck()){
&&&&WriteI2CByte(WordAddress);
&&if (!ChkAck()){
&&&StartI2C();&//the microcontroller must generate another start condition
&&&WriteI2CByte(0xa1);//DeviceAddress后紧跟的那一位R/W^是1说明是读,24C02内部就是根据最后这位来判断是从SDA上读数,还是往SDA上送数
&&&//之所以设为1是读,是因为根据WriteI2CByte子程序,最后给SDA赋1,P3^4就维持1,这样24C02内部Dout为高就将SDA拉低;如果最后一位是0,24C02没能力拉高!
&&&if(!ChkAck()){
&&&&for(i= 0;i & 8;i++){
&&&&&ReceivedData[i]= ReadI2CByte();
&&&&&AckAsMaster(0);//51此时接收数据,调用应答的函数(置SDA为0)
&&&&AckAsMaster(1);&&&&//NO
ACK.The microcontroller does not respond with a zero but doesgenerate a following stop condition.
&&&&StopI2C();
&&&&return0;
&&&&return1;&&&&&&&&&&//之前可添加错误处理代码。
&&&return1;
&&return 1;
int main(void)
&InitI2C();
&//注意在24C02中用到的页写和顺序读的地址是同一个,且必须是8的整数倍,即每页的首地址才行,如0x08,0x20等。因为24C02页写时后三位地址自动加1,
&//When the word address,internally generated,reaches the page boundary, the following byte is placed at thebeginning of the same page.
&//而顺序读时只有在达到整个存储区边界时才会rollover。所以,如读写都用0x32这个地址,由于不是8的整数倍,只有前6个数显示是正确的,最后两个数
&//虽然又从头写在了该页的前面,但SequentialRead确读到了该页之外的两个存储单元,造成错误。
&if (PageWrite(0x08,ToSDAdataBuffer) == 0) {//先执行页写操作,设从地址00开始,没问题就延迟一下再从同一地址读回来。
&&delay(100);&&&&&&&&&&&&&&&&//等待24C02页写操作完毕
&&if(SequentialRead(0x08) ==0){&&&//如果顺序读操作成功,则每隔1秒送P0口显示一个字节
&&&for(i = 0; i& 8; i++){
&&&&P0= ReceivedData[i];
&&&&delay1s();
&return 0;
//往I2C总线写一个字节的数据(即将一个字节的数据发送到SDA上)
void& WriteI2CByte(uchar ByteData)
&temp = ByteD
//& (StartI2C()最后已经先将SCL变0了):
&for(i=0;i&8;i++){
&&temp&&=&1;&//左移一位,I2C要求由MSB最高位开始,移出的CY即要发送到SDA上的数据。下面考虑时序:
&&SDA&&&=&CY;&//此时SCL已为低,每次移一位送出去(下次进循环后SDA还保持着上次发出去的数据)
&&delay5us();&&//SDAIN数据变化中点SCL上升沿中点的一段时间是tSU.DAT,即数据建立时间Data In Set-upTime,需大于200ns,多延无所谓
&&SCL&&&=&
&&delay5us();&&//tHIGH即ClockPulse Width High,最小4us
&&SCL&&&=&
&&delay5us();&&//tLOW即ClockPulse Width Low,最小4.7us
//读取I2C总线一个字节的数据
uchar&ReadI2CByte()&&&//串行总线,51一位位接收从机发送到SDA上的数据,这里只考虑数据已在SDA上时如何存下来这几位,组成一个字节
&uchar i,ByteD
&SDA =1;&&&&&&&&&&&//SCL在ChkAck中已经置0了。注意SCL时序仍然由主机控制!24C02只能将SDA由高拉低,象橡皮筋松手又恢复高,而下面只是读SDA,没赋值
&&&&&&//其实程序中多处给SDA置1都可省,因为检查应答时为0就正常,无所谓,写字节时也无所谓,就是在读之前要保证SDA为1!
&&&&&&//因之前有WriteI2CByte(0xa1);其实这句也可省略。
&delay5us();&&&//24C02作为发送方在第9个时钟的negativeedge clocks data out of each device,所以现在SDA上为新数据
&for(i=0;i&8;i++){
&&SCL =1;&&//置时钟线为高使数据线上数据有效
&&delay5us();
&&ByteData =(ByteData&&1)|SDA;//SDA上已是新数据了,读之。data不管以前多少,左移后最右边为0,和SDA“按位或”后MLB就是SDA
&&SCL = 0;
&&delay5us();
&return ByteD&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:57711次
排名:千里之外
原创:14篇
转载:75篇
(1)(1)(1)(1)(3)(3)(4)(24)(12)(10)(12)(13)(4)51单片机学习笔记,模拟iic总线连续读写24c02存储器 - 嘎子的博客 - ITeye技术网站
博客分类:
AT24C02A, 2K SERIAL EEPROM:
Internally organized with 32 pages of 8 bytes each,the 2K requires an 8-bit data word address for random word addressing.
24c02有32个页,每页8字节,本帖中不讨论页写的方式
-------------------------------------------------------------------
AT24C02内部设有一个8位控制寄存器,其每一位的含义如下: Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
R/W 其中前4位数据是芯片固定的标识,A2/A1/A0用于选择总线上待访问的I2C器件,R/W=1读操作,R/W=0写操作;I2C总线上最多可以扩展8片同样的2K容量EEPROM存储器,或者是4片4Kb的EEPROM,或者是2片容量为8Kb的EEPROM存储器。或者是1片容量为16Kb的EEPROM存储器(此时硬件就固定了,因为A2/A1/A0已经被P2P1P0占用),如果扩展8片2K以内容量的EEPROM存储器,每片存储器将对应一个地址,我们的实验板上的AT24C02的A2/A1/A0引脚全部接地,所以在实验中读写控制字分别为:0xa1/0xa0
主芯片stc89c52rc,晶振11.0592M
#include &reg52.h&
#include "MY51.H"
sbit sda=P2^0;
//总线连接口定义
sbit scl=P2^1;
//总线连接口定义
void delayus()
//需要4个机器周期,大概4.34us
//晶振频率11.0592M,机器周期为1.085微秒
void iic_start()
//启动信号
delayus();
//sda和scl同为高电平保持4.7us以上
//1.085us,共5.78us,下面sda=0是下降沿,不能计算在延时时间中
delayus();
//sda低电平保持4us以上 ,这里是4.34us满足要求
void iic_stop() //停止信号
sda=0;_nop_(); //准备状态
delayus();
//该状态稳定时间要求保持4us以上
//scl高电平期间,sda来一个上升沿
delayus();
//sda保持4.7us以上,4.34加上函数返回时间大于4.7us
//注:此时scl和sda都为1
void iic_sendByte(uchar byteData) //mcu发送一个字节
uchar temp=byteD
for(i=0;i&8;i++)
temp=temp&&1;
//移动后最高位到了PSW寄存器的CY位中
//稳定一下
//将待发送的数据一位位的放到sda上
//每一个高电平期间,ic器件都会将数据取走
//如果写成scl=1;sda=1就是停止信号,不能这么写
//释放总线,数据总线不用时要释放
uchar iic_readByte() //读一个字节
//准备读数据
//释放总线
for(i=0;i&8;i++)
//mcu开始取数据
delayus();
//scl为高电平后,ic器件就会将1位数据送到sda上
//总共用时不会大于4.34us的,然后就可以让mcu读sda了
temp=(temp&&1)| //读一位保存到temp中
delayus();
bool iic_checkACK()
//处理应答信号
uchar errCounts=255; //定义超时量为255次
while(sda)
{ //在一段时间内检测到sda=0的话认为是应答信号
if(0==errCounts)
//钳住总线
//没有应答信号
errCounts--;
//钳住总线,为下1次通信做准备
//成功处理应答信号
void iic_init() //总线初始化
delayus();
void iic_sendACK(bool b_ACK) //发送应答或非应答信号
delayus();
//大于4us的延时
//钳住scl,以便继续接收数据
void AT24C02_writeByte(uchar address,uchar dataByte)//向24c02写一字节数据
iic_start();
iic_sendByte(0xa0);//mcu写控制字,前4位固定1010,后三位地址0,末位0是写
iic_checkACK();
//mcu处理应答信号
iic_sendByte(address);
//准备在指定地址处写入
iic_checkACK();
iic_sendByte(dataByte); //写数据
iic_checkACK();
iic_stop();
delayms(2);
//按字节写入时,24c02在接收到停止信号后将数据擦写到内部,这需要时间
//并且在这段时间内不会响应总线上的任何请求,故让mcu有2毫秒以上的等待
void AT24C02_writeData(uchar address,uchar numBytes,uchar* buf)//写入任意长度数据
while(numBytes--)
AT24C02_writeByte(address++,*buf++);
void AT24C02_readData(uchar beginAddr,uchar dataSize,uchar* buf)//读取任意长度字节
iic_start();
//起始信号
iic_sendByte(0xa0);
//控制字,写
iic_checkACK();
//处理应答信号
iic_sendByte(beginAddr); //发送地址
iic_checkACK();
//处理应答信号
iic_start();
//发送起始信号
iic_sendByte(0xa1);
//控制字,读
iic_checkACK();
//处理应答信号
while(dataSize--)
//读取dataSize个字节
*buf++=iic_readByte(); //读取一个个字节并保存到缓冲区buf中
iic_sendACK(dataSize);
//发送应答,当dataSize为0时发送非应答
iic_stop();
//发送停止信号
void main()
uchar buf[2];
//接受数据的缓冲区
uchar arr[34]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
//0x00-0x0f
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,//0x10-0x1f
//0x20-0x21
iic_init();
//总线初始化
//AT24C02_writeByte(0x08,0x11);
//向指定地址处写入一个字节数据,代码测试
AT24C02_writeData(0x00,sizeof(arr),arr); //向指定地址处开始写入34字节的数据
AT24C02_readData(0x20,sizeof(buf),buf);
//从指定地址开始读2个字节
P1=buf[1]; //buf中的第二个元素就是arr中的最后一个数据0x55
while(1){P1=~P1;delayms(500);} //将这个0x55用led灯显示出来变化
my51.h头文件中主要用到
#include &intrins.h&
void delayms(uint16 ms)
//软延时函数
uint16 i,j;
for(i=i&0;i--)
for(j=113;j&0;j--)
xouou_53320
浏览: 322854 次
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
不过改了iconv.exe路径也不能用。。。。C51: 向24C02,写入n个数据,再读出n 个数据
09:07:51来源: eefocus
//函数功能,
//写入n个数据,再读出n 个数据。用LCD 显示。
//变量声明
#define uchar unsigned char
#define uint unsigned int
//延时 1ms
void delayms()
&for(i=0;i<250;i++);
&for(i=0;i<80;i++);
void delaynms(uint s)
&for(tem=0;tem<s;tem++)
&&delayms();
//LCD 忙碌查询
sbit LCDbusy=P1^7;
//LCD 操作位 设置
sbit RS=P3^2;
sbit RW=P3^1;
sbit E=P3^0;
sbit BF=P1^7;
//------& LCD 程序 ----
//读LCD 状态
uchar BusyTest()
&//读LCD 状态
&result=BF;
//写 LCD 指令
void WriteInstruction(uchar instruction)
&//LCD 忙碌,等待。
&while(BusyTest()==1);
&_nop_();&& //要求
//初始化 LCD
void InitLCD()
&delaynms(15);&
&WriteInstruction(0x38);//& 显示模式设置
&delaynms(5);
&WriteInstruction(0x38);
&delaynms(5);
&WriteInstruction(0x38);
&delaynms(5);
&WriteInstruction(0x0d);//显示模式设置: 开显示,不显示光标,闪烁光标
&delaynms(5);
&WriteInstruction(0x06);//显示模式设置: 光标右移,文字不移动。
&delaynms(5);
//写LCD 数据
void WriteData(uchar d)
&&//LCD 忙碌,等待。
&while(BusyTest()==1);
//写地址,属于写指令
void WriteAdd(uchar ad)
&uchar addr=ad+0x80;
&WriteInstruction(addr);
sbit SDA=P2^0;&&&&&&&&& //数据SDA位定义在P2^0引脚
sbit SCL=P2^1;&&&&&&&& //时钟总线SCL位定义在P2^1引脚&&&&
&//定义写入器件,寻址地址
& // 定义读出器件,寻址地址
//函数功能:开始数据传送&&
void start()
&SDA = 1;&&& //SDA初始化为高电平&1&
&& SCL = 1;&&& //开始数据传送时,要求SCL为高电平&1&
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&SDA = 0;&&& //SDA的下降沿被认为是开始信号
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&SCL = 0;&&& //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)&&
//函数功能:结束数据传送&
void stop()
&SDA = 0;&&&& //SDA初始化为低电平&0&&_n
&SCL = 1;&&&& //结束数据传送时,要求SCL为高电平&1&
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&SDA = 1;&&& //SDA的上升沿被认为是结束信号
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
}&&&&&&&&&
//应答检查
bit testack()
&SDA = 1;&&&& // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
&&&&&&&&&&&&&&&& //以让SDA线转由接收设备(AT24Cxx)控制
&_nop_();&&&&&&& //等待一个机器周期&
&_nop_();&&&&&&& //等待一个机器周期&
&SCL = 1;&&&&&& //根据上述规定,SCL应为高电平
&_nop_();&&&&&& //等待一个机器周期&
&_nop_();&&&&&& //等待一个机器周期&
&_nop_();&&&&&& //等待一个机器周期&
&_nop_();&&&&&& //等待一个机器周期&
&ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
&&&&&&&&&&&&&&& //若送高电平,表示没有接收到,传送异常
&SCL = 0;&&&&&& //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
&return& ack_&
&_nop_();&
void noack()
//函数功能:从AT24Cxx读取一个字节
unsigned char ReadData()
&&& //储存从AT24Cxx中读出的数据
&for(i = 0; i < 8; i++)
&&SCL = 1;&&&&&&&&&&&&&&& //SCL置为高电平
&&x<<=1;&&&&&&&&&&&&&&&&& //将x中的各二进位向左移一位
&&x|=(unsigned char)SDA;& //将SDA上的数据通过按位&或&运算存入x中
&&SCL = 0;&&&&&&&&&&&&&&&&&&&&&&& //在SCL的下降沿读出数据
&return(x);&&&&&&&&&&&&&&& //将读取的数据返回
//写入一个字节
void& WriteCurrent(unsigned char y)
&&& for(i = 0; i < 8; i++)&&// 循环移入8个位
&&& &SDA = (bit)(y&0x80);&& //通过按位&与&运算将最高位数据送到S
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //因为传送时高位在前,低位在后
&&_nop_();&&&&&&&&&&& //等待一个机器周期&&&
&&& SCL = 1;&&&&&&&&&&& //在SCL的上升沿将数据写入AT24Cxx&&&&&&
&& &_nop_();&&&&&&&&&&& //等待一个机器周期&
&& _nop_();&&&&&&&&&&&& //等待一个机器周期&&&&&&&
&& &SCL = 0;&&&&&&&&&&& //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
&&y <<= 1;&&&&&&&&&& //将y中的各二进位向左移一位
//在器件指定地址 写 n 个字节
//参数(数据地址,器件内存地址 ,写字节数)
void writeI2C(uchar *wdata,uchar add,uchar bytes)
&start();&&&&&&&&&&&&&& //开始数据传递
&WriteCurrent(wdeviceadd);& //选择要操作的AT24Cxx芯片,并告知要对其写入数据
&testack();
&WriteCurrent(add);&&&&&& //写入指定地址0x36
&testack();
&//进入循环
&for(;bytes!=0;bytes--)
&&WriteCurrent(*wdata);&&&&&& //向当前地址(上面指定的地址)写入数据 0x00&
&&testack();& //应答检查
&&wdata++;
&stop();&&&&&&&&&&&&&&& //停止数据传递
&delaynms(4);
//在器件指定地址 读出 n 个字节
//参数(接收读出数据缓存地址,读数据器件内存地址 ,读出字节数)
void readI2C(uchar *rdata,uchar add,uchar bytes)
&/*读出数据
&启动-写芯片寻址-应答检查-写数据首址-应答检查- 进入读数据程序段 */
&start();&&&&&&&&&&&&&&&&&&&&&&
&WriteCurrent(wdeviceadd);&&&&&& //选择要操作的AT24Cxx芯片,并告知要对其写入数据
&testack();
&WriteCurrent(add);&&&&&& //读出数据地址
&testack();
&/*读数据程序段流程:
&启动-写芯片寻址-应答检查- 进入读数据程序段*/ &
&start();&&&&&&&&&&&&&&
&WriteCurrent(rdeviceadd);&& //选择要操作的AT24Cxx芯片,并告知要读其数据
&testack();
&/*读数据程序段
&条件判断-读数据-应答-指针操作-循环,
&最后一个字节退出循环-读最后一个字节-非应答-停止& */&
&while(bytes!=1)
&&*rdata=ReadData();&
&&ack();& //应答
&&rdata++;
&&bytes--;
&*rdata=ReadData();&&& //读出最后一个字节&&&&
&noack();&&&&& //最后一个数据& 非应答&&
&stop();&&&&&&&&&&&&&&& //停止数据传递
//main 程序
void main()&
&&& //将此字符串存入24C02,再读出。
&uchar str[14]="this is a 2402" ;
&uchar *p;
&//读出缓存
&uchar readbuf[50];
&//定义器件地址
&wdeviceadd=0xa0;&//写入器件,寻址地址
&rdeviceadd=0xa1;& // 读出器件,寻址地址
&writeI2C(str,0x00,14);
&readI2C(readbuf,0x00,14);
&//初始化LCD
&InitLCD();
&WriteAdd(0x00);&&&&&&&&&&&
&while(*p!=&#39;\0&#39;)
&&WriteData(*p);
&delaynms(1000);
关键字:&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
TE工程师帮助将不可能变成可能,通过技术突破,使世界更加清洁、安全和美好。
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

我要回帖

更多关于 美容水光针多少钱一针 的文章

 

随机推荐