基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02一字节并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02一字节并显示在液晶显示器LCD1602上应用

  • STC12C5A60S2系列1T 8051单片机管脚图
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
  • IIC通信简单介绍
  • 掉电保存数据芯片24C02简单介绍
  • 通过液晶显示器LCD1602显示掉电保存数据芯片24C02内存地址上的数据

STC12C5A60S2系列1T 8051单片机管脚图

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

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

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

IIC通信简单介绍

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

掉电保存数据芯片24C02简单介绍

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

通过液晶显示器LCD1602显示掉电保存数据芯片24C02内存地址上的数据

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

#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint 
#define LCD1602PinMode1 0x38//自定义液晶显示器LCD1602八位数据接口的两行5*8点阵 
#define LCD1602PinMode2 0x28//自定义液晶显示器LCD1602四位数据接口的两行5*8点阵
#define LCD1602CleanScreen 0x01//自定义液晶显示器LCD1602清屏变量
#define LCD1602CursorRst 0x02//自定义液晶显示器LCD1602光标复位 
#define LCD1602DisplayCursorGlint 0x0f//自定义液晶显示器LCD1602开显示开光标开光标闪烁 
#define LCD1602DisplayCursorNoGlint 0x0e//自定义液晶显示器LCD1602开显示开光标不开光标闪烁  
#define LCD1602DisplayNoCursorNoGlint 0x0c//自定义液晶显示器LCD1602开显示不开光标不开光标闪烁  
#define LCD1602NoDisplayCursorNoGlint 0x08//自定义液晶显示器LCD1602不开显示不开光标不开光标闪烁  
#define LCD1602CursorRightMoveDisplayNoMove 0x06//自定义液晶显示器LCD1602光标右移 显示不移动
#define LCD1602CursorLeftMoveDisplayNoMove 0x04//自定义液晶显示器LCD1602光标左移 显示不移动
#define LCD1602PictureLeftMove 0x07//自定义液晶显示器LCD1602画面左移 AC自增
#define LCD1602PictureRightMove 0x05//自定义液晶显示器LCD1602画面右移 AC自减
#define LCD1602CursorRightMove 0x10//自定义液晶显示器LCD1602光标右移
#define LCD1602CursorLeftMove 0x14//自定义液晶显示器LCD1602光标左移
#define LCD1602DisplayRightMove 0x18//自定义液晶显示器LCD1602显示右移
#define LCD1602DisplayLeftMove 0x1c//自定义液晶显示器LCD1602显示左移
#define LCD1602DisplayData P0//自定义液晶显示器LCD1602显示数据为单片机P0组引脚
sbit LCD1602RS P2^5;//位定义液晶显示器LCD1602数据指令变量为单片机P2.5引脚
sbit LCD1602RW P2^6;//位定义液晶显示器LCD1602读写变量为单片机P2.6引脚 
sbit LCD1602EN P2^6;//位定义液晶显示器LCD1602使能变量为单片机P2.7引脚 
sbit I2CSCL = P1^0;//位定义I2C时钟变量为P1.0端口
sbit I2CSDA = P1^1;//位定义I2C数据变量为P1.1端口uchar Read24C02Byte(uchar IcAddress,uchar Address)//读24C02字节函数
{uchar Data;//声明数据变量I2CStar();//I2C启动函数I2CWriteByte(IcAddress << 1);//I2C写字节函数 单片机通过I2C通信写匹配通信地址给24C02I2CWriteByte(Address);//I2C写字节函数 单片机通过I2C通信写24C02的地址I2CStar();//I2C启动函数I2CWriteByte((IcAddress << 1) | 0x01);//I2C写字节函数 单片机通过I2C通信写入读24C02Data = I2CReadByte();//I2C读字节函数含有的数据赋给数据变量SendAck(1);//I2C发送应答函数 单片机作为主机通过I2C通信只读24C02内存地址上的一个字节 I2CStop();//I2C停止函数return Data;//返回数据变量含有的数据}
/****bit 24C02Address(uchar Address)//24C02地址函数
{bit Ack;//声明一位应答变量I2CStar();//I2C启动函数I2CWriteByte(Address << 1);//I2C写字节函数Ack = I2CReceiveAck();//I2C接收应答函数接收应答赋给应答变量 即24C02作为从机接收单片机作为主机发送来的地址信息 并做出返回应答I2CStop();//I2C停止函数return Ack;//返回应答}****/void I2CDelay()//I2C延时函数
{_nop_();_nop_();_nop_();_nop_();}void I2CStar()//I2C启动函数
{I2CSCL = 1;//空闲时 I2C时钟变量置高电平I2CSDA = 1;//空闲时 I2C数据变量置高电平I2CDelay();//I2C延时I2CSDA = 0;//I2C数据变量置低电平I2CDelay();//I2C延时I2CSCL = 0;//I2C时钟变量置低电平}bit I2CWriteByte(uchar Data)//I2C写字节函数
{uchar Temp;//声明临时变量bit Ack;//声明一位应答变量for(Temp = 0x80;Temp = !0;Temp >>= 1)//从某八位二进制数的最高位往最低位每次移出一位二进制数 取变化后的八位二进制数进行下一步从最高位往最低位每次右移出一位二进制数 直到写完某八位二进制数的每一位二进制数{if((Temp & Data) == 0)//判断临时变量包含的数据与上写入某八位二进制数得出八位二进制数最高位是否为0I2CSDA = 0;//I2C数据变量写0else//否则I2CSDA = 1;//I2C数据变量写1I2CDelay();//I2C延时I2CSCL = 1;//I2C时钟变量置高电平I2CDelay();//I2C延时I2CSCL = 0;//I2C时钟变量置低电平}Ack = I2CReceiveAck();//I2C接收应答函数接收应答赋给应答变量return (Ack);//返回应答}void SendAck(bit Ack)//I2C发送应答函数
{I2CSDA = Ack;//应答变量赋给I2C数据变量I2CDelay();//I2C延时I2CSCL = 1;//I2C时钟变量置高电平I2CDelay();//I2C延时I2CSCL = 0;//I2C时钟变量置低电平}bit ReceiveAck()//I2C接收应答函数
{bit Ack;//声明一位应答变量I2CSDA = 1;//I2C数据变量置高电平I2CDelay();//I2C延时I2CSCL = 1;//I2C时钟变量置高电平Ack = I2CSDA;//I2C数据变量I2CDelay();//I2C延时I2CSCL = 0;//I2C时钟变量置低电平return (Ack);//返回应答}uchar I2CReadByte()//I2C读字节函数
{uchar Data;//声明数据变量uchar Temp;//声明临时变量I2CSDA = 1;//I2C数据变量置高电平for(Temp = 0x80;Temp = !0;Temp >>= 1)//从某八位二进制数的最高位往最低位每次右移出一位二进制数 取变化后的八位二进制数进行下一步从最高位往最低位每次右移出一位二进制数 直到读完某八位二进制数的每一位二进制数{I2CDelay();//I2C延时I2CSCL = 1;//I2C时钟变量置高电平if(I2CSDA == 1)//判断I2C数据变量是否置高电平{Data |= Temp;//临时变量包含的数据或上某八位二进制数读出八位二进制数最高位为1}else//否则{Data &= ~Temp;//临时变量包含的数据与上某八位二进制数读出八位二进制数最高位为0}I2CDelay();//I2C延时I2CSCL = 0;//I2C时钟变量置低电平}return Data;//返回数据变量}void I2CStop()//I2C停止函数
{I2CSCL = 0;//I2C时钟变量置低电平I2CSDA = 0;//I2C数据变量置低电平I2CDelay();//I2C延时I2CSCL = 1;//I2C时钟变量置高电平I2CDelay();//I2C延时I2CSDA = 1;//I2C数据变量置高电平I2CDelay();//I2C延时}void LCD1602Init()//液晶显示器初始化函数
{LCD1602WriteCommand(LCD1602PinMode1);//液晶显示器LCD1602八位数据接口的两行5*8点阵 LCD1602WriteCommand(LCD1602DisplayNoCursorNoGlint);//液晶显示器LCD1602开显示不开光标不开光标闪烁LCD1602WriteCommand(LCD1602CursorRightMove);//液晶显示器LCD1602光标右移LCD1602WriteCommand(LCD1602CleanScreen);//液晶显示器LCD1602清屏}void LCD1602ReadBusy()//液晶显示器读忙函数
{uchar i;//声明一个计数变量uchar State;//声明状态变量LCD1602DisplayData = 0xff;//液晶显示器LCD1602显示数据变量拉高LCD1602RS = 0;//液晶显示器LCD1602写入指令LCD1602RW = 1;//读取液晶显示器LCD1602do{LCD1602EN = 1;//液晶显示器LCD1602使能State = LCD1602DisplayData;//液晶显示器LCD1602显示数据赋给状态变量LCD1602EN = 0;//关液晶显示器LCD1602使能i++;if(i > 200)//防止液晶显示器LCD1602因损坏陷入do{}while循环中 导致无法执行其他程序break;}while(State & 0x80);//判断状态变量是否为1 为1表示液晶显示器LCD1602在忙 否则不忙}void LCD1602WriteCommand(uchar Command)//液晶显示器LCD1602写命令函数
{LCD1602ReadBusy();//液晶显示器读忙函数LCD1602RS = 0;//液晶显示器LCD1602写入指令LCD1602RW = 0;//写入液晶显示器LCD1602LCD1602DisplayData = Command;//指令变量含有的数据赋给液晶显示器LCD1602显示数据变量LCD1602EN = 1;//液晶显示器LCD1602使能LCD1602EN = 0;//关液晶显示器LCD1602使能} void LCD1602WriteData(uchar Data)//液晶显示器LCD1602写数据函数
{LCD1602ReadBusy();//液晶显示器LCD1602读忙函数LCD1602RS = 1;//液晶显示器LCD1602写入数据LCD1602RW = 0;//写入液晶显示器LCD1602LCD1602DisplayData = Data;//数据变量含有的数据赋给液晶显示器LCD1602显示数据变量LCD1602EN = 1;//液晶显示器LCD1602使能LCD1602EN = 0;//关液晶显示器LCD1602使能} void LCD1602SetDisplayPosition(uchar x,uchar y)//液晶显示器LCD1602设置显示位置
{if(0 == y)//液晶显示器LCD1602第一行显示{LCD1602WriteCommand(0x80 | x);//液晶显示器LCD1602第一行第一位开始显示 0x80为液晶显示器LCD1602显示数据储存地址最高位初始值}else//液晶显示器LCD1602第二行显示{LCD1602WriteCommand(0x80 | (0x40 + x));//液晶显示器LCD1602第二行第一位开始显示 0x40为液晶显示器LCD1602第二行显示位置初始地址}}void LCD1602ShowString(uchar x;uchar y;uchar *String)//液晶显示器LCD1602显示字符串函数 x变量为液晶显示器LCD1602横向显示 相当于列 y变量为液晶显示器LCD1602纵向显示 相当于行
{LCD1602SetDisplayPosition(x,y);//液晶显示器LCD1602设置显示位置while(*String != ' \0 ')//判断字符串是否全部显示 {LCD1602WriteData(*String ++)//液晶显示器LCD1602写入字符串}}/****void LCD1602WriteCGRAM()//液晶显示器LCD1602写入自定义字符储存器函数
{uchar i;//声明循环变量LCD1602WriteCommand(0x40);//0x40为液晶显示器LCD1602自定义字符储存地址最高位初始值for(i = 0;i < 8;i++)//循环八次 把写入液晶显示器LCD1602自定义字符储存地址上的自定义字符写出来{LCD1602WriteData(String[i]);//把写入液晶显示器LCD1602自定义字符储存地址上的自定义字符写出来}LCD1602WriteCommand(0x80 | 0x05);//0x80为液晶显示器LCD1602显示数据储存地址最高位初始值 0x05为液晶显示器LCD1602显示位置LCD1602WriteData(0x00);//液晶显示器LCD1602写自定义字符到CGROM(即字模存储用空间)第一个位置显示出来}****//****void LCD1602UserDefined(uchar x,uchar y,uchar Position,uchar *String)//液晶显示器LCD1602用户自定义字符函数
{uchar i;//声明循环变量for(i = 0;i < 8;i++)//循环八次 把自定义字符写入液晶显示器LCD1602自定义字符储存地址并写出来{LCD1602WriteCommand(0x40 + Position*8 + i);//0x40为液晶显示器LCD1602自定义字符储存地址最高位初始值 循环八次 把自定义字符写入液晶显示器LCD1602自定义字符储存地址LCD1602WriteData(*(String+i));//循环八次 把写入液晶显示器LCD1602自定义字符储存地址上的自定义字符写出来}LCD1602SetDisplayPosition(x,y);//液晶显示器LCD1602设置显示位置LCD1602WriteData(0x00 + Position);//液晶显示器LCD1602写自定义字符到CGRAM(即字符生成随机存储器)第一个位置到第八个位置显示出来}****/void main()//主函数
{uchar Data;//声明数据变量LCD1602Init();//液晶显示器初始化函数Data = Read24C02Byte(0x50,0x00);//单片机作为主机通过I2C通信从24C02内存地址0x00上读取一个字节 LCD1602SetDisplayPosition(0,0);//液晶显示器LCD1602第一行第一个位置显示字符串LCD1602WriteData(Data/100 + '0');//液晶显示器LCD1602写数据函数 显示百位数据LCD1602WriteData(Data/10%10 + '0');//液晶显示器LCD1602写数据函数 显示十位数据LCD1602WriteData(Data%10 + '0');//液晶显示器LCD1602写数据函数 显示个位数据while(1);//主循环}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

致远M3 反序列化RCE漏洞复现(XVE-2023-24878)

0x01 产品简介 M3移动办公是致远互联打造的一站式智能工作平台&#xff0c;提供全方位的企业移动业务管理&#xff0c;致力于构建以人为中心的智能化移动应用场景&#xff0c;促进人员工作积极性和创造力&#xff0c;提升企业效率和效能&#xff0c;是为企业量身定制的移动智慧…

15.Python 异常处理和程序调试

1. 异常处理 异常就是在程序执行过程中发生的超出预期的事件。一般情况下&#xff0c;当程序无法正常执行时&#xff0c;都会抛出异常。 在开发过程中&#xff0c;由于疏忽或考虑不周&#xff0c;出现的设计错误。因此&#xff0c;在后期程序调试中应该根据错误信息&#xff…

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

文章目录 1. 前缀表达式(波兰表达式)1.1. 前缀表达式的计算机求值 2. 中缀表达式3. 后缀表达式(逆波兰表达式)3.1. 后缀表达式的计算机求值3.2. 逆波兰计算器的实现 4. 中缀表达式 转 后缀表达式4.1. 思路分析4.2. 代码实现 5. 逆波兰计算器的完整版 1. 前缀表达式(波兰表达式)…

手写数字可视化_Python数据分析与可视化

手写数字可视化 手写数字流形学习 手写数字 手写数字无论是在数据可视化还是深度学习都是一个比较实用的案例。 数据在sklearn中&#xff0c;包含近2000份8 x 8的手写数字缩略图。 首先需要先下载数据&#xff0c;然后使用plt.imshow()对一些图形进行可视化&#xff1a; 打开c…

Mysql 锁机制分析

整体业务代码精简逻辑如下&#xff1a; Transaction public void service(Integer id) {delete(id);insert(id); }数据库实例监控&#xff1a; 当时通过分析上游问题流量限流解决后&#xff0c;后续找时间又重新分析了下问题发生的根本原因&#xff0c;现将其总结如下&#xf…

XDR 网络安全:技术和最佳实践

扩展检测和响应&#xff08;XDR&#xff09;是一种安全方法&#xff0c;它将多种保护工具集成到一个统一的集成解决方案中。它为组织提供了跨网络、端点、云工作负载和用户的广泛可见性&#xff0c;从而实现更快的威胁检测和响应。 XDR的目标是提高威胁检测的速度和准确性&…

Linux系统介绍及文件类型和权限

终端:CtrlAltT 或者桌面/文件夹右键,打开终端 切换为管理员:sudo su 退出:exit 查看内核版本号:uname -a 内核版本号含义:5 代表主版本号;13代表次版本号;0代表修订版本号;30代表修订版本的第几次微调;数字越大表示内核越新. 目录结构 /bin:存放常用命令(即二进制可执行程序…

C/C++内存管理(2):`new`和`delete`的实现原理

new和delete操作自定义类型 class Stack { public:Stack(int capacity 3):_top(0), _capacity(capacity){cout << "Stack(int capacity 3)" << endl;_a new int[capacity];}~Stack(){cout << "~Stack()" << endl;delete _a;_to…

pcie-2-rj45速度优化

背景: 目前用iperf3打流传输速率达不到要求,千兆实际要求跑到800M以上: 优化方案: 1.优化defconfig: 首先编译user版本验证看是否正常 debug版本关闭CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通过更换驱动,或者更新驱动来优化 3.绑定大核: 以8125网卡为例,udp…

java--权限修饰符

1.什么是权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。 2.权限修饰符有几种&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范围由小到大)

设计模式——行为型模式(二)

6.8 迭代器模式 6.8.1 概述 定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 6.8.2 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggreg…

C# Onnx PP-Vehicle 车辆分析(包含:车辆检测,识别车型和车辆颜色)

目录 效果 模型信息 mot_ppyoloe_s_36e_ppvehicle.onnx vehicle_attribute_model.onnx 项目 代码 下载 其他 C# Onnx PP-Vehicle 车辆分析&#xff08;包含&#xff1a;车辆检测&#xff0c;识别车型和车辆颜色&#xff09; 效果 模型信息 mot_ppyoloe_s_36e_ppvehi…

009 OpenCV 二值化 threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…

【PyQt】(自定义类)阴影遮罩

写了一个感觉有些用的小玩具。 用于给控件添加阴影遮罩(强调主控件的同时屏蔽其余控件的点击) 自定义阴影遮罩Mask&#xff1a; from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout from PyQt5.QtGu…

leetcode:合并两个有序链表

题目描述 题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题目分析 这个算法思路很简单&#xff1a;就是直接找小尾插 定义一个tail和head&#xff0c;对比两个链表结点的val&#xff0c;小的尾插到tail->next&#xff0c;如果一个链表…

每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

企业微信身份验证

本篇主要是在上一篇获取第三方凭证基础上&#xff0c;用户通过三方网站自定义授权登录后获取用户信息&#xff0c;以实现用户绑定登录功能。 构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息&#xff0c; 第一步需要构造如下的链接来获取授权c…

马养殖场建设VR模拟实训教学平台具有灵活性和复用性

为保障养殖场生物安全&#xff0c;避免疫病传播&#xff0c;学生出入养殖场受时间和地域的限制&#xff0c; 生产实习多以参观为主&#xff0c;通过畜牧企业技术人员的讲解&#xff0c;学生被动了解生产过程。为了解决畜牧养殖实训难的问题&#xff0c;借助VR技术开展畜牧养殖虚…

通过云服务器部署JavaWeb项目

文章目录 搭建Java运行环境部署项目更改部分项目代码打包项目把war包上传到webapps目录下验证程序 搭建Java运行环境 搭建环境的部分比较复杂&#xff0c;为了让大家的思路更加清晰特别总结为一篇博客点击查看 部署项目 更改部分项目代码 打包项目 把war包上传到webapps目录…

大洋钻探系列之三IODP 342航次是干什么的?(下)

上文简要地介绍IODP342航次的总体情况&#xff0c;本文以航次1个钻孔&#xff08;U1403&#xff09;为例&#xff0c;更为详细地系统展示大洋钻探航次的工作和成果。 ​编辑​ 站位叠加多波束影像的成果图见下图&#xff0c;从图中的颜色效果可以看出&#xff0c;此多波束的成…