zoukankan      html  css  js  c++  java
  • 基于51单片机的I2C通信及从AT24C02读取保存数据来显示在4位数码管上的项目工程

    /***Main.C***/
    #include <reg52.h>//包含52单片机头文件
    #include "I2C.H"//包含I2C.H头文件
    #define uchar unsigned char//自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
    #define uint unsigned int//自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)    
    uchar i2cwriteflag;//AT24C02存储芯片写入标志位变量
    uchar qian,bai,shi,ge;//数值个位变量、数值十位变量、数值百位变量、数值千位变量
    uchar valuege,valueshi,valuebai,valueqian;//数值个位数变量、数值十位数变量、数值百位数变量、数值千位数变量
    uint count,value;//声明定时器0中断次数变量、数值变量
    uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
      //  void Delay100us()    //晶振11.0592MHz,100微妙延时。
    //{
    //   unsigned char i, j;
    //   _nop_();
    //   _nop_();
    //   i = 2;
    //   j = 15;
    //   do
    // {
    //    while (--j);
    //   } 
    //   while (--i);
    // }
      void delay(uint z)//延时程序
    {
       uint x,y;
       for(x=z;x>0;x--)
        for(y=110;y>0;y--);
     }
    //  void ShuMaGuanDisplayValue(uint value)//数码管显示数值函数
    //{  
    //   qian=value%10000/1000;//数码管千位变量
    //   bai=value%1000/100;//数码管百位变量
    //   shi=value%100/10;//数码管十位变量
    //   ge=value%10;//数码管个位变量
    //  
    //   P2=0xfe;//数码管千位显示位
    //   P0=table[qian];//数码管千位数值显示
    //   delay(5);//延时 
    //
    //   P2=0xfd;//数码管百位显示位
    //   P0=table[bai];//数码管百位数值显示
    //   delay(5);//延时
    //
    //
    //   P2=0xfb;//数码管十位显示位
    //   P0=table[shi];//数码管十位数值显示
    //   delay(5);//延时
    //
    //   P2=0xf7;//数码管个位显示位
    //   P0=table[ge];//数码管个位数值显示
    //   delay(5);//延时
    
    //   weixuan=1;
    //   P0=0xfe;//数码管千位显示位
    //   weixuan=0;
    //   duanxuan=1;
    //   P0=table[qian];//数码管千位数值显示
    //   duanxuan=0;
    //   P0=0xff;
    //   Delay(5);//延时
    //
    //   weixuan=1;
    //   P0=0xfd;//数码管百位显示位
    //   weixuan=0;
    //   duanxuan=1;
    //   P0=table[bai];//数码管百位数值显示
    //   duanxuan=0;
    //   P0=0xff;
    //   Delay(5);//延时
    //  
    //   weixuan=1;
    //   P0=0xfb;//数码管十位显示位
    //   weixuan=0;
    //   duanxuan=1;
    //   P0=table[shi];//数码管十位数值显示
    //   duanxuan=0;
    //   P0=0xff;
    //   Delay(5);//延时
    //
    //   weixuan=1;
    //   P0=0xf7;//数码管个位显示位
    //   weixuan=0;
    //   duanxuan=1;
    //   P0=table[ge];//数码管个位数值显示
    //   duanxuan=0;
    //   P0=0xff;
    //   Delay(5);//延时 
    // }
      void ShuMaGuanDisplayValue(uchar valuege,valueshi,valuebai,valueqian)//数码管显示数值函数
    {  
       P2=0xf7;//数码管个位显示位
       P0=table[valuege];//数码管个位数值显示
       delay(5);//延时
    
       P2=0xfb;//数码管十位显示位
       P0=table[valueshi];//数码管十位数值显示
       delay(5);//延时
    
       P2=0xfd;//数码管百位显示位
       P0=table[valuebai];//数码管百位数值显示
       delay(5);//延时
    
       P2=0xfe;//数码管千位显示位
       P0=table[valueqian];//数码管千位数值显示
       delay(5);//延时 
      }  
      void Timer0Init()//定时器0初始化
    {
       TMOD=0x01;//设定定时器类型为定时器0,定时器工作模式为模式0。
       TH0=(65536-50000)/256;//TH0装初值
       TL0=(65536-50000)%256;//TL0装初值
       EA=1;//开启定时器总中断
       ET0=1;//开启定时器0中断开关
       TR0=1;//启动定时器0
     }
      void Timer0() interrupt 1//定时器0中断函数
    {
       TH0=(65536-50000)/256;//TH0重新装值
       TL0=(65536-50000)%256;//TL0重新装值
       count++;//定时器0中断次数变量先赋值再加
       if(count==18)//判断定时器0中断次数变量是否为18次
      {
        count=0;//定时器0中断次数变量置0
        i2cwriteflag=1;//AT24C02存储芯片写入标志位变量置1
        valuege++;//数值个位数变量先赋值再加
        if(valuege==10)//判断数值个位数变量是否为10
       {
         valuege=0;//数值个位数变量置0 
         valueshi++;//数值十位数变量先赋值再加
         if(valueshi==10)//判断数值十位数变量是否为10
        {
          valueshi=0;//数值十位数变量置0
          valuebai++;//数值百位数变量先赋值再加
          if(valuebai==10)//判断数值百位数变量是否为10
         {
           valuebai=0;//数值百位数变量置0
           valueqian++;//数值千位数变量先赋值再加
           if(valueqian==10)//判断数值千位数变量是否为10
          {
            valueqian=9;//数值千位数变量置9       
           }
          }
         }
        }
        if(valuege==9&&valueshi==9&&valuebai==9&&valueqian==9)//判断数值个位数变量是否为9与数值十位数变量是否为9与数值百位数变量是否为9与数值千位数变量是否为9
       {
         valuege=0;//数值个位数变量置0
         valueshi=0;//数值十位数变量置0
         valuebai=0;//数值百位数变量置0
         valueqian=0;//数值千位数变量置0
        } 
       }
      }
      void main()//主函数
    {
       Timer0Init();//定时器0初始化函数
       i2cinit();//I2C初始化信号函数 
    //   value=i2cread_add(0xa0,0);
       valuege=i2cread_add(0xa0,0);//读出AT24C02存储芯片第0地址所写数值个位数变量
       valueshi=i2cread_add(0xa0,1);//读出AT24C02存储芯片第1地址所写数值十位数变量
       valuebai=i2cread_add(0xa0,2);//读出AT24C02存储芯片第2地址所写数值百位数变量
       valueqian=i2cread_add(0xa0,3);//读出AT24C02存储芯片第3地址所写数值千位数变量
       while(1)//固定循环
     {  
        if(i2cwriteflag==1)//判断AT24C02存储芯片写入标志位变量是否为1
      {
         i2cwriteflag=0;//AT24C02存储芯片写入标志位变量置0
    //   i2cwrite_add(0xa0,0,value);
         i2cwrite_add(0xa0,0,valuege);//往AT24C02存储芯片第0地址写入数值个位数变量
         ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//数码管显示数值
         i2cwrite_add(0xa0,1,valueshi);//往AT24C02存储芯片第1地址写入数值十位数变量
         ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//数码管显示数值
         i2cwrite_add(0xa0,2,valuebai);//往AT24C02存储芯片第2地址写入数值百位数变量
         ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//数码管显示数值
         i2cwrite_add(0xa0,3,valueqian);//往AT24C02存储芯片第3地址写入数值千位数变量
         ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//数码管显示数值
       }
    //    ShuMaGuanDisplayValue(value);//数码管显示数值
        ShuMaGuanDisplayValue(valuege,valueshi,valuebai,valueqian);//数码管显示数值
      }      
     }
    /***I2C.C***/
    #include "I2C.H"//包含I2C.H头文件
    #define uchar unsigned char//自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
    #define uint unsigned int//自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)
      void delay()//延时程序
    {
       ;;
     }
      void i2cstart()//单片机I2C总线启动信号函数
    {
       SDA=1;//AT24C02芯片串行数据端置高电平
       delay();//延时
       SCL=1;//AT24C02芯片串行时钟输入端置高电平
       delay();//延时
       SDA=0;//AT24C02芯片串行数据端置低电平
       delay();//延时
     }
      void i2cstop()//单片机I2C总线停止信号函数
    {
       SDA=0;//AT24C02芯片串行数据端置低电平
       delay();//延时
       SCL=1;///AT24C02芯片串行时钟输入端置高电平
       delay();//延时
       SDA=1;//AT24C02芯片串行数据端置高电平
       delay();//延时
     }
      void i2crespons()//单片机I2C应答信号函数
    {
       uchar i;//计时变量
       SCL=1;//AT24C02芯片串行时钟输入端置高电平
       delay();//延时
       while((SDA==1)&&(i<250)) //加个延时退出,防止没应答进入死循环。
       i++;//计时变量先赋值再加
       SCL=0;//AT24C02芯片串行时钟输入端置低电平
       delay();//延时
     }
    //  void i2cnorespons()//I2C不应答信号函数
    //{
    //   SCL=1;
    //   delay();
    //   SDA=1; 
    //   SCL=0;
    //   delay();
    // }
      void i2cinit()//单片机I2C总线初始化信号函数
    {
       SDA=1;//AT24C02芯片串行数据端置高电平
       delay();//延时
       SCL=1;//AT24C02芯片串行时钟输入端置高电平
       delay();//延时
     }
      void i2cwrite_byte(uchar value)//单片机I2C总线向从机写一个字节信号函数
    {
       uchar i,temp;//字节位变量、临时变量
       temp=value;//数据变量赋给临时变量
       for(i=0;i<8;i++)//循环8位
     {
        temp=temp<<1;//临时变量左移一位
        SCL=0;//AT24C02芯片串行时钟输入端置低电平
        delay();//延时
        SDA=CY;//CY是进位标志
        delay();//延时
        SCL=1;//AT24C02芯片串行时钟输入端置高电平
        delay();//延时
       }
       SCL=0;//AT24C02芯片串行时钟输入端置低电平
       delay();//延时
       SDA=1;//AT24C02芯片串行数据端置高电平
       delay();//延时
     }
      uchar i2cread_byte()//单片机I2C总线接口向从机读一个字节信号函数
    {
       uchar i,k;//字节位变量、临时变量
       SCL=0;//AT24C02芯片串行时钟输入端置低电平
       delay();//延时
       SDA=1;//AT24C02芯片串行数据端置高电平
       delay();//延时
       for(i=0;i<8;i++)//循环8位
     {
       SCL=1;//AT24C02芯片串行时钟输入端置高电平
       delay();//延时
       k=(k<<1)|SDA;//一个字节
       SCL=0;//AT24C02芯片串行时钟输入端置低电平
       delay();//延时
      }
       return k;//返回临时变量
     }
      void i2cwrite_add(uchar salveaddress,uchar address,uint value)//单片机I2C总线接口向某个从机的某个地址写一个字节数据信号函数
    {
       i2cstart();//单片机I2C总线接口开始信号
       i2cwrite_byte(salveaddress);//发送设备地址+写信号
       i2crespons();//单片机I2C总线接口应答信号
       i2cwrite_byte(address);//发送存储单元地址
       i2crespons();//单片机I2C总线接口应答信号
       i2cwrite_byte(value);//单片机I2C总线接口往AT24C02芯写入数据
       i2crespons();//单片机I2C总线接口应答信号
       i2cstop();//单片机I2C总线接口停止信号
     }
      uint i2cread_add(uchar salveaddress,uchar address)//单片机I2C总线接口向某个从机的某个地址读一个字节数据信号函数
    {
       uint information;//声明一个数据变量
       i2cstart();//单片机I2C总线接口开始信号
       i2cwrite_byte(salveaddress);//发送设备地址+写信号
       i2crespons();//单片机I2C总线接口应答信号
       i2cwrite_byte(address);//发送存储单元地址
       i2crespons();//单片机I2C总线接口应答信号
       i2cstart();//单片机I2C总线接口开始信号
       i2cwrite_byte(salveaddress+1);//发送设备地址+读信号
       i2crespons();//单片机I2C总线接口应答信号
       information=i2cread_byte();//单片机I2C总线接口读取AT24C02芯片所存数据赋给数据变量
    //   i2cnorespons();//单片机I2C总线接口不应答信号
       i2cstop();//单片机I2C总线接口停止信号
       return information;//返回数据变量
     }
    /***I2C.H***/
    #ifndef __I2C_H__//防止Main.C头文件和I2C.C头文件同时编译i2c.h文件出现多重定义
    #define __I2C_H__//
    #include <reg52.h>//包含52单片机头文件
    #define uchar unsigned char//自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
    #define uint unsigned int//自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)
    sbit SCL=P3^0;//位定义AT24C02芯片串行时钟输入端为单片机P3.0端口
    sbit SDA=P3^1;//位定义AT24C02芯片串行数据端为单片机P3.1端口
    void delay();//延时程序
    void i2cstart();//单片机I2C总线启动信号函数
    void i2cstop();//单片机I2C总线停止信号函数
    void i2crespons();//单片机I2C总线应答信号函数
    //void i2cnorespons();//单片机I2C总线不应答信号函数
    void i2cinit();//单片机I2C总线初始化信号函数
    void i2cwrite_byte(uchar value);//单片机I2C总线向从机写一个字节信号函数
    uchar i2cread_byte();//单片机I2C总线接口向从机读一个字节信号函数
    void i2cwrite_add(uchar salveaddress,uchar address,uint value);//单片机I2C总线接口向某个从机的某个地址写一个字节数据信号函数
    uint i2cread_add(uchar salveaddress,uchar address);//单片机I2C总线接口向某个从机的某个地址读一个字节数据信号函数
    #endif

  • 相关阅读:
    创新工场 笔试1
    C++的异常处理
    阿里笔试题2
    阿里笔试题1
    控制CPU占用率曲线
    再探结构体字节对齐问题
    1401
    pancake sort的几个问题
    CF198 D2
    谨慎设计一个单例类
  • 原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12330431.html
Copyright © 2011-2022 走看看