关于51单片机字符串 EEPROM存储与读取的问题

发布者:温暖拥抱最新更新时间:2021-09-02 来源: eefocus关键字:51单片机  字符串  EEPROM  存储与读取 手机看文章 扫描二维码
随时随地手机看文章

题目如下

通过串口助手控制 LCD 显示屏,通过 LCD1602 显示并保存在 EEPROM 中,实现 数据的掉电保存(例 如:串口向单片机发送一串英文字符,该字符在 LCD 上显示出 来,若按下 k1 则实现数据的保存,按下 k2 实 现读取上次保存的数据,显示在 1602 上)


效果如下

在这里插入图片描述
在这里插入图片描述

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

#include "i2c.h"

#include


typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;


sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;


sbit k1=P3^1;

sbit k2=P3^0;

sbit k3=P3^2; //定义按键端口

sbit LCD1602_RS=P2^6;

sbit LCD1602_RW=P2^5;

sbit LCD1602_E=P2^7;


u8 num=0;u8 i,flag;

u8 table[16]="I received is:  ";

u8 table1[16]="My memory is:   ";

u8 table2[16];

u8 table3[16];

u8 count,rec;

u8 dat,flag1,j;

/*******************************************************************************

* 函 数 名         : delay

* 函数功能    : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}


 

void Lcd1602_Delay1ms(u16 c)   //误差 0us

{

    u8 a,b;

for (; c>0; c--)

{

for (b=199;b>0;b--)

{

  for(a=1;a>0;a--);

}      

}

   

}

void write_com(u8 com)

{

LCD1602_E = 0;     //使能

LCD1602_RS = 0;    //选择发送命令

LCD1602_RW = 0;    //选择写入

P0= com;     //放入命令

Lcd1602_Delay1ms(1); //等待数据稳定

LCD1602_E = 1;           //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}

void write_data(u16 dat)

{

LCD1602_E = 1;     //使能

LCD1602_RS = 1;    //选择发送命令

LCD1602_RW = 0;    //选择写入

P0=dat;     //放入命令

Lcd1602_Delay1ms(1); //等待数据稳定

LCD1602_E = 1;           //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}


 void Init()

{

write_com(0x38);

write_com(0x0f);

write_com(0x06);

write_com(0x01);  //清屏

write_com(0x80);  //设置数据指针起点

}


/*******************************************************************************

* 函数名         :Keypros()

* 函数功能 :按键处理函数

* 输入           : 无

* 输出          : 无

*******************************************************************************/

void Keypros()

{


if(k1==0)

{

delay(1000);  //消抖处理

if(k1==0)

{

count=strlen(table2); //计算要记忆的字符串的长度

for(i=0;i {

At24c02Write(5*i+2,table2[i]);   //在对应的地址中放入对应的字符

delay(1000);

}

}

while(!k1);

}


if(k2==0)

{

delay(1000);  //消抖处理

if(k2==0)

{

flag=0;

write_com(0x01);

for(i=0;i<16;i++)

{

write_data(table1[i]); //显示my memory is:

}

write_com(0x80+0x40); //换行

for(i=0;i<16;i++)

{

table3[i]= At24c02Read(5*i+2);

write_data(table3[i]);

delay(1000);

}

}

while(!k2);

}


if(k3==0)

{

delay(1000);  //消抖处理

if(k3==0)

{

write_com(0x01);

}

while(!k3);

}

}


void UsartInit()

{

    SCON = 0x50;

TMOD |= 0x20;

PCON = 0x80;

TH1 = 0xFD;

TL1 = 0xFD;

EA = 1;

ES = 1;

TR1 = 1;

}

void lcdDisplay()

{

write_com(0x01);

for(i=0;i<16;i++)

{

write_data(table[i]);

}

 

write_com(0x80+0x40);

  for(i=0;i   {

      write_data(table2[i]);

  }

  num=0;

  flag=0;

}

/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

Init();

UsartInit();

while(1)

{    

if(flag==1)

{  

lcdDisplay();

Keypros();

}

}


void Usart() interrupt 4

{

if(RI)

{

table2[num]=SBUF;

RI = 0;

//Usartdelay5ms();

SBUF = table2[num];

while(!TI);

TI = 0;

//Usartdelay5ms();

num++;

flag = 1;

}

}


#include"i2c.h"


/*******************************************************************************

* 函数名         : Delay10us()

* 函数功能    : 延时10us

* 输入           : 无

* 输出          : 无

*******************************************************************************/


void Delay10us()

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=2;a>0;a--);


}

/*******************************************************************************

* 函数名         : I2cStart()

* 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿

* 输入           : 无

* 输出          : 无

* 备注           : 起始之后SDA和SCL都为0

*******************************************************************************/


void I2cStart()

{

SDA=1;

Delay10us();

SCL=1;

Delay10us();//建立时间是SDA保持时间>4.7us

SDA=0;

Delay10us();//保持时间是>4us

SCL=0;

Delay10us();

}

/*******************************************************************************

* 函数名         : I2cStop()

* 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿

* 输入           : 无

* 输出          : 无

* 备注           : 结束之后保持SDA和SCL都为1;表示总线空闲

*******************************************************************************/


void I2cStop()

{

SDA=0;

Delay10us();

SCL=1;

Delay10us();//建立时间大于4.7us

SDA=1;

Delay10us();

}

/*******************************************************************************

* 函数名         : I2cSendByte(unsigned char dat)

* 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定

* 输入           : num

* 输出          : 0或1。发送成功返回1,发送失败返回0

* 备注           : 发送完一个字节SCL=0,SDA=1

*******************************************************************************/


unsigned char I2cSendByte(unsigned char dat)

{

unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。

for(a=0;a<8;a++)//要发送8位,从最高位开始

{

SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号

dat=dat<<1;

Delay10us();

SCL=1;

Delay10us();//建立时间>4.7us

SCL=0;

Delay10us();//时间大于4us

}

SDA=1;

Delay10us();

SCL=1;

while(SDA)//等待应答,也就是等待从设备把SDA拉低

{

b++;

if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束

{

SCL=0;

Delay10us();

return 0;

}

}

SCL=0;

Delay10us();

  return 1;

}

/*******************************************************************************

* 函数名         : I2cReadByte()

* 函数功能    : 使用I2c读取一个字节

* 输入           : 无

* 输出          : dat

* 备注           : 接收完一个字节SCL=0,SDA=1.

*******************************************************************************/


unsigned char I2cReadByte()

{

unsigned char a=0,dat=0;

SDA=1; //起始和发送一个字节之后SCL都是0

Delay10us();

for(a=0;a<8;a++)//接收8个字节

{

SCL=1;

Delay10us();

dat<<=1;

dat|=SDA;

Delay10us();

SCL=0;

Delay10us();

}

return dat;

}


/*******************************************************************************

* 函数名         : void At24c02Write(unsigned char addr,unsigned char dat)

* 函数功能    : 往24c02的一个地址写入一个数据

* 输入           : 无

* 输出          : 无

*******************************************************************************/


void At24c02Write(unsigned char addr,unsigned char dat)

{

I2cStart();

I2cSendByte(0xa0);//发送写器件地址

I2cSendByte(addr);//发送要写入内存地址

I2cSendByte(dat); //发送数据

I2cStop();

}

/*******************************************************************************

* 函数名         : unsigned char At24c02Read(unsigned char addr)

* 函数功能    : 读取24c02的一个地址的一个数据

* 输入           : 无

* 输出          : 无

*******************************************************************************/


unsigned char At24c02Read(unsigned char addr)

{

unsigned char num;

I2cStart();

I2cSendByte(0xa0); //发送写器件地址

I2cSendByte(addr); //发送要读取的地址

I2cStart();

I2cSendByte(0xa1); //发送读器件地址

num=I2cReadByte(); //读取数据

I2cStop();

return num;

}

关键字:51单片机  字符串  EEPROM  存储与读取 引用地址:关于51单片机字符串 EEPROM存储与读取的问题

上一篇:stc51单片机串口通信程序
下一篇:51 单片机 EEPROM小结(FLASH)

推荐阅读最新更新时间:2024-10-30 10:15

51单片机小白零基础教程——数码管的静态显示,以及数码管拓展程序
一、数码管的显示原理 数码管:是一种可以显示数字和其他信息的电子设备,可以看成是多个二极管的组成。 数码管有单位数码管、双位数码管、四位数码管,我们开发板上的数码管为2个四位数码管。 数码管显示原理:通过点亮内部的发光二极管来发光 引脚:又被称为管脚,从集成电路内部电路引出与外围电路的接线,所有的引脚构成了这块芯片的接口 单位数码管的引脚有10个,内部一共有8个小的发光二级管,还有2个引脚是公共端,其实只有一个公共端,但是生产厂家为了封装统一,把这2个引脚连接在了一起。 数码管根据其公共端所接的阳极和阴极的不同,分为了共阴极数码管和共阳极数码管。 共阳极接法:几个二极管的阳极接在一起,接到VCC(高电平),
[单片机]
<font color='red'>51单片机</font>小白零基础教程——数码管的静态显示,以及数码管拓展程序
51单片机双机通信硬件电路图及C程序
双机通信的硬件电路 需要注意的是,两单片机要保证正确通信,主机的RXD连接从机的TXD,从机的RXD连接主机的TXD。 双机通信C语言程序 (1)主机程序 #include #include #define _READY_ 0x06//主机握手信号 #define _BUSY_ 0x15//从机忙应答 #define_OK_ 0x00//从机准备好 #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned charTable ={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Bu
[单片机]
<font color='red'>51单片机</font>双机通信硬件电路图及C程序
利用8051单片机串行口串并转换输出程序
;利用8051串行口,和并行输出串行移位寄存器74LS164, ;扩展一位数码显示在数码显示器上循环显示0-9这10个数字。 ;晶振频率为11.0592MHZ ;4C00为50ms定时常数 ORG 0000H LJMP START ORG
[单片机]
基于51单片机的高性能直流稳压电源
0 引言 众所周知,许多科学实验都离不开电,并且在这些实验中经常会对通电时间、电压高低、电流大小以及动态指标有着特殊的要求,因此,如果实验电源不仅具有良好的输出质量而且还具有多功能以及一定的智能化,那么就省去了许多不精确的人为操作,取而代之的是精确的微机控制,而我们所要做的就是在实验开始前对一些参数进行预设。这将会给各个领域中的实验研究带来不同程度的便捷与高效。因此,直流电源今后的发展目标之一就是不仅要在性能上做到效率高、噪声低、高次谐波低、既节能又不干扰环境,还要在功能上力求实现数控化、多功能化与智能化。本文所介绍的就是一个将开关电源和线性电源有机地结合起来,兼具二者优点的高性能直流稳压电源。由于在该电源中引入了单片机控
[单片机]
基于<font color='red'>51单片机</font>的高性能直流稳压电源
51单片机 printf函数 调试程序
主要分三个部分(1)51单片机程序部分;(2)keil工具部分;(3)为何printf输出为串口。 (1)51单片机程序部分 #include stdio.h #include reg51.h void InitUART(void)//使用定时器1作为串口波特率发生器 { TH1 = 0xF3; //晶振12mhz 波特率串口上设为2400才不显示乱码代码是4800 TL1 = TH1; TMOD |= 0x20; //定时器1方式2 SCON = 0x50; //串口接收使能 ES = 1; //串口中断使能 TR1 = 1; //定时器1使能 TI = 1; //发送中断
[单片机]
AT89S51单片机的硬件组成
AT89S51单片机的片内硬件组成结构如图2-1所示。它把那些作为控制应用所必需的基本功能部件都集成在一个尺寸有限的集成电路芯片上,具有如下功能部件和特性:      (1)8位微处理器(CPU)。      (2)数据存储器(128B RAM)。      (3)程序存储器(4KB FLASH ROM)。      (4)4个8位可编程并行I/O口(PO口、Pl口、P2口和P3口)。      (5)1个全双工的异步串行口。      (6)2个可编程的16位定时器/计数器。      (7)1个看门狗定时器。      (8)中断系统具有5个中断源、5个中断向量。      (9)特殊功能寄存器(SFR) 26个。  
[单片机]
AT89S<font color='red'>51单片机</font>的硬件组成
51单片机对激光器电流的精度控制的设计方案
引 言   近年来,随着光电技术的迅猛发展,激光器已广泛应用于医疗、国防、测量等各个领域。而环境温度变化会直接影响激光器的波长。把关键元件(如高性能晶振、SAW 滤波器、光放大器、激光二极管) 的本机温度限制在窄范围内,可以提高电子系统的精度。一般需要将温度控制在0. 1 ℃内,激光器的工作精度才能很好地保持在0. 1nm 内 。文中的设计方案能为大功率半导体激光器提供有效支持,最大电流可达2. 5A。   1  半导体激光控制器的设计   激光控制器由受控恒流源,温度监视及控制电路,主控制器及显示器构成。整体结构原理见图1。 1. 1  受控恒流源:   为了使激光器输出稳定的激光,对流过激光器的电流要求非常严格
[单片机]
用<font color='red'>51单片机</font>对激光器电流的精度控制的设计方案
基于89C2051单片机设计的电冰箱保护节电器原理
本电冰箱保护节电器具有低保护、过压功率控制等功能,经过试用,稳定可靠。本控制器稍加改动,还可用于其他家电控制。 图1为控制器的电原理图。运放LM324组成的电压比较电路中三路用于检测电源电压低于180V,高于230V、240V,并送单片机处理。 V4C组成过零检测电路,在V4C的第{8}脚获得的方波如图2所示。由图2可知,V4C的{8}脚输出方波的上升沿和下降沿处为交流过零点,该信号送单片机P3.7口处理。 U7等组成可控硅触发电路。U7为MOC3041,内部有过零检测和相关电路。这里采用过零触发,主要是为了减少谐波干扰。R25、C5是可控硅保护电路。R24是可控硅触发电阻,其值由公式R=220(根号2)/I(A)Ω决
[单片机]
基于89C20<font color='red'>51单片机</font>设计的电冰箱保护节电器原理
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved