登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 12C总线及AT24C02实验

[复制链接]
发表于 2022-2-5 11:35:58 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 学会
开始时间: 2022-02-01
结束时间: 2022-02-01
#include <reg51.h>
#include <intrins.h>
#define OP_READ 0xal
#define OP_WRITE 0xa0
typedef unsigned char u8;
typedef unsigned int u16;
        sbit         SDA=P2^0;
  sbit  SCL=P2^1;
  sbit  DS1302=P2^4;
  sbit  LCD1602=P2^5;
u8 code display[]=
{
          0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
        0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF
}
void delay1ms()               
{
        u8 i, j;


        i = 12;
        j = 168;
        do
        {
                while (--j);
        } while (--i);
}
void delaynms(u8 n)
{
   u8 i;
        for(i=0;i<n;i++)
           delay1ms();
void start()//开始位
{
        SDA=1;//sda初始化要求是高电平
        SCL=1;//数据开始传送scl要高电平
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=0;//sda下降意味着开始

  _nop_();
        _nop_();
        _nop_();
        _nop_();
  SCL=0;//意味着数据开始传输       
}
void stop()//停止位
{
        SDA=0;//sda初始化要求是低电平
        SCL=1;//数据开始传送scl要高电平
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=1;//sda上升认为是结束信号

  _nop_();
        _nop_();
        _nop_();
        _nop_();
  SCL=0;
  SDA=0;
}
unsigned char readdate()
        //从AT24C  移入数据到MCU
{
        u8 i;
        u8 x;
        for(i=0;i<8;i++)
        {
                SCL=1;
                x<<=1;//将x中的各二进制左移一位
                X|=(u8)SDA;//将sda中的数据按位或存到x中
                SCL=0;//在scl下降沿读出数据
       
               
        }
        return(x);
}
bit writecurrent(u8 y)
{
        u8 i;
        bit ack_bit;
        for(i=0;i<8;i++)
        {
                SDA=(bit)(y&0x80);
                _nop_();
                SCL=1;
                _nop_();
                _nop_();
                SCL=0;
                y<<=1;       
}
SDA=1;
_nop_();
_nop_();
SCL=1;
  _nop_();
_nop_();
  _nop_();
_nop_();
ack_bit=SDA;

SCL=0;
return ack_bit;
}

void writeset(u8 add,u8 dat)
{
        start();
        writecurrent(OP_WRITE);
        writecurrent(add);
        writecurrent(dat);
        stop();
        delaynms(20);
}
u8 readset(u8 set_addr)
{
        start();
        writecurrent(OP_WRITE);
        writecurrent(set_addr);
        return(readcurrent());
}
main (void)
{
        u8 i;
        DS1302=0;
        LCD1602=0;
        SDA=1;
        SCL=1;
        for(i=0;i<16;i++)
        {
                writeset(i,display[i]);
        }
        for(i=0;i<16;i++)
        {
                P1=readset(i);
                delaynms(200);
                delaynms(200);
        }
       
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表