找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+AT24C02模块重新上电后保存原先设置数据显示1602为什么还是没变,是原来的

[复制链接]
跳转到指定楼层
楼主
ID:725584 发表于 2020-5-5 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************
函数名称:void main()
函数作用:主函数
参数说明:
********************************************************/
void main()
{
        LCD_init();   //LCD1602初始化
        T0_init();    //定时器0初始化
        Int0_init();  //外部中断初始化

        if(key_jian==0)                  //手动复位初始默认价格
        {
                delayms(100);
                if(key_jian==0)
                {
                        AT24C02_write_date(128,white_price);    //写入【公里价】数据保存,地址0~255均可
                        AT24C02_write_date(5,start_price/100);    //写入【起步价】数据保存
                }
        }        
        
        white_price=AT24C02_read_date(128);    //读取存储的【公里价】数据
        start_price=AT24C02_read_date(5)*100;//读取存储的【起步价】数据
        lcd1602_write_pic(0x01,pic2);        //将自定义字符“¥”写入LCD1602
        while(1)                                                         //死循环
        {
                scan();                                         //按键检测处理
                Read_time();                                         //读取时间
                if(strat_f==1)                                         //非初始界面显示下
                {
                        if(set_f==0)                     //未设置时
                        {
                                if(start==1)             //当处于计价模式下
                                {
                                        display();                         //显示开始计价界面
                                        if(moto_f==1&&TR0==0)//判断是否满足开启电机的条件
                                                TR1=1;                         //打开定时器1开始控制开启电机
                                        else                                 
                                        {
                                                moto=1;                         //关闭电机
                                                TR1=0;                         //关闭定时器1
                                        }
                                }
                                else                             //否则,在结束计价模式
                                        display2();                         //显示结算总价钱
                        }
                        else                           
                                if(set_f<3)                     //在设置计价参数模式
                                        display3();                         //显示计价参数设置界面
                                else                             //否则,在校准时间
                                {
                                        Read_time();                 //读取时间
                                        display4();                         //显示校准时间界面
                                }
                }
                else
                {
                        if(f==1)                                         //长时间未操作或设置完成,自动恢复初始界面,同时保存设置
                        {
                                if(set_f!=0)                         //在设置退出时需要保存数据
                                {
                                        set_f=0;                         //清除设置标志
        
                                        AT24C02_write_date(128,white_price);          //写入【公里价】数据保存
                                        AT24C02_write_date(5,start_price/100);//写入【起步价】数据保存
        
                                        Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//将设置的分钟写入DS1302
                                        Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);//将设置的秒钟写入DS1302
                                }
                                LCD_write_command(0X01);                          //清除屏幕显示
                                delay_n40us(100);                                          //延时等待清除完成
                                f=0;                                                                  //重置变量
                        }
                        lcd1602_write_character(4,1,"THE TAXI");  //显示"THE TAXI"
                        LCD_disp_char(4,2,ASCII[time[2]/10]);          //显示当前时间
                        LCD_disp_char(5,2,ASCII[time[2]%10]);
                        LCD_disp_char(6,2,':');
                        LCD_disp_char(7,2,ASCII[time[1]/10]);
                        LCD_disp_char(8,2,ASCII[time[1]%10]);
                        LCD_disp_char(9,2,':');
                        LCD_disp_char(10,2,ASCII[time[0]/10]);
                        LCD_disp_char(11,2,ASCII[time[0]%10]);
                }
        }
}


/*************************************************************
                      AT24C02头文件

实现功能:AT24C02的控制

补充说明:
***************************************************************/
#ifndef _AT24C02_H_
#define _AT24C02_H_
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

/*********************AT24C02引脚定义*********************/
sbit sda=P3^6;                 //数据输出线
sbit scl=P3^5;                //时钟线

/*********************AT24C02函数定义*********************/
void  AT24C02_delay(uint n);                                            //延时40*n微秒
void  AT24C02_start();                                                           //开始信号
void  AT24C02_stop();                                                           //停止信号
void  AT24C02_respons();                                                   //应答信号
void  AT24C02_write(uchar date);                                   //写数据
uchar AT24C02_read();                                                           //读数据
void  AT24C02_write_date(uchar address,uchar date);//向address地址写输date数据
uchar AT24C02_read_date(uchar address);                           //向address读出数据并返回

/********************************************************
函数名称:void AT24C02_delay(uint n)
函数作用:AT24C02延时函数
参数说明:延时40*n微秒
********************************************************/
void AT24C02_delay(uint n)
{
        uint i;
        uchar j;
        for(i=n;i>0;i--)
        for(j=0;j<2;j++);   
}

/*********************************************************
函数名称:void AT24C02_start()
函数作用:AT24C02开始信号
参数说明:
*********************************************************/
void AT24C02_start()
{
        sda=1;
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        sda=0;
        _nop_();
        _nop_();
}

/*********************************************************
函数名称:void AT24C02_stop()
函数作用:AT24C02停止信号
参数说明:
*********************************************************/
void AT24C02_stop()
{
        sda=0;
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        sda=1;
        _nop_();
        _nop_();
}

/*********************************************************
函数名称:void AT24C02_respons()
函数作用:AT24C02应答信号
参数说明:
*********************************************************/
void AT24C02_respons()
{
        uchar i;
        scl=1;
        _nop_();
        _nop_();
        while((sda=1)&&(i<250))           //8个停止命令
                i++;
        scl=0;               
        _nop_();
        _nop_();
}

/*********************************************************
函数名称:void AT24C02_write(uchar date)
函数作用:AT24C02写一个字节数据
参数说明:
*********************************************************/
void AT24C02_write(uchar date)
{
         uchar i;
         scl=0;
         for(i=0;i<8;i++)
         {
                 sda = (bit)(date&0x80);        //读取最高位
                 _nop_();                 
                 scl=1;                 //拉高时钟线,制造上升沿,将sda引脚数据送入EEPROM
                 _nop_();
                 _nop_();
                 scl=0;                    //制造下降沿读取数据
                 date<<=1;           //左移一位
         }
}

/*********************************************************
函数名称:uchar AT24C02_read()
函数作用:AT24C02读一个字节数据
参数说明:
*********************************************************/
uchar AT24C02_read()
{
        uchar i,k;
        for(i=0;i<8;i++)
        {
                scl=1;                //锁定sda引脚使其数据稳定不变化
                k=(k<<1)|sda;  //读取sda引脚数据
                scl=0;          //刷新sda数据
        }
        return k;
}

/*********************************************************
函数名称:void AT24C02_write_date(uchar address,uchar date)
函数作用:AT24C02写数据
参数说明:将数据date写入到address地址里
器件地址:主器件在发送启动命令后开始传送,主器件发送相应的
         从器件的地址,8位从器件地址的高4位固定为1010。接
                 下来的3位用来定义存储器的地址,由于器件A2,A1,A0引
                 脚都接地,所以均为0。最后一位为读写控制位。“1”表
                 示对从器件进行读操作,“0”表示对从器件进行写操作。
                 因此向器件写入数据时地址为0xa0,读数据时地址为0xa1
*********************************************************/
void AT24C02_write_date(uchar address,uchar date)  
{
        AT24C02_start();                //开始信号
        AT24C02_write(0xa0);         //写时候器件地址为0xa0
        AT24C02_respons();                //应答信号
        AT24C02_write(address); //写入将要存放数据的地址
        AT24C02_respons();                //应答信号
        AT24C02_write(date);    //写入数据
        AT24C02_respons();                //应答信号
        AT24C02_stop();                        //停止信号
        AT24C02_delay(150);
}

/*********************************************************
函数名称:uchar AT24C02_read_date(uchar address)
函数作用:AT24C02读数据
参数说明:向address地址里读出一个数据,并返回
*********************************************************/
uchar AT24C02_read_date(uchar address)
{
        uchar date;
        AT24C02_start();                           //开始信号
        AT24C02_write(0xa0);                    //写时候器件地址为0xa0
        AT24C02_respons();                           //应答信号
        AT24C02_write(address);//写入将要读取数据的地址
        AT24C02_respons();                           //应答信号
        AT24C02_start();                           //开始信号
        AT24C02_write(0xa1);                   //读时候器件地址为0xa1
        AT24C02_respons();                           //应答信号
        date=AT24C02_read();                    //读取数据
        AT24C02_stop();
        AT24C02_delay(150);
        return date;                                   //返回数据
}

#endif

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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