找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1927|回复: 0
打印 上一主题 下一主题
收起左侧

单片机学习-EEPROM实验

[复制链接]
跳转到指定楼层
楼主
ID:107189 发表于 2016-3-6 12:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
EEPROM实验板采用ATMEL公司的AT24C02芯片,该芯片为单页256字节的存储器,通过IIC总线可以对芯片进行读写操作。SCL和SDA分别接单片机的P3.6和P3.7。
C语言源程序:
#include<reg52.h> //52单片机头文件包含
#define uchar unsigned char //宏定义 uchar 为 unsigned char
sbit sda=P3^6; //定义sda接口引脚
sbit scl=P3^7; //定义scl接口引脚
uchar a; //定义无符号字符变量 a
void delay()//延时函数 执行2条空语句
{ ;;}
void start() //开始信号
{
    sda=1;//sda置1
    delay();//延时
    scl=1;//scl置1
    delay();//延时
    sda=0;//sda置0
    delay();//延时
}
void stop()//停止信号
{
    sda=0;//sda置0
    delay();//延时
    scl=1;//scl置1
    delay();//延时
    sda=1;//sda置1
    delay();//延时
}
void respons() //应答
{
    uchar i;//定义无符号字符变量 i
    scl=1;//scl置1
    delay();//延时
    while((sda==1)&&(i<250)) i++; //如果sda=1并且i<250的话循环执行i++
    scl=0;//scl置0
    delay();//延时
}
void init() //初始化
{
    sda=1;//sda置1
    delay();//延时
    scl=1;//scl置1
    delay();//延时
}
void write_byte(uchar date) //写一个字节
{
    uchar i,temp; //定义无符号字符变量i,temp
    temp=date;//将参数date赋值给temp
    for(i=0;i<8;i++)    //循环8次逐位写入
    {
        temp=temp<<1;//左移1位
        scl=0;//scl置0
        delay();//延时
        sda=CY;//进位标志赋值给sda完成写入
        delay();//延时
        scl=1;//scl置1
        delay();延时
    }
    scl=0;//scl置0
    delay();//延时
    sda=1;//sda置1
    delay();//延时
}
uchar read_byte() //读EEPROM中的一个字节
{
    uchar i,k; //定义无符号字符变量i,k
    scl=0;//scl置0
    delay();//延时
    sda=1;//sda置1
    delay();//延时
    for(i=0;i<8;i++) //分8次读取每次读一位
    {
        scl=1;//scl置1
        delay();//延时
        k=(k<<1) | sda;//k左移1位与sda相或得到1位的值
        scl=0;//scl置0
        delay();//延时
    }
    return k;//读取完毕返回读取到的值
}
void delay1(uchar x) //延时函数2
{
    uchar a,b; //定义无符号字符变量a,b
    for(a=x;a>0;a--)//循环x次
    {
        for(b=100;b>0;b--);//循环100次
    }
}        
void wirte_add(uchar address,uchar date) //按地址写入数据函数
{
    start();//开始信号
    write_byte(0xa0); //写入指令0xa0;
    respons();//应答
    write_byte(address);//写入地址
    respons();//应答
    write_byte(date)//写入数据
    respons()//应答
    stop();//停止
}
uchar read_add(uchar address)//读取一个地址的数据
{
    uchar date;//定义无符号字符变量date用于接收读取的数据
    start();//开始信号
    write_byte(0xa0);//读写指令写入
    respons();//应答
    write_byte(address);//写入地址
    respons();//应答
    start();//开始信号
    write_byte(0xa1);//读指令写入
    respons();//应答
    date=read_byte();//读入地址的数据赋值给date
    stop();//停止
    return date;//返回读到的值
}
void main() // 入口函数
{
    init();//对EEPROM进行初始化
    write_add(0x01,0x04);//在EEPROM的0x01号地址写入数据0x04
    delay1(100);//延时100ms
    write_add(0x02,0x08);//在EEPROM的0x02号地址写入数据0x08
    delay1(100);//延时100ms
    write_add(0x03,0);//在EEPROM的0x03号地址写入数据0
    delay1(100);//延时100ms
    P1=read_add(0x01)//读入0x01号地址的值赋值给P1
    while(1);//无限循环
}
//实验现象由于0x01号地址写入的是0x04 (00000100)所以第三个发光二极管被熄灭

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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