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

📄 24c04-p0-p2-led.c

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 C
字号:
/*******************************************************************
*                                                                  *
* ME500单片机开发系统演示程序 - 多花样流水灯                       *
*                                                                  *
* P0 P2 LED显示                                                    *
*                                                                  *
* 用数据块写方式将数据写入24C04芯片内,再将其数据读出送LED显示。   *
*                                                                  *
;* 版本: V1.0 (2007/1/8)                                          *
;* 作者: gguoqing (Email: gguoqing@willar.com)                    *
;* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) *
;* 邮箱: support@willar.com                                       *
*                                                                  *
*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved  *
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!        *
*                                                                  *
********************************************************************
*                                                                  *
* 24C04的写入数据块最大字节数n为16,一次写入的字节数m不能多于n.     *
*                                                                  *
*******************************************************************/
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

uchar code  senddata1[16]= {
	    0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
        0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF };

uchar code  senddata2[16]= {
        0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,
        0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF };

uchar code  senddata3[16]= {
        0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x9F,
		0xCF,0xE7,0xF3,0xF9,0xFC,0xFF,0xFF,0xFF };

uchar code  senddata4[16]= {		
		0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,
        0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF };

uchar idata display[64]={0xff,0xff };  //数据存储区

sbit SDA = P3^5;     //串行数据   
sbit SCL = P3^4;     //串行时钟

bit  ack;

/**********************************************************

  延时子程序

**********************************************************/
void delayms(uint ms) 
{
   uchar k;
   while(ms--)
   {
     for(k = 0; k < 120; k++);
   }
}

/**********************************************************

 4us延时函数

**********************************************************/
void  delayNOP()
{
   _nop_();_nop_();
   _nop_();_nop_();
}

/**********************************************************

  起始条件函数

**********************************************************/
void I2C_start()

{
  SDA = 1;
  SCL = 1;
  delayNOP();
  SDA = 0;
  delayNOP();
  SCL = 0;        //准备发送或接收数据
}

/**********************************************************

  停止条件函数

**********************************************************/
void I2C_stop()
{
  SDA = 0;
  SCL = 1;
  delayNOP();
  SDA = 1;         //发送I2C总线结束信号
  delayNOP();
  SCL = 0;
}

/**********************************************************

  I2C总线初始化函数

**********************************************************/
void  I2C_init()
{
   SCL = 0;
   I2C_stop();
}

/**********************************************************

  发送应答子函数

**********************************************************/
void  I2C_Ack()
{
   SDA = 0;
   SCL = 1;
   delayNOP();   
   SCL = 0;
   SDA = 1;
}

/**********************************************************

  发送非应答子函数

**********************************************************/
void  I2C_NAck()
{
   SDA = 1;
   SCL = 1;
   delayNOP();   
   SCL = 0;
   SDA = 0;  
}

/**********************************************************

 从AT24C02移出数据到MCU

**********************************************************/
uchar RecByte()
{
   uchar i,read_data;
   read_data=0x00;
   SDA=1;                     //置数据线为输入方式
   for(i = 0; i < 8; i++)
   {     
     SCL = 1;
     read_data <<= 1;
     read_data |= SDA;
     delayNOP();
     SCL = 0;
	 delayNOP();
   }
   SCL = 0;
   delayNOP();
   return(read_data);
}

/**********************************************************

  字节数据传送函数
  写数据到AT24C04,
  ack=1,发送正常。ack=0,表示接收器无应答或损害。

**********************************************************/
uchar SendByte(uchar write_data) 
{
   uchar i;
   for(i = 0; i < 8; i++)    //循环移入8个位
   {
     SDA = (bit)(write_data & 0x80);
     _nop_();
     _nop_();   	  
	 SCL = 1;
     delayNOP();
     SCL = 0;
     write_data <<= 1;
   }

   delayNOP();
   SDA = 1;                  //释放总线,准备读取应答
   SCL = 1;
   delayNOP();
   if(SDA==1) ack=0;         //ack=0,表示非应答
   else       ack=1;
   SCL = 0;
   delayNOP();
   return ack;               //返回AT24C04应答位
}

/**********************************************************

 发送多字节数据函数

**********************************************************/
uchar  SendString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
{
   uchar  s;

   I2C_start();
   SendByte(Slave);          //发送器件地址
   if(ack==0) return(0);
   SendByte(Subaddr);        //发送器件子地址
   if(ack==0) return(0);

   for(s=0; s<Num; s++)
   {
     SendByte(*Source);      //发送数据
     if(ack==0) return(0);
     Source++;
   }
   I2C_stop();               //结束总线
   return(1);
}

/**********************************************************

 接收多字节数据函数


**********************************************************/
uchar  RecString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
{
   uchar  s;

   I2C_start();
   SendByte(Slave);          //发送器件地址
   if(ack==0) return(0);
   SendByte(Subaddr);        //发送器件子地址
   if(ack==0) return(0);
  
   I2C_start();
   SendByte(Slave+1);        //发送器件地址
   if(ack==0) return(0);

   for(s=0; s<Num; s++)
   {
     *Source=RecByte();      //接收数据
     I2C_Ack();              //发送应答位
     Source++;
   }
   I2C_NAck();               //发送非应答
   I2C_stop();               //结束总线
   return(1);
}

/**********************************************************

   主函数

**********************************************************/
main(void)
{
  uchar i,temp;
  I2C_init();

  SendString(0xa0,0x00,senddata1,16);  
  delayms(5);
  SendString(0xa0,0x10,senddata2,16);
  delayms(5);
  SendString(0xa0,0x20,senddata3,16);
  delayms(5);
  SendString(0xa0,0x30,senddata4,16);

  delayms(500); 
  RecString(0xa0,0x00,display,64);  //从AT24C04读出数据

  while(1)
  {
    for(i=0; i<64; i++)             //显示数据
    {
	  temp= display[i];
      P0 = temp;
	  P2 = temp;
	  delayms(300);
    }
  } 
}

/**********************************************************/

⌨️ 快捷键说明

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