Principles-and-Applications-and-C51-programming.r

  • PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 66KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2015-07-20 20:58
    上传日期
Principles and Applications and C51 programming
Principles-and-Applications-and-C51-programming.r
  • 《单片机原理与应用及C51程序设计》源代码
  • 7-led.asm
    1.1KB
  • 8-dac0832jcb.c
    209B
  • 9-ds1302.asm
    3.4KB
  • 4-25.C
    395B
  • 5-2a.c
    222B
  • 5-2b.asm
    206B
  • 4-23.C
    407B
  • 5-3b.asm
    285B
  • 5-1.asm
    66B
  • 3-25.asm
    145B
  • 3-33c.asm
    309B
  • 4-30.C
    716B
  • 9-i2c.c
    6.7KB
  • 8-dac0832sjb.c
    245B
  • 4-31.C
    151B
  • 5-8b.asm
    1.8KB
  • 3-34.asm
    601B
  • 8-dac0832.asm
    388B
  • 4-27.C
    316B
  • 4-15.LST
    1.3KB
  • 5-8a.c
    1.8KB
  • 5-3a.c
    280B
  • 123
    3.9KB
  • 4-12.c
    485B
  • 3-31.asm
    237B
  • 4-19.C
    85B
  • 11-1.asm
    2.6KB
  • 9-ds12887.LST
    3.1KB
  • 5-6b.asm
    246B
  • 5-4.asm
    282B
  • 8-dac0832.c
    849B
  • 4-8.c
    679B
  • 4-31.LST
    960B
  • 9-i2c.asm
    7.2KB
  • 11-2.c
    3.2KB
  • 5-7b.c
    723B
  • 4-6.c
    331B
  • 5-3b.c
    371B
  • 123.plg
    739B
  • 3-13.asm
    145B
  • 4-20.C
    74B
  • 9-lcd.OBJ
    3.8KB
  • 5-5.c
    216B
  • 5-9.c
    534B
  • 7-led.c
    1.1KB
  • 4-24.C
    490B
  • 123.M51
    6.1KB
  • 5-8a.asm
    1.5KB
  • 9-ds12887.OBJ
    8.5KB
  • 9-lcd.c
    1.3KB
  • 5-7a.c
    684B
  • 123_Uv2.Bak
    1.7KB
  • 4-29.C
    316B
  • 3-33a.asm
    201B
  • 3-33b.asm
    325B
  • 3-29.asm
    150B
  • 5-1.c
    99B
  • 5-3a.asm
    285B
  • 4-16.c
    331B
  • 4-4.C
    119B
  • 3-26.asm
    842B
  • 4-22.C
    67B
  • 4-21.C
    150B
  • 123_Opt.Bak
    1.3KB
  • 5-9.asm
    574B
  • 9-ds1302.c
    5.7KB
  • 4-3.C
    101B
  • 4-31.OBJ
    760B
  • 123.lnp
    52B
  • 5-4.c
    250B
  • 4- 11.c
    163B
  • 11-2.asm
    3.5KB
  • 7-key.c
    1.6KB
  • serial_initial.c
    216B
  • 7-key.asm
    2.2KB
  • 9-lcd.asm
    1.5KB
  • 4-15.c
    326B
  • 8-dac0832jcb.OBJ
    1.6KB
  • 123.Opt
    1KB
  • 3-32.asm
    374B
  • 4-17.c
    313B
  • y1.c
    276B
  • 8-adc0908.c
    794B
  • 9-lcd.LST
    3.1KB
  • 3-16.asm
    109B
  • 3-17.asm
    246B
  • 3-30.asm
    215B
  • 3-14.asm
    158B
  • 8-dac0832fb.c
    399B
  • 5-8b.c
    2KB
  • 123.Uv2
    1.6KB
  • 4-9.C
    368B
  • 5-6a.asm
    245B
  • 9-ds12887.asm
    2.8KB
  • 4-28.C
    260B
  • 4-1.C
    95B
  • 9-ds12887.c
    1.5KB
  • 4-5.C
    255B
  • 3-27.asm
    176B
内容介绍
#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define _Nop() _nop_() //定义指令 sbit SDA=P1^0; //定义数据线 sbit SCL=P1^1; //定义时钟线 sbit WP=P1^2; //定义写保护线 bit ack; //定义应答位 /******************************************************************* 开始信号函数 函数原型 void Start_i2c(); 启动I2C总线,即发送I2C开始信号. ********************************************************************/ void Start_I2c() { SDA=1; //发送开始信号的数据信号 _Nop(); SCL=1; _Nop();_Nop();_Nop();_Nop();_Nop(); //开始信号建立时间大于4.7us,延时 SDA=0; //发送开始信号 _Nop();_Nop();_Nop();_Nop();_Nop(); //开始信号锁定时间大于4μs SCL=0; //钳住I2C总线,准备发送或接收数据 _Nop();_Nop(); } /******************************************************************* 结束信号函数 函数原型 void Stop_i2c(); 结束I2C总线,即发送I2C结束信号. *******************************************************************/ void Stop_I2c() { SDA=0; //发送结束信号的数据信号 _Nop(); SCL=1; //发送结束信号的时钟信号 _Nop();_Nop();_Nop();_Nop();_Nop(); //结束信号建立时间大于4μs SDA=1; //发送I2C总线结束信号 _Nop();_Nop();_Nop();_Nop(); } /******************************************************************* 写一个字节函数 函数原型 void SendByte(uchar i); 送出8位信息,返回应答位ACK,如正常,ACK=1,异常,ACK=0 ********************************************************************/ void SendByte(uchar c) { uchar BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //循环传送8位 { if((c<<BitCnt)&0x80)SDA=1; //取当前发送位 else SDA=0; _Nop(); SCL=1; //发送到数据线上 _Nop(); _Nop(); _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; //接收到应答信号,ACK=1,否则,ACK=0 SCL=0; _Nop(); _Nop(); } /******************************************************************* 接收一个字节函数 函数原型 void RcvByte(); 返回接收的8位数据 ********************************************************************/ uchar RcvByte() { uchar retc; uchar BitCnt; retc=0; SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; //置时钟线为低电平,准备接收数据 _Nop(); _Nop(); _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); //返回接收的8位数据 } /******************************************************************** 应答函数 函数原型 void Ack_I2c(bit a); 参数a为1,发应答信号,为0发非应答信号 ********************************************************************/ void Ack_I2c(bit a) { if(a==0)SDA=0; //发应答信号 else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); } /******************************************************************* 向器件当前地址写一个字节函数 函数原型 bit ISendByte(uchar sla,ucahr c);入口参数器件地址码和传送的数据 返回一位,1表示成功,否则有误。使用后必须结束总线。 ********************************************************************/ bit ISendByte(uchar sla,uchar c) { Start_I2c(); //发开始信号 SendByte(sla); //写器件地址码到I2c总线 if(ack==0)return(0); SendByte(c); //如果接收应答信号,则发送一个字节数据 if(ack==0)return(0); //发有误,则返回0 Stop_I2c(); //正常结束,送结束信号,返回1 return(1); } /******************************************************************* 向器件指定地址按页写函数 函数原型 bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 入口参数有四个:器件地址码、器件单元地址、写入的数据串、写入的字节个数 定入成功,返回1,不成功,返回0,使用后必须结束总线。 ********************************************************************/ bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2c(); //发送开始信号,启动I2c总线 SendByte(sla); //发送器件地址码 if(ack==0)return(0); //无应答,返回0 SendByte(suba); //有应答,发送器件单元地址。 if(ack==0)return(0); //无应答,返回0 for(i=0;i<no;i++) //连续传发送数据字节 { SendByte(*s); //发送数据字节 if(ack==0)return(0); //无应答,返回0 s++; } Stop_I2c(); //正常结束,送结束信号,返回1 return(1); } /******************************************************************* 读器件当前地址单元数据函数 函数原型 bit IRcvByte(uchar sla,ucahr *c); 入口参数两个:器件地址码、读入位置,读成功返回1,否则返回0 ********************************************************************/ bit IRcvByte(uchar sla,uchar *c) { Start_I2c(); //发送开始信号,启动I2c总线 SendByte(sla); //发送器件地址码 if(ack==0)return(0); //无应答,返回0 *c=RcvByte(); //读入字节送目的位置 Ack_I2c(1); //送非应答信号 Stop_I2c(); //正常结束,送结束信号,返回1 return(1); } /******************************************************************* 从器件指定地址读多个字节 函数原型 bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 入口参数有四个:器件地址码、器件单元地址、写入的数据串、写入的字节个数 定入成功,返回1,不成功,返回0,使用后必须结束总线。 ********************************************************************/ bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2c(); //发送开始信号,启动I2c总线 SendByte(sla); //发送器件地址码 if(ack==0)return(0); //无应答,返回0 SendByte(suba); //有应答,发送器件单元地址 if(ack==0)return(0); //无应答,返回0 Start_I2c(); //有应答,重发送开始信号,启动I2c总线 SendByte(sla); //发送器件地址码 if(ack==0)return(0); //无应答,返回0 for(i=0;i<no-1;i++) //连续读入字节数据 { *s=RcvByte(); //读当前字节送目的位置 Ack_I2c(0); //送应答信号 s++; } *s=RcvByte(); Ack_I2c(1); //送非应答信号 Stop_I2c(); //正常结束,送结束信号,返回1 return(1); }
评论
    相关推荐