zoukankan      html  css  js  c++  java
  • IIC总线

    Inter IC Bus 通过PHILIPS该公司推出,是近年来一种新的总线标准在微电子领域广泛使用的通信控制,他是同步通信的一种特殊形式。


    /* 利用定时器产生一个0~99秒变化的秒表,而且显示在数码管上,每过一秒将这个变化的数写入AT24C02内部。当关闭电源,并再次打开
    电源,单片机先从AT24C02中将原来写入的数读取出来,接着在数码管上显示*/


    #include <reg52.h>
    #define uchar unsigned char 
    #define uint unsigned int 
    bit write=0; //写24C02的标志
    sbit sda=P2^0;
    sbit scl=P2^1;
    sbit dula=P2^6;
    sbit wela=P2^7;
    uchar sec,tcnt;
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    void delay()
    {
    ;
    ;
    }
    void delay1ms(uint z)
    {
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }
    //将总线都拉高以释放总线
    void start() //開始信号
    {
    sda=1;
    delay();
    scl=1;
    delay();
    sda=0;
    delay();
    }
    //SCL在高电平期间,SDA一个下降沿启动信号
    void stop() //停止信号
    {
    sda=0;
    delay();
    scl=1;
    delay();
    sda=1;
    delay();
    }
    void  respons() //应答信号
    {
    uchar i;
    scl=1;
    delay();
    while((sda==1)&&(i<250)) 
    //SCL在高电平期间,SDA被从设备拉为低电平表示应答,(sda=1)和(i<255)相与的关系表示若在一段时间内没有收到从器件
    //的应答则主器件默认从器件已经收到数据而不在等待应答信号
    i++;
    scl=0;
    delay();
    }
    void init()
    {
    sda=1;
    delay();
    scl=1;
    delay();
    }


    void write_byte(uchar date)
    {
    uchar i,temp;
    temp=date;
    for(i=0;i<8;i++)
    {
    temp=temp<<1;
    scl=0;
    delay();
    sda=CY;
    delay();
    scl=1;
    delay();
    }
    scl=0;
    delay();
    sda=1;
    delay();
    }
    //串行发送一个字节是,须要把这个字节中的8为一位一位地发送出去,"temp=temp<<1;"表示将temp左移一位。最高位将
    //移入PSW寄存器的CY位中,然后将CY赋给SDA进而在SCL的控制下发送出去
    uchar read_byte()
    {
    uchar i,k;
    scl=0;
    delay();
    sda=1;
    for(i=0;i<8;i++)
    {
    scl=1;
    delay();
    k=(k<<1)|sda;
    scl=0;
    delay();
    }
    delay();
    return k;
    }
    //串行接受一个字节时须将8位一位一位地接受。然后再组合成一个字节。上面的代码中定义一个暂时变量k,将k左移一位后与SDA进行"或“
    //运算 ,依次把8个独立的位放入一个字节中来完毕接受
    void write_add(uchar address,uchar date)
    {
    start();
    write_byte(0xa0);
    respons();
    write_byte(address);
    respons();
    write_byte(date);
    respons();
    stop();
    }


    uchar read_addr(uchar address)
    {
    uchar date;
    start();
    write_byte(0xa0);
    respons();
    write_byte(address);
    respons();
    start();
    write_byte(0xa1);
    respons();
    date=read_byte();
    stop();
    return date;
    }


    void display(uchar bai_c,uchar sh_c)
    {
    dula=0; //关闭段选
    P0=table[bai_c]; //显示第一位
    dula=1; //打开段选
    dula=0; //关闭段选
    wela=0; //关闭位选
    P0=0x7e; //P0口赋值
    wela=1;
    wela=0;
    delay1ms(5);

    dula=0;
    P0=table[sh_c]; //显示第二位
      dula=1;
    dula=0;
    wela=0;
    P0=0x7d;
    wela=1;
    wela=0;
    delay1ms(5);
    }


    void main()
    {
    init();
    sec=read_addr(2); //读出保存的数据赋予sec
    if(sec>100) //防止首次读取出错误的数据
    sec=0;
    TMOD=0x01; //定时器工作在方式1
    ET0=1;
    EA=1;
    TH0=(65536-50000)/256; //对TH0 TL0赋值
    TL0=(65536-50000)%256; //使定时器0.05秒中断一次
    TR0=1; //開始计时
    while(1)
    {
    display(sec/10,sec%10);
    if(write==1)
    {
    write=0; //清0
    write_add(2,sec); //在24c02的地址2中写入数据sec
    }
    }
    }


    void t0() interrupt 1 //定时器中断服务函数
    {
    TH0=(65536-50000)/256; //对TH0 TL0赋值
    TL0=(65536-50000)%256; //重装计数初值
    tcnt++; //每过50ms tcnt加一
    if(tcnt==20) //计满20次1秒时
    {
    tcnt=0; //又一次再计
    sec++;
    write=1; //1秒写一次24C02
    if(sec==100) //定时器100秒,再从零開始计数
    sec=0;
    }
    }

    在第一的开始主程序读取最后写入AT24C02数据,首次两个操作后面AT24C02当意外和补充


  • 相关阅读:
    ZoneJS 的原理与应用
    RxJS 中的观察者和迭代器模式
    前端三大框架:数据绑定与数据流
    Angular 的前世今生
    验证Kubernetes YAML的最佳实践和策略
    GitOps初阶指南:将DevOps扩展至K8S
    如何使用Istio 1.6管理多集群中的微服务?
    5个规则,确保你的微服务优化运行
    使用Thanos实现Prometheus指标联邦
    丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5045936.html
Copyright © 2011-2022 走看看