基于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.pswp.cn/news/165604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165604.shtml
英文地址,請注明出處:http://en.pswp.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 個層面來著手突破。 系統設計原則是 冗余 取舍 冗余&#xff1a;指集群部署 故障轉移取舍&#xff1a;常見手段包括&#xff1a;超時控制、降級、限流 系統運維…

音視頻項目—基于FFmpeg和SDL的音視頻播放器解析(二十)

介紹 在本系列&#xff0c;我打算花大篇幅講解我的 gitee 項目音視頻播放器&#xff0c;在這個項目&#xff0c;您可以學到音視頻解封裝&#xff0c;解碼&#xff0c;SDL渲染相關的知識。您對源代碼感興趣的話&#xff0c;請查看基于FFmpeg和SDL的音視頻播放器 如果您不理解本…

springboot(ssm災害應急救援平臺 應急管理平臺Java(codeLW)

springboot(ssm災害應急救援平臺 應急管理平臺Java(code&LW) 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#x…

AOP(面向切面編程)

AOP是針對面向對象編程的一種補充&#xff0c;有時使用面向對象不能很好完成一些額外的功能業務時&#xff0c;可以采用AOP來進行補充。切面編程的目的就是為了將業務目標進行而外的增強或者擴展。Spring中的AOP是基于JDK動態代理和CGLIB動態代理實現的。 應用場景 日志操作&…

【數據結構(四)】前綴、中綴、后綴表達式(逆波蘭表達式)和逆波蘭計算器的代碼實現(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的目標是提高威脅檢測的速度和準確性&…

Arduino驅動防水型SHT20溫濕傳感器(溫濕度傳感器)

目錄 1、傳感器特性 2、控制器和傳感器連線圖 3、驅動程序 SHT20防水型溫濕傳感器,采用新一代Sensirion濕度和溫度傳感器,配有4代CMOSens芯片。除了配有電容式相對濕度傳感器和能隙溫度傳感器外,該芯片還包含一個放大器、A/D轉換器、OTP內存和數字處理單元,可精確測量周…

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…

openssl+ RSA + linux 簽名開發實例(C++)

文章目錄 一、opensslRSA理論基礎二、openssl RSA 簽名開發實例 一、opensslRSA理論基礎 RSA簽名是一種非對稱加密算法&#xff0c;用于在信息傳輸過程中驗證消息的完整性和真實性。以下是RSA簽名的理論基礎的主要知識點&#xff1a; RSA密鑰對&#xff1a; RSA使用一對公鑰和…

pcie-2-rj45速度優化

背景: 目前用iperf3打流傳輸速率達不到要求,千兆實際要求跑到800M以上: 優化方案: 1.優化defconfig: 首先編譯user版本驗證看是否正常 debug版本關閉CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通過更換驅動,或者更新驅動來優化 3.綁定大核: 以8125網卡為例,udp…

【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹

IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹 IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三個接口&#xff0c;用于處理 UI 元素的拖放事件。這些接口通常結合使用&#xff0c;構成了 Unity 引擎的拖放事件系統。 IBeginDragHandler…

java--權限修飾符

1.什么是權限修飾符 就是是用來限制類中的成員(成員變量、成員方法、構造器、代碼塊...)能夠被訪問的范圍。 2.權限修飾符有幾種&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范圍由小到大)

什么年代了,還不會 CI/CD 么?

目錄 什么是 CI/CD&#xff1f; CI/CD 對業務有哪些好處&#xff1f; 一&#xff1a;確保卓越的代碼質量 二&#xff1a;更快的發布速度 → 更快的交付 三&#xff1a;自動化降低成本 四&#xff1a;故障隔離 五&#xff1a;簡化回滾 六&#xff1a;持續反饋 七&#…

設計模式——行為型模式(二)

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…