⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial_kuozhan_c.c

📁 电子开发网培训用的51单片机内部培训代码
💻 C
字号:
//***************************************************
//实现功能:实现单片机模拟IIC总线对24cxx的读写
//目标板  :至强51开发板
//开发商  :电子开发网www.dzkf.com (专业提供开发方案,
//          电子元器件网上订购,单片机培训服务)
//对开发板有什么疑问,请上我们的论坛bbs.dzkf.com探讨
//***************************************************
#define uchar unsigned char
#define uint unsigned int
#define device_addr 0xa0
#include   <reg51.h>  

sbit scl=P1^2;  //24c02 SCL
sbit sda=P1^1;  //24c02 SDA
sbit P16=P1^6;
sbit P15=P1^5;
sbit P14=P1^4;
sbit P13=P1^3;
uchar temp_write[]={2,3,4};
uchar temp_read[3];

uchar read_byte(uchar address);  //从24c02的地址address中读取一个字节数据
void  write_byte(uchar address,uchar info);  //向24c02的address地址中写入一字节数据info
void write_n_byte(uchar address,uchar w_num,uchar *p);
void read_n_byte(uchar address,uchar r_num,uchar *p);

void start(void);
void stop(void);
void send(unsigned char send_data);


void IIC_send(uchar temp);
uchar IIC_read(void);
void wait_ack(void);

//******************主函数***********************
//描    述:实现单片机模拟IIC总线对24cxx的读写
//入口参数:无
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//***********************************************
int main(void)
{unsigned char i;
//*******************测试写一个字节***************
//对24cxx的01h地址写一个数据08h
 write_byte(1,8);
 i=read_byte(1);
//读24cxx的01h地址并验证是否是刚才写进去的08h
 if(i==8)
	P16=0;//是,点亮P1.6脚的发光二极管
//*******************测试写n个字节***************
//从24cxx的地址02h开始连续写3个数据,分别是02h , 03h , 04h
 write_n_byte(2,3,temp_write);
 read_n_byte(2,3,temp_read);
//读24cxx的01h地址并验证是否是刚才写进去的08h
 if(temp_read[0]==2)
	P15=0;//是,点亮P1.6脚的发光二极管
 if(temp_read[1]==3)
	P14=0;//是,点亮P1.6脚的发光二极管
 if(temp_read[2]==4)
	P13=0;//是,点亮P1.6脚的发光二极管
 while(1);//检验完成;
}
//*******************对24cxx读一个字节***********************
//描    述:实现单片机模拟IIC总线对24cxx的读一个字节
//入口参数:uchar address : 要读的地址
//返回参数:uchar i : 返回读到的数据
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//***********************************************************
uchar read_byte(uchar address)
{
   uchar i;
   start(); 
   IIC_send(device_addr);
   wait_ack();
 
   IIC_send(address);
   wait_ack(); 

   start();
   IIC_send(device_addr+1); 
   wait_ack();

   i=IIC_read(); 
   stop();
   return(i);
}
//*******************对24cxx读n个字节***********************
//描    述:实现单片机模拟IIC总线对24cxx的读n个字节
//入口参数:uchar address : 要读的地址
//         uchar r_num : 要读的数量
//         uchar *p : 读出来存放的首地址
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//***********************************************************
void read_n_byte(uchar address,uchar r_num,uchar *p)
{uchar i;
   start(); 
   IIC_send(device_addr);
   wait_ack();
 
   IIC_send(address);
   wait_ack(); 
   for(i=0;i<r_num;i++)
   {
     start();
     IIC_send(device_addr+1); 
     wait_ack();
     *p=IIC_read();
	 p++;
	} 
   stop();
}
//*******************对24cxx写n个字节***********************
//描    述:实现单片机模拟IIC总线对24cxx的写n个字节
//入口参数:uchar address : 要写入的开始地址
//         uchar w_num : 要写入数据的数量
//         uchar *p : 要写入的数据开始地址
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//**********************************************************
void write_n_byte(uchar address,uchar w_num,uchar *p)
{uchar i;
   start(); 
   IIC_send(device_addr);
   wait_ack();


   IIC_send(address);
   wait_ack();
   for(i=0;i<w_num;i++)
   {
     IIC_send(*p);
     wait_ack();
	 p++;
   }
   stop();

}
//*******************对24cxx写一个字节***********************
//描    述:实现单片机模拟IIC总线对24cxx的写一个字节
//入口参数:uchar address : 要写的地址
//         uchar info : 要写入的数据
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//***********************************************************
void write_byte(uchar address,uchar info)
{
   start(); 
   IIC_send(device_addr);
   wait_ack();

   IIC_send(address);
   wait_ack();
   
   IIC_send(info);
   wait_ack();
   
   stop();

}

//******************时间延迟函数**********************
//描  述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//出口参数:无
//设计人:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//****************************************************
void delay_time(unsigned int i)
{
 while(i)
  i--;
}
//****************IIC产生start信号函数*****************
//描    述:模拟IIC总线发送一个start信号
//入口参数:无
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//*****************************************************
void start()
{
   sda=1;
   delay_time(1);
   scl=1;
   delay_time(1);
   sda=0;
   delay_time(1);
   scl=0;
   delay_time(1);
}
//****************IIC产生stop信号函数******************
//描    述:模拟IIC总线发送一个stop信号
//入口参数:无
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//*****************************************************
void stop()
{
   scl=0;
   delay_time(1);
   sda=0;
   delay_time(1);
   scl=1;
   delay_time(1);
   sda=1;
   delay_time(2500);

}
//*******************IIC发送数据函数********************
//描    述:模拟IIC总线发送数据
//入口参数:uchar temp : 待发送的数据
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//******************************************************
void IIC_send(uchar temp)
{
   uchar i;
   scl=0;
   delay_time(1);
   for (i=0;i<8;i++)
   {
 	  if (temp&0x80)
	  sda=1; 
	  else
	  sda=0;
	  delay_time(1);
	  scl=1; 
	  delay_time(1);
	  scl=0;
      delay_time(1);
	  sda=0;
	  temp=temp<<1; 
   }
}
//****************从IIC总线上读数据函数****************
//描    述:从IIC总线上读一个byte的数据
//入口参数:无
//返回参数:uchar k : 返回从总线上读到的数据
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//*****************************************************
uchar IIC_read(void)
{
   uchar i,j,k=0;
   scl=0; 
   delay_time(1);

   for (i=0;i<8;i++){
      sda=1;
      delay_time(1);
	  scl=1; 
	  delay_time(1);
      if (sda==1) 
	  j=1;
      else 
	  j=0;
      k=(k<<1)|j; 
	  scl=0;
	  delay_time(1);
   }
   return(k);
}
//*******************等待应答函数***********************
//描    述:等待24cxx的应答信号
//入口参数:无
//返回参数:无
//设    计:ycj
//最后修改:时间(2006.5.4)  修改人(ycj)
//******************************************************
void wait_ack(void)
{unsigned char i;
   scl=0;
   delay_time(1);
   sda=1;
   delay_time(1);
   scl=1;
   delay_time(1);
   while(1)
   {
   if (sda==1)
   i++;
   else
   break;
    if (i==255)
   while(1);
   }
scl=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -