在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在PIC16F877A微控制器中使用EEPROM保存數(shù)據(jù)

科技觀察員 ? 來源:circuitdigest ? 作者:阿斯文斯·拉吉 ? 2023-01-25 15:39 ? 次閱讀

在本教程中,我們將了解使用 PIC16F877A 微控制器中的 EEPROM 保存數(shù)據(jù)是多么容易。在大多數(shù)實(shí)時(shí)項(xiàng)目中,我們可能必須保存一些數(shù)據(jù),即使關(guān)閉電源也不應(yīng)刪除這些數(shù)據(jù)。這聽起來像是一個(gè)復(fù)雜的過程,但在XC8編譯器的幫助下,只需使用一行代碼即可完成此任務(wù)。如果數(shù)據(jù)在兆字節(jié)方面很大,那么我們可以連接SD卡等存儲(chǔ)設(shè)備并將這些數(shù)據(jù)存儲(chǔ)在其中。但是,如果數(shù)據(jù)很小,我們可以避免那些累人的過程,我們可以簡單地使用PIC微控制器中存在的EEPROM來保存我們的數(shù)據(jù)并隨時(shí)檢索它。

PIC16F877A 中的 EEPROM:

EEPROM 代表“電子可擦除和可編程只讀存儲(chǔ)器”。顧名思義,它是PIC微控制器內(nèi)部的存儲(chǔ)器,我們可以通過編程來寫入/讀取數(shù)據(jù)。僅當(dāng)程序中提到這樣做時(shí),保存在此中的數(shù)據(jù)才會(huì)被刪除。EEPROM 中可用的存儲(chǔ)空間量因每個(gè)微控制器而異;詳細(xì)信息將照常在數(shù)據(jù)表中給出。在我們的PIC16F877A案例中,可用空間為256字節(jié),如其規(guī)格數(shù)據(jù)表中所述。現(xiàn)在讓我們看看如何使用這 256 字節(jié)通過簡單的實(shí)驗(yàn)設(shè)置來讀/寫數(shù)據(jù)。

電路圖及說明:

1.png

該項(xiàng)目的電路圖如上所示。我們已經(jīng)連接了一個(gè)LCD,以可視化保存和檢索的數(shù)據(jù)。普通電位計(jì)連接到AN4模擬通道,因此饋入可變電壓,該可變電壓將用作要保存在EEPROM中的數(shù)據(jù)。我們還在RB0上使用了一個(gè)按鈕,當(dāng)按下這個(gè)按鈕時(shí),來自模擬通道的數(shù)據(jù)將保存在EEPROM中。

這種連接可以在面包板上進(jìn)行。PIC微控制器的引腳排列如下表所示。

S.No: 引腳編號 引腳名稱 已連接到
1 21 RD2 液晶顯示器的 RS
2 22 RD3 液晶顯示器的E
3 27 RD4 液晶屏D4
4 28 RD5 液晶屏D5
5 29 RD6 液晶屏D6
6 30 RD7 液晶屏D7
7 33 RBO/INT 按鈕
8 7 AN4 電位計(jì)

模擬使用PIC EEPROM:

該項(xiàng)目還涉及使用 Proteus 設(shè)計(jì)的模擬,使用它我們可以在沒有任何硬件的情況下模擬項(xiàng)目的工作。本教程末尾給出了此模擬的程序。您可以簡單地從這里使用十六進(jìn)制文件并模擬整個(gè)過程。

仿真過程中,您可以在LCD屏幕上可視化當(dāng)前ADC值和保存在EEPROM中的數(shù)據(jù)。要將當(dāng)前ADC值保存到EEPROM中,只需按下連接到RB0的開關(guān)即可保存。模擬的快照如下所示。

模擬使用PIC EEPROM的方法

EEPROM的編程PIC:

本教程的完整代碼在本教程末尾給出。在我們的程序中,我們必須從ADC模塊讀取值,當(dāng)按下按鈕時(shí),我們必須將該值保存在EEPROM中。由于我們已經(jīng)了解了ADC和LCD接口,我將進(jìn)一步解釋從EEPROM保存和檢索數(shù)據(jù)的代碼。

根據(jù)數(shù)據(jù)表“這些器件具有 4 或 8K 字的程序閃存,PIC16F877A 的地址范圍從 0000h 到 1FFFh”。這意味著每個(gè)EEPROM存儲(chǔ)空間都有一個(gè)地址,可以通過該地址訪問它,在我們的MCU中,該地址從0000h到1FFFh開始。

要將數(shù)據(jù)保存在特定的EEPROM地址中,只需使用以下行。

eeprom_write(0,adc);

這里的“adc”是一個(gè)整數(shù)類型的變量,其中存在要保存的數(shù)據(jù)。“0”是保存我們數(shù)據(jù)的EEPROM地址。語法“eeprom_write”由我們的XC8編譯器提供,因此編譯器將自動(dòng)處理寄存器

要檢索已存儲(chǔ)在EEPROM中的數(shù)據(jù)并將其保存到變量中,可以使用以下代碼行。

Sadc = (int)eeprom_read(0);

在這里,“Sadc”是保存來自EEPROM的數(shù)據(jù)的變量。“0”是我們從中檢索數(shù)據(jù)的EEPROM地址。語法“eeprom_read”由我們的XC8編譯器提供,因此編譯器將自動(dòng)處理寄存器。保存在EEPROM中的數(shù)據(jù)將采用十六進(jìn)制類型。因此,我們通過在語法前加上 (int) 來將它們轉(zhuǎn)換為整數(shù)類型。

加工:

一旦我們了解了代碼的工作原理并準(zhǔn)備好了硬件,我們就可以測試代碼了。將代碼上傳到 PIC 微控制器并啟動(dòng)設(shè)置。如果一切按預(yù)期工作,則應(yīng)在LCD中看到當(dāng)前ADC值。現(xiàn)在,您可以按下按鈕將ADC值保存到EEPROM。現(xiàn)在,您可以通過關(guān)閉整個(gè)系統(tǒng)并再次打開來檢查值是否已保存。開機(jī)后,您應(yīng)該會(huì)在LCD屏幕上看到之前保存的值。

PIC16F877A EEPROM 教程

#define _XTAL_FREQ 20000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//LCD Functions Developed by Circuit Digest.
void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines
{
if(data_bit& 1)
D4 = 1;
else
D4 = 0;
if(data_bit& 2)
D5 = 1;
else
D5 = 0;
if(data_bit& 4)
D6 = 1;
else
D6 = 0;
if(data_bit& 8)
D7 = 1;
else
D7 = 0;
}
void Lcd_Cmd(char a)
{
RS = 0;
Lcd_SetBit(a); //Incoming Hex value
EN = 1;
__delay_ms(4);
EN = 0;
}
void Lcd_Clear()
{
Lcd_Cmd(0); //Clear the LCD
Lcd_Cmd(1); //Move the curser to first position
}
void Lcd_Set_Cursor(char a, char b)
{
char temp,z,y;
if(a== 1)
{
temp = 0x80 + b - 1; //80H is used to move the curser
z = temp>>4; //Lower 8-bits
y = temp & 0x0F; //Upper 8-bits
Lcd_Cmd(z); //Set Row
Lcd_Cmd(y); //Set Column
}
else if(a== 2)
{
temp = 0xC0 + b - 1;
z = temp>>4; //Lower 8-bits
y = temp & 0x0F; //Upper 8-bits
Lcd_Cmd(z); //Set Row
Lcd_Cmd(y); //Set Column
}
}
void Lcd_Start()
{
Lcd_SetBit(0x00);
for(int i=1065244; i<=0; i--) NOP();
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
Lcd_Cmd(0x08); //Select Row 1
Lcd_Cmd(0x00); //Clear Row 1 Display
Lcd_Cmd(0x0C); //Select Row 2
Lcd_Cmd(0x00); //Clear Row 2 Display
Lcd_Cmd(0x06);
}
void Lcd_Print_Char(char data) //Send 8-bits through 4-bit mode
{
char Lower_Nibble,Upper_Nibble;
Lower_Nibble = data&0x0F;
Upper_Nibble = data&0xF0;
RS = 1; // => RS = 1
Lcd_SetBit(Upper_Nibble>>4); //Send upper half by shifting by 4
EN = 1;
for(int i=2130483; i<=0; i--) NOP();
EN = 0;
Lcd_SetBit(Lower_Nibble); //Send Lower half
EN = 1;
for(int i=2130483; i<=0; i--) NOP();
EN = 0;
}
void Lcd_Print_String(char *a)
{
int i;
for(i=0;a[i]!='\\0';i++)
Lcd_Print_Char(a[i]); //Split the string using pointers and call the Char function
}
/*****End of LCD Functions*****/
//**ADC FUnctions***//
void ADC_Initialize()
{
ADCON0 = 0b01000001; //ADC ON and Fosc/16 is selected
ADCON1 = 0b11000000; // Internal reference voltage is selected
}
unsigned int ADC_Read(unsigned char channel)
{
ADCON0 &= 0x11000101; //Clearing the Channel Selection Bits
ADCON0 |= channel<<3; //Setting the required Bits
__delay_ms(2); //Acquisition time to charge hold capacitor
GO_nDONE = 1; //Initializes A/D Conversion
while(GO_nDONE); //Wait for A/D Conversion to complete
return ((ADRESH<<8)+ADRESL); //Returns Result
}
//***End of ADC Functions***//
int main()
{
int adc=0; //Variable to read ADC value
int a1,a2,a3,a4; //Variable to split ADC value into char
int Sadc=0; //Variable to read ADC value
int Sa1,Sa2,Sa3,Sa4; //Variable to split ADC value into char
TRISD = 0x00; //PORTD declared as output for interfacing LCD
TRISA4 =1; //AN4 declared as input
TRISB0 = 1;
OPTION_REG=0b00000000;
ADC_Initialize();
Lcd_Start();
Lcd_Clear();
while(1)
{
adc=ADC_Read(4); //Read ADC
//**Display ADC**//
a1 = (adc/1000)%10;
a2 = (adc/100)%10;
a3 = (adc/10)%10;
a4 = (adc/1)%10;
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ADC:");
Lcd_Print_Char(a1+'0');
Lcd_Print_Char(a2+'0');
Lcd_Print_Char(a3+'0');
Lcd_Print_Char(a4+'0');
//**Display SADC**//
Sa1 = (Sadc/1000)%10;
Sa2 = (Sadc/100)%10;
Sa3 = (Sadc/10)%10;
Sa4 = (Sadc/1)%10;
Lcd_Set_Cursor(2,1);
Lcd_Print_String("Saved ADC:");
Lcd_Print_Char(Sa1+'0');
Lcd_Print_Char(Sa2+'0');
Lcd_Print_Char(Sa3+'0');
Lcd_Print_Char(Sa4+'0');
/*These devices have 4 or 8K words of
program Flash, with an address range from 0000h to
1FFFh for the PIC16F877A*/
if (RB0==0)
{eeprom_write(0,adc);}
Sadc = (int)eeprom_read(0);
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ADC:");
}
return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7844

    瀏覽量

    153384
  • PIC16F877A
    +關(guān)注

    關(guān)注

    2

    文章

    43

    瀏覽量

    22012
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1061

    瀏覽量

    83025
收藏 人收藏

    評論

    相關(guān)推薦

    將繼電器與PIC微控制器PIC16F877A連接的教程

    在本項(xiàng)目中,我們將繼電器與PIC微控制器PIC16F877A連接。繼電器是一種機(jī)械設(shè)備,用于從較低的電壓電平控制高電壓、大電流電器的“ON”或“OFF”。繼電器在兩個(gè)電壓電平之間提供隔
    的頭像 發(fā)表于 11-14 16:20 ?3760次閱讀
    將繼電器與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b><b class='flag-5'>PIC16F877A</b>連接的教程

    如何使用PIC微控制器旋轉(zhuǎn)步進(jìn)電機(jī)

    在本教程中,我們將步進(jìn)電機(jī)與PIC微控制器PIC16F877A連接。
    發(fā)表于 11-15 17:25 ?1650次閱讀
    如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>旋轉(zhuǎn)步進(jìn)電機(jī)

    如何使用PIC微控制器構(gòu)建一個(gè)線路跟隨機(jī)器人

    線路跟隨機(jī)器人是一個(gè)簡單而迷人的機(jī)器人,適合大多數(shù)學(xué)生/業(yè)余愛好者建造。在本教程中,我們將學(xué)習(xí)線路跟隨機(jī)器人的工作原理以及如何使用 PIC 微控制器 PIC16F877A 構(gòu)建一個(gè)。PIC16
    發(fā)表于 11-30 17:17 ?1818次閱讀
    如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>構(gòu)建一個(gè)線路跟隨機(jī)器人

    PIC16F877A中的EEPROM錯(cuò)誤

    海都。我用C語言編寫了一個(gè)簡單的內(nèi)部EEPROM程序,使用MPLAB和高技術(shù)C編譯。在PIC16F877 A中,EEPROM為256字節(jié)。
    發(fā)表于 06-11 15:11

    pic16f877a中文資料pdf

    pic16f877a中文資料
    發(fā)表于 07-15 13:20 ?4548次下載
    <b class='flag-5'>pic16f877a</b>中文資料pdf

    基于PIC16F877A的太陽能與市電互補(bǔ)照明系統(tǒng)控制器的設(shè)

    基于PIC16F877A的太陽能與市電互補(bǔ)照明系統(tǒng)控制器的設(shè)計(jì) 介紹了一款以單片機(jī)PIC16F877A控制核心的太陽能與市電互補(bǔ)照明系統(tǒng)控制器
    發(fā)表于 04-10 22:06 ?1396次閱讀
    基于<b class='flag-5'>PIC16F877A</b>的太陽能與市電互補(bǔ)照明系統(tǒng)<b class='flag-5'>控制器</b>的設(shè)

    PIC16F877A串口發(fā)送查詢方式

    PIC16F877A串口發(fā)送,查詢方式,就為了調(diào)出這個(gè)費(fèi)了我一天時(shí)間,原來是串口芯片電壓問題,現(xiàn)總結(jié)如下
    發(fā)表于 09-01 11:03 ?10次下載
    <b class='flag-5'>PIC16F877A</b>串口發(fā)送查詢方式

    PIC16F877A串口芯片電壓問題

    PIC16F877A串口發(fā)送,查詢方式,就為了調(diào)出這個(gè)費(fèi)了我一天時(shí)間,原來是串口芯片電壓問題,現(xiàn)總結(jié)如下
    發(fā)表于 09-01 11:15 ?9次下載
    <b class='flag-5'>PIC16F877A</b>串口芯片電壓問題

    PIC16F877A的T0定時(shí)制作的電子鐘程序

    經(jīng)過努力,利用PIC16F877A的T0定時(shí)制作的電子鐘實(shí)驗(yàn)成功!
    發(fā)表于 05-15 09:42 ?2006次閱讀

    PIC16F877A開發(fā)板 數(shù)碼管動(dòng)態(tài)掃描實(shí)驗(yàn)

    //****************電子園PIC16F877A開發(fā)板 數(shù)碼管動(dòng)態(tài)掃描實(shí)驗(yàn)****************//////mcu: PIC16F877A 4MHz //2010年12月
    發(fā)表于 11-16 19:51 ?13次下載
    <b class='flag-5'>PIC16F877A</b>開發(fā)板 數(shù)碼管動(dòng)態(tài)掃描實(shí)驗(yàn)

    PIC16F877A開發(fā)板 普通IO驅(qū)動(dòng)74595實(shí)驗(yàn)

    //*****************電子園PIC16F877A開發(fā)板 普通IO驅(qū)動(dòng)74595實(shí)驗(yàn)***************////PIC16F877A 實(shí)驗(yàn)板////mcu
    發(fā)表于 11-16 19:51 ?13次下載
    <b class='flag-5'>PIC16F877A</b>開發(fā)板 普通IO驅(qū)動(dòng)74595實(shí)驗(yàn)

    PIC16F877A 看門狗定時(shí)實(shí)驗(yàn)

    //*******************PIC16F877A 看門狗定時(shí)實(shí)驗(yàn)******************* // //PORTA,PORTB,PORTC,PORTD,PORTE
    發(fā)表于 11-16 20:06 ?8次下載
    <b class='flag-5'>PIC16F877A</b> 看門狗定時(shí)<b class='flag-5'>器</b>實(shí)驗(yàn)

    使用熱敏打印機(jī)連接PIC16F877A并使用輕觸開關(guān)實(shí)現(xiàn)打印的教程

    在本教程中,我們將熱敏打印機(jī) CSN A1 與廣泛使用的 PIC 微控制器 PIC16F877A 連接。在本項(xiàng)目中,熱敏打印機(jī)連接在PIC16F87
    的頭像 發(fā)表于 11-04 15:10 ?3306次閱讀
    使用熱敏打印機(jī)連接<b class='flag-5'>PIC16F877A</b>并使用輕觸開關(guān)實(shí)現(xiàn)打印的教程

    何在PIC16F877A微控制器中使用中斷

    在本教程中,我們將學(xué)習(xí)如何 在PIC微控制器中使用外部中斷 ,以及為什么/在哪里需要它們。
    的頭像 發(fā)表于 01-25 15:32 ?2231次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>PIC16F877A</b><b class='flag-5'>微控制器</b><b class='flag-5'>中使</b>用中斷

    PIC16F877A開發(fā)板原理圖

    PIC16F877A開發(fā)板原理圖免費(fèi)下載。
    發(fā)表于 03-21 15:47 ?12次下載
    主站蜘蛛池模板: 天堂在线最新版www中文 | 久久婷人人澡人人爽 | 久久久综合久久 | 乱人伦一区二区三区 | 视频免费观看视频 | 一区二区在线看 | 中文字幕佐山爱一区二区免费 | 韩国三级理论在线看中文字幕 | 欧美性猛交xxxx乱大交高清 | 奇米米奇777 | 日本三黄色大 | 东莞a级毛片 | 色播影院性播免费看 | 嫩草影院地址一地址二 | 日韩久久精品视频 | 5x性区m免费毛片视频看看 | 六月天婷婷 | 1024手机看片日韩 | 国产成人午夜片在线观看 | 男女一进一出无遮挡黄 | 黄色一级视频欧美 | 亚洲无线码一区在线观看 | 久久精品综合 | 天天添 | 黄色毛片免费网站 | 久久婷婷五综合一区二区 | 亚洲第一成人影院 | 精品伊人久久大线蕉地址 | 夜夜爽天天操 | 一区在线播放 | 性喷潮久久久久久久久 | 欧美3d成人动画在线 | 日本xxxx色视频在线观看免费 | 看大片全色黄大色黄 | jiuma和我啪啪 | 天天干天天曰天天操 | 二区三区在线观看 | 影音先锋午夜资源网站 | 在线天堂中文字幕 | 美女被日出白浆 | 天堂最新资源在线 |