51單片機讀寫內(nèi)部EEPROM詳解_第1頁
51單片機讀寫內(nèi)部EEPROM詳解_第2頁
51單片機讀寫內(nèi)部EEPROM詳解_第3頁
51單片機讀寫內(nèi)部EEPROM詳解_第4頁
51單片機讀寫內(nèi)部EEPROM詳解_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

標(biāo)準(zhǔn)文檔此文檔共包括三個程序。第一個程序最簡單易懂,看懂了基本就會讀寫51單片機內(nèi)部EEPROM了。第二個程序和第一個讀寫EEPROM原理差不多,包括有LCD1602操作方法,有寫字符串的方法。第三個程序在原有基礎(chǔ)上增添了外面中止功能,仔細(xì)的人會發(fā)現(xiàn),操作內(nèi)部EEPROM過程會將總中止封閉,實質(zhì)上程序要用到中止時只要在原有的EEPROM操作后加上開總中止即可。考證第二、第三個程序時需按程序內(nèi)主程序中的操作說明進(jìn)行燒錄單片機,以考證能否成功操作單片機內(nèi)部EEPROM。程序1:/***************************************************************作品:EEPROM實驗,開機復(fù)原關(guān)電前LED的亮滅情況單片機:STC89C52RC晶振:12M編譯環(huán)境:KeiluVision4V9.00***************************************************************///#include<STC89C52RC.H>#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint/****************特別功能存放器申明****************/sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2;//按鈕1sbitK2=P3^3;//按鈕2適用文案標(biāo)準(zhǔn)文檔voidcc(uintaddr);voidxcx(uintaddr,uchardat);uchardcx(uintaddr);voidQ0( );/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dcx(0x2002);//開機讀取EEPROM區(qū)2002h數(shù)據(jù),復(fù)原關(guān)電前LED的亮滅情況if(V==2){LED1=0;LED2=1;}elseif(V==6){LED1=0;LED2=0;}while(1){if(!K1){while(!K1);LED1=0;LED2=1;cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2002,2);//對EEPROM區(qū)2002h寫入2}if(!K2){while(!K2);LED1=0;LED2=0;cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2002,6);//對EEPROM區(qū)2002h寫入6}}}*//*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))進(jìn)口:addr=某一扇區(qū)首地點┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr)適用文案標(biāo)準(zhǔn)文檔{//翻開IAP功能(ISP_CONTR.7)=1:同意編程改變Flash,設(shè)置Flash操作等候時間//0x83(晶振<5M)0x82(晶振<10M)0x81(晶振<20M)0x80(晶振<40M)ISP_CONTR=0x81;ISP_CMD=0x03;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行扇區(qū)擦除ISP_ADDRL=addr;//ISP/IAP操作時的地點存放器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作時的地點存放器高八位。EA=0;ISP_TRIG=0x46;//在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,ISP_TRIG=0xB9;//再寫入B9h,ISP/IAP命令才會奏效。_nop_( );Q0( );//封閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)進(jìn)口:addr=扇區(qū)單元地點,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidxcx(uintaddr,uchardat){ISP_CONTR=0x81;ISP_CMD=0x02;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進(jìn)ISP_DATAEA=0;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_( );Q0( );//封閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)進(jìn)口:addr=扇區(qū)單元地點出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardcx(uintaddr){uchardat;ISP_CONTR=0x81;ISP_CMD=0x01;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;適用文案標(biāo)準(zhǔn)文檔EA=0;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_( );dat=ISP_DATA;//拿出數(shù)據(jù)Q0( );//封閉ISP/IAPreturndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):封閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0( ){ISP_CONTR=0;//封閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//封閉IAP功能,清與ISP相關(guān)的特別功能存放器}/*STC89C52RC內(nèi)部EEPROM詳盡地點表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*/適用文案標(biāo)準(zhǔn)文檔程序2:/***************************************************************作品:EEPROM實驗,開機復(fù)原關(guān)電前LED的亮滅情況單片機:STC89C52RC晶振:12M編譯環(huán)境:KeiluVision4V9.00***************************************************************///#include<STC89C52RC.H>#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint/****************特別功能存放器申明****************/sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2;//按鈕1sbitK2=P3^3;//按鈕2voidcc(uintaddr);voidxcx(uintaddr,uchardat);uchardcx(uintaddr);voidQ0( );#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endif適用文案標(biāo)準(zhǔn)文檔/**********************************PIN口定義**********************************/#defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^5;sbitLCD1602_RS=P2^6;/**********************************函數(shù)申明**********************************//*在51單片機12MHZ時鐘下的延時函數(shù)*/voidLcd1602_Delay1ms(uintc);//偏差0us/*LCD1602寫入8位命令子函數(shù)*/voidLcdWriteCom(ucharcom);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/voidLcdWriteData(uchardat);/*LCD1602初始化子程序*/voidLcdInit( );/*LCD1602寫入字符串*/voidLCDWrite_String(ucharx,uchary,ucharz,uchar*s);/*設(shè)置LCD1602寫入字符串的地點*/voidLCD_set_xy(ucharx,uchary,ucharz);ucharON_Hour=0x07;//初始開燈時間07:001ucharWarning_TempH=32;//高溫報警溫度5/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dcx(0x2002);//開機讀取EEPROM區(qū)2002h數(shù)據(jù),復(fù)原關(guān)電前LED的亮滅情況if(V==2){LED1=0;LED2=1;}elseif(V==6){LED1=0;LED2=0;}while(1)適用文案標(biāo)準(zhǔn)文檔{if(!K1){while(!K1);LED1=0;LED2=1;cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2002,2);//對EEPROM區(qū)2002h寫入2}if(!K2){while(!K2);LED1=0;LED2=0;cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2002,6);//對EEPROM區(qū)2002h寫入6}}}*/voidmain(void){LcdInit( );不注銷下邊三句,燒錄一次注銷小面三句,再燒錄一次若兩次燒錄后現(xiàn)象一致,則操作內(nèi)部EEPROM成功/////////////////////////////////////////////////////////////////cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2000,ON_Hour);//對EEPROM區(qū)2002h寫入2xcx(0x2001,Warning_TempH);//對EEPROM區(qū)2002h寫入2/////////////////////////////////////////////////////////////////ON_Hour=dcx(0x2000);Warning_TempH=dcx(0x2001);if((ON_Hour==0x07)||(Warning_TempH==32)){LcdWriteCom(0x80);LCDWrite_String(0,1,7,"SUCCESS");}else適用文案標(biāo)準(zhǔn)文檔LCDWrite_String(0,1,5,"ERROR");while(1);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))進(jìn)口:addr=某一扇區(qū)首地點┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){//翻開IAP功能(ISP_CONTR.7)=1:同意編程改變Flash,設(shè)置Flash操作等候時間//0x83(晶振<5M)0x82(晶振<10M)0x81(晶振<20M)0x80(晶振<40M)ISP_CONTR=0x81;ISP_CMD=0x03;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行扇區(qū)擦除ISP_ADDRL=addr;//ISP/IAP操作時的地點存放器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作時的地點存放器高八位。EA=0;ISP_TRIG=0x46;//在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,ISP_TRIG=0xB9;//再寫入B9h,ISP/IAP命令才會奏效。_nop_( );Q0( );//封閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)進(jìn)口:addr=扇區(qū)單元地點,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidxcx(uintaddr,uchardat){ISP_CONTR=0x81;ISP_CMD=0x02;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進(jìn)ISP_DATAEA=0;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_( );Q0( );//封閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)適用文案標(biāo)準(zhǔn)文檔進(jìn)口:addr=扇區(qū)單元地點出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardcx(uintaddr){uchardat;ISP_CONTR=0x81;ISP_CMD=0x01;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_( );dat=ISP_DATA;//拿出數(shù)據(jù)Q0( );//封閉ISP/IAPreturndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):封閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0( ){ISP_CONTR=0;//封閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//封閉IAP功能,清與ISP相關(guān)的特別功能存放器}/*STC89C52RC內(nèi)部EEPROM詳盡地點表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh適用文案標(biāo)準(zhǔn)文檔*//********************************************************************************函數(shù)名:Lcd1602_Delay1ms*函數(shù)功能:延時函數(shù),延時1ms*輸入:c*輸出:無*說名:該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//偏差0us{uchara,b;for(;c>0;c--){for(b=199;b>0;b--){for(a=1;a>0;a--);}}}/********************************************************************************函數(shù)名:voidLCDWrite_String(ucharx,uchary,uchar*s)*函數(shù)功能:向LCD寫入一個字符串*輸入:x,y,*s*輸出:無*******************************************************************************/voidLCDWrite_String(ucharx,uchary,ucharz,uchar*s)//x0~15,y0,1,2,3{適用文案標(biāo)準(zhǔn)文檔LCD_set_xy(x,y,z);while(*s){LcdWriteData(*s);s++;}}/********************************************************************************函數(shù)名:voidLCD_set_xy(ucharx,uchary,ucharz)*函數(shù)功能:指定向LCD寫入字符串的地點*輸入:x,y,z//x:橫坐標(biāo)y:縱坐標(biāo)z:字符串長度*輸出:無*******************************************************************************/voidLCD_set_xy(ucharx,uchary,ucharz){uchari;if(y==0){LcdWriteCom(0x80+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0x80+x);}if(y==1){LcdWriteCom(0xc0+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0xc0+x);}if(y==2){LcdWriteCom(0x94+x);for(i=0;i<z;i++){LcdWriteData('');}適用文案標(biāo)準(zhǔn)文檔LcdWriteCom(0x94+x);}if(y==3){LcdWriteCom(0xd4+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0xd4+x);}}/********************************************************************************函數(shù)名:LcdWriteCom*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入:com*輸出:無*******************************************************************************/#ifndefLCD1602_4PINS//當(dāng)沒有定義這個LCD1602_4PINS時voidLcdWriteCom(ucharcom)//寫入命令{LCD1602_E=0;//使能LCD1602_RS=0;//選擇發(fā)喪命令LCD1602_RW=0;//選擇寫入LCD1602_DATAPINS=com;//放入命令Lcd1602_Delay1ms(1);//等候數(shù)據(jù)穩(wěn)固LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);//保持時間LCD1602_E=0;}#elsevoidLcdWriteCom(ucharcom)//寫入命令{LCD1602_E=0;//使能清零LCD1602_RS=0;//選擇寫入命令LCD1602_RW=0;//選擇寫入LCD1602_DATAPINS=com;//因為4位的接線是接到P0口的高四位,因此傳遞高四位不用改適用文案標(biāo)準(zhǔn)文檔Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS=com<<4;//發(fā)送低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/********************************************************************************函數(shù)名:LcdWriteData*函數(shù)功能:向LCD寫入一個字節(jié)的數(shù)據(jù)*輸入:dat*輸出:無*******************************************************************************/#ifndefLCD1602_4PINSvoidLcdWriteData(uchardat)//寫入數(shù)據(jù){LCD1602_E=0;//使能清零LCD1602_RS=1;//選擇輸入數(shù)據(jù)LCD1602_RW=0;//選擇寫入LCD1602_DATAPINS=dat;//寫入數(shù)據(jù)Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);//保持時間LCD1602_E=0;}#elsevoidLcdWriteData(uchardat)//寫入數(shù)據(jù){LCD1602_E=0;//使能清零LCD1602_RS=1;//選擇寫入數(shù)據(jù)LCD1602_RW=0;//選擇寫入適用文案標(biāo)準(zhǔn)文檔LCD1602_DATAPINS=dat;//因為4位的接線是接到P0口的高四位,因此傳遞高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;LCD1602_DATAPINS=dat<<4;//寫入低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/********************************************************************************函數(shù)名:LcdInit( )*函數(shù)功能:初始化LCD屏*輸入:無*輸出:無*******************************************************************************/#ifndefLCD1602_4PINSvoidLcdInit( )//LCD初始化子程序{LcdWriteCom(0x38);//開顯示LcdWriteCom(0x0c);//開顯示不顯示光標(biāo)LcdWriteCom(0x06);//寫一個指針加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//設(shè)置數(shù)據(jù)指針起點}#elsevoidLcdInit( )//LCD初始化子程序{LcdWriteCom(0x32);//將8位總線轉(zhuǎn)為4位總線LcdWriteCom(0x28);//在四位線下的初始化LcdWriteCom(0x0c);//開顯示不顯示光標(biāo)LcdWriteCom(0x06);//寫一個指針加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//設(shè)置數(shù)據(jù)指針起點}#endif適用文案標(biāo)準(zhǔn)文檔程序3:/***************************************************************作品:EEPROM實驗,開機復(fù)原關(guān)電前LED的亮滅情況單片機:STC89C52RC晶振:12M編譯環(huán)境:KeiluVision4V9.00***************************************************************///#include<STC89C52RC.H>#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint/****************特別功能存放器申明****************/sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2;//按鈕1sbitK2=P3^3;//按鈕2voidcc(uintaddr);voidxcx(uintaddr,uchardat);uchardcx(uintaddr);voidQ0( );#ifndefuchar#defineucharunsignedchar適用文案標(biāo)準(zhǔn)文檔#endif#ifndefuint#defineuintunsignedint#endif/**********************************PIN口定義**********************************/#defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^5;sbitLCD1602_RS=P2^6;/**********************************函數(shù)申明**********************************//*在51單片機12MHZ時鐘下的延時函數(shù)*/voidLcd1602_Delay1ms(uintc);//偏差0us/*LCD1602寫入8位命令子函數(shù)*/voidLcdWriteCom(ucharcom);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/voidLcdWriteData(uchardat);/*LCD1602初始化子程序*/voidLcdInit( );/*LCD1602寫入字符串*/voidLCDWrite_String(ucharx,uchary,ucharz,uchar*s);/*設(shè)置LCD1602寫入字符串的地點*/voidLCD_set_xy(ucharx,uchary,ucharz);voidIntConfiguration( );/*ucharON_Hour=0x07;//初始開燈時間07:001ucharWarning_TempH=32;//高溫報警溫度5*/ucharON_Hour;//初始開燈時間07:001ucharWarning_TempH;//高溫報警溫度/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈適用文案標(biāo)準(zhǔn)文檔函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(void){LcdInit( );IntConfiguration( );//////////////////////////////////////////////////////////////////*cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2000,ON_Hour);//對EEPROM區(qū)2002h寫入2xcx(0x2001,Warning_TempH);//對EEPROM區(qū)2002h寫入2*//////////////////////////////////////////////////////////////////while(1){ON_Hour=dcx(0x2000);Warning_TempH=dcx(0x2001);if((ON_Hour==0x07)||(Warning_TempH==32)){LcdWriteCom(0x80);LCDWrite_String(0,1,7,"SUCCESS");}elseLcdWriteCom(0x80);LCDWrite_String(0,1,5,"ERROR");}/*ucharV;V=dcx(0x2002);//開機讀取EEPROM區(qū)2002h數(shù)據(jù),復(fù)原關(guān)電前LED的亮滅情況if(V==2){LED1=0;LED2=1;}elseif(V==6){LED1=0;LED2=0;}while(1){適用文案標(biāo)準(zhǔn)文檔if(!K1){while(!K1);LED1=0;LED2=1;cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2002,2);//對EEPROM區(qū)2002h寫入2}if(!K2){while(!K2);LED1=0;LED2=0;cc(0x2000);//擦除第1個扇區(qū)(2000h~21FFh)xcx(0x2002,6);//對EEPROM區(qū)2002h寫入6}}*/}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))進(jìn)口:addr=某一扇區(qū)首地點┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){//翻開IAP功能(ISP_CONTR.7)=1:同意編程改變Flash,設(shè)置Flash操作等候時間//0x83(晶振<5M)0x82(晶振<10M)0x81(晶振<20M)0x80(晶振<40M)ISP_CONTR=0x81;ISP_CMD=0x03;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行扇區(qū)擦除ISP_ADDRL=addr;//ISP/IAP操作時的地點存放器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作時的地點存放器高八位。EA=0;ISP_TRIG=0x46;//在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,ISP_TRIG=0xB9;//再寫入B9h,ISP/IAP命令才會奏效。_nop_( );Q0( );//封閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)進(jìn)口:addr=扇區(qū)單元地點,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidxcx(uintaddr,uchardat)適用文案標(biāo)準(zhǔn)文檔{ISP_CONTR=0x81;ISP_CMD=0x02;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進(jìn)ISP_DATAEA=0;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_( );Q0( );//封閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)進(jìn)口:addr=扇區(qū)單元地點出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardcx(uintaddr){uchardat;ISP_CONTR=0x81;ISP_CMD=0x01;//用戶能夠?qū)?DataFlash/EEPROM區(qū)"進(jìn)行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_( );dat=ISP_DATA;//拿出數(shù)據(jù)Q0( );//封閉ISP/IAPreturndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):封閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0( ){ISP_CONTR=0;//封閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//封閉IAP功能,清與ISP相關(guān)的特別功能存放器EA=1;}適用文案標(biāo)準(zhǔn)文檔/*STC89C52RC內(nèi)部EEPROM詳盡地點表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點開端地點結(jié)束地點2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*//********************************************************************************函數(shù)名:Lcd1602_Delay1ms*函數(shù)功能:延時函數(shù),延時1ms*輸入:c*輸出:無*說名:該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//偏差0us{uchara,b;for(;c>0;c--){for(b=199;b>0;b--){適用文案標(biāo)準(zhǔn)文檔for(a=1;a>0;a--);}}}/********************************************************************************函數(shù)名:voidLCDWrite_String(ucharx,uchary,uchar*s)*函數(shù)功能:向LCD寫入一個字符串*輸入:x,y,*s*輸出:無*******************************************************************************/voidLCDWrite_String(ucharx,uchary,ucharz,uchar*s)//x0~15,y0,1,2,3{LCD_set_xy(x,y,z);while(*s){LcdWriteData(*s);s++;}}/********************************************************************************函數(shù)名:voidLCD_set_xy(ucharx,uchary,ucharz)*函數(shù)功能:指定向LCD寫入字符串的地點*輸入:x,y,z//x:橫坐標(biāo)y:縱坐標(biāo)z:字符串長度*輸出:無*******************************************************************************/voidLCD_set_xy(ucharx,uchary,ucharz){uchari;if(y==0){LcdWriteCom(0x80+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0x80+x);}if(y==1)適用文案標(biāo)準(zhǔn)文檔{LcdWriteCom(0xc0+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0xc0+x);}if(y==2){LcdWriteCom(0x94+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0x94+x);}if(y==3){LcdWriteCom(0xd4+x);for(i=0;i<z;i++){LcdWriteData('');}LcdWriteCom(0xd4+x);}}/********************************************************************************函數(shù)名:LcdWriteCom*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入:com*輸出:無*******************************************************************************/#ifndefLCD1602_4PINS//當(dāng)沒有定義這個LCD1602_4PINS時voidLcdWriteCom(ucharcom)//寫入命令{LCD1602_E=0;//使能LCD1602_RS=0;//選擇發(fā)喪命令LCD1602_RW=0;//選擇寫入LCD1602_DATAPINS=com;//放入命令適用文案標(biāo)準(zhǔn)文檔Lcd1602_Delay1ms(1);//等候數(shù)據(jù)穩(wěn)固LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);//保持時間LCD1602_E=0;}#elsevoidLcdWriteCom(ucharcom)//寫入命令{LCD1602_E=0;//使能清零LCD1602_RS=0;//選擇寫入命令LCD1602_RW=0;//選擇寫入LCD1602_DATAPINS=com;//因為4位的接線是接到P0口的高四位,因此傳遞高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS=com<<4;//發(fā)送低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//寫入時序Lcd1602_D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論