寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難,但我還是想去做!
本文寫于:2025.03.20
51單片機學習——第28節: [12-2] AT24C02數據存儲&秒表(定時器掃描按鍵數碼管)
- 前言
- 開發板說明
- 引用
- 解答和科普
- 一、編寫AT24C02的讀寫函數
- 二、加入延遲函數實現LED閃爍
- 問題
- 總結
前言
? ?本次筆記是用來記錄我的學習過程,同時把我需要的困難和思考記下來,有助于我的學習,同時也作為一種習慣,可以督促我學習,是一個激勵自己的過程,讓我們開始51單片機的學習之路。
? ?歡迎大家給我提意見,能給我的嵌入式之旅提供方向和路線,現在作為小白,我就先學習51單片機了,就跟著B站上的江協科技開始學習了.
? ?在這里會記錄下江協科技51單片機開發板的配套視頻教程所作的實驗和學習筆記內容,因為我之前有一個開發板,我大概率會用我的板子模仿著來做.讓我們一起加油!
? ?另外為了增強我的學習效果:每次筆記把我不知道或者問題在后面提出來,再下一篇開頭作為解答!
開發板說明
? ?本人采用的是慧凈的開發板,因為這個板子是我N年前就買的板子,索性就拿來用了。不再另外購買視頻中的普中開發板了。
? ?原理圖如下
視頻中的都用這個開發板來實現,如果有資源就利用起來。
仔細看了看:開發板的晶振為:11.0592Mhz;12Mhz晶振是用來給CH340G芯片外置晶振;
下圖是實物圖
引用
51單片機入門教程-2020版 程序全程純手打 從零開始入門
還參考了下圖中的書籍:
手把手教你學51單片機(C語言版)
STC89C52手冊
解答和科普
一、編寫AT24C02的讀寫函數
1.I2C的拼圖
在main函數中調出來,AT.C就不用調出來I2C了。
位聲明:
sbit I2C_SCL =P1^7;
sbit I2C_SDA=P1^2;
1.1起始拼圖
void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;}
1.2終止拼圖
void I2C_Stop(void)
{I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}
1.3發送一個字節
void I2C_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i); //把數據放在線上I2C_SCL=1;I2C_SCL=0; //看時序是否滿足能夠承受的時間是多少}
}
1.4接受一個字節
unsigned char I2C_ReceiveByte(void)
{unsigned char i,Byte=0x00;I2C_SDA=1; //釋放總線for(i=0;i<8;i++){I2C_SCL=1;if(I2C_SDA){Byte|=(0x80>>i);}I2C_SCL=0;}return Byte;
}
1.5主機的發送應答
這里相當于主機寫:
void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}
1.6 從機的接收應答
這里是從機寫,反過來就是主機讀
unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit=0;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA; //高電平讀取I2C_SCL=0;return AckBit;
}
2.AT24C02 的數據幀
先宏定義一個地址:W
#define AT24C02_ADDRESS 0xA0
地址:R
AT24C02_ADDRESS|0x01
2.1字節寫
#define AT24C02_ADDRESS 0xA0/*** @brief AT24C02向指定地址寫入一個字節數據* @param WordAddress:字地址 范圍0-255,Data要寫入的數據* @retval 無*/
void AT24C02_WriteByte(unsigned char WordAddress,Data)
{I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck(); //先不處理I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_SendByte(Data);I2C_ReceiveAck();I2C_Stop();
}
2.2 隨機讀
/*** @brief AT24C02從指定地址讀出一個字節數據* @param WordAddress:要讀出的字地址和寫入的地址一樣* @retval 讀出的字節數據*/unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C02_ADDRESS|0x01);I2C_ReceiveAck();Data=I2C_ReceiveByte();I2C_SendAck(1);I2C_Stop();return Data;
}
3、寫入數據測試
#include <REGX52.H>
#include "Key.h"
#include "LCD1602.h"
#include "AT24C02.h"
#include "Delay.H"unsigned char Data;
void main(void)
{LCD_Init();LCD_ShowString(1,1,"HELLO");AT24C02_WriteByte(1,66);Delay(5);Data=AT24C02_ReadByte(1);LCD_ShowNum(2,1,Data,2);while(1){}
}
測試現象
先寫后讀,掉電不丟失。
AT24C02按鍵控制
#include <REGX52.H>
#include "Key.h"
#include "LCD1602.h"
#include "AT24C02.h"
#include "Delay.H"
#include "Init.h"unsigned char KeyNum;
unsigned int Num;
void main(void)
{LCD_Init();LCD_ShowNum(1,1,Num,5);Nixietube_OFF();DianZhengGuan();while(1){KeyNum=Key();if(KeyNum==1){Num++;LCD_ShowNum(1,1,Num,5);}if(KeyNum==2){Num--;LCD_ShowNum(1,1,Num,5);}if(KeyNum==3){AT24C02_WriteByte(0,Num%256);Delay(5);AT24C02_WriteByte(1,Num/256);Delay(5);LCD_ShowString(2,1,"Write OK");Delay(1000);LCD_ShowString(2,1," ");}if(KeyNum==4){Num=AT24C02_ReadByte(0);Num|=AT24C02_ReadByte(1)<<8; LCD_ShowNum(1,1,Num,5);LCD_ShowString(2,1,"Read OK");Delay(1000);LCD_ShowString(2,1," ");}}}
實現現象
AT24C02存儲數據(按鍵控制)
二、加入延遲函數實現LED閃爍
問題
總結
本節課主要學