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頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-.z.此文檔共包含三個程序。第一個程序最簡單易懂,看懂了基本就會讀寫51單片機部EEPROM了。第二個程序和第一個讀寫EEPROM原理差不多,包含有LCD1602操作方法,有寫字符串的方法。第三個程序在原有基礎(chǔ)上增加了外部中斷功能,細心的人會發(fā)現(xiàn),操作部EEPROM過程會將總中斷關(guān)閉,實際上程序要用到中斷時只需在原有的EEPROM操作后加上開總中斷即可。驗證第二、第三個程序時需按程序主程序中的操作說明進行燒錄單片機,以驗證是否成功操作單片機部EEPROM。程序1:/***************************************************************作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況單片機:STC89C52RC晶振:12M編譯環(huán)境:KeiluVision4V9.00***************************************************************///*include<STC89C52RC.H>*include<reg52.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedint/****************特殊功能寄存器聲明****************/sfrISP_DATA=0*e2;sfrISP_ADDRH=0*e3;sfrISP_ADDRL=0*e4;sfrISP_CMD=0*e5;sfrISP_TRIG=0*e6;sfrISP_CONTR=0*e7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2; //按鈕1sbitK2=P3^3; //按鈕2voidcc(uintaddr);void*c*(uintaddr,uchardat);uchardc*(uintaddr);voidQ0();/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dc*(0*2002); //開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(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(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,2); //對EEPROM區(qū)2002h寫入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,6); //對EEPROM區(qū)2002h寫入6 }}}*//*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除*一扇區(qū)(每個扇區(qū)512字節(jié))入口:addr=*一扇區(qū)首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打開IAP功能(ISP_CONTR.7)=1:允許編程改變Flash,設(shè)置Flash操作等待時間//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用戶可以對"DataFlash/EEPROM區(qū)"進行扇區(qū)擦除ISP_ADDRL=addr;//ISP/IAP操作時的地址寄存器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作時的地址寄存器高八位。EA=0;ISP_TRIG=0*46;//在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,ISP_TRIG=0*B9;//再寫入B9h,ISP/IAP命令才會生效。_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)入口:addr=扇區(qū)單元地址,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)入口:addr=扇區(qū)單元地址出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出數(shù)據(jù)Q0(); //關(guān)閉ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):關(guān)閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//關(guān)閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//關(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器}/*STC89C52RC部EEPROM詳細地址表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*/程序2:/***************************************************************作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況單片機:STC89C52RC晶振:12M編譯環(huán)境:KeiluVision4V9.00***************************************************************///*include<STC89C52RC.H>*include<reg52.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedint/****************特殊功能寄存器聲明****************/sfrISP_DATA=0*e2;sfrISP_ADDRH=0*e3;sfrISP_ADDRL=0*e4;sfrISP_CMD=0*e5;sfrISP_TRIG=0*e6;sfrISP_CONTR=0*e7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2; //按鈕1sbitK2=P3^3; //按鈕2voidcc(uintaddr);void*c*(uintaddr,uchardat);uchardc*(uintaddr);voidQ0();*ifndefuchar*defineucharunsignedchar*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ù)*/voidLcdWrite(uchar);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit();/*LCD1602寫入字符串*/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s);/*設(shè)置LCD1602寫入字符串的位置*/voidLCD_set_*y(uchar*,uchary,ucharz); ucharON_Hour=0*07; //初始開燈時間07:00 1ucharWarning_TempH=32; //高溫報警溫度5/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dc*(0*2002); //開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(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(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,2); //對EEPROM區(qū)2002h寫入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,6); //對EEPROM區(qū)2002h寫入6 }}}*/voidmain(void){LcdInit();//不注銷下面三句,燒錄一次//注銷小面三句,再燒錄一次//若兩次燒錄后現(xiàn)象一致,則操作部EEPROM成功/////////////////////////////////////////////////////////////////cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2000,ON_Hour); //對EEPROM區(qū)2002h寫入2*c*(0*2001,Warning_TempH); //對EEPROM區(qū)2002h寫入2/////////////////////////////////////////////////////////////////ON_Hour=dc*(0*2000);Warning_TempH=dc*(0*2001);if((ON_Hour==0*07)||(Warning_TempH==32)){ LcdWrite(0*80); LCDWrite_String(0,1,7,"SUCCESS");}elseLCDWrite_String(0,1,5,"ERROR");while(1);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除*一扇區(qū)(每個扇區(qū)512字節(jié))入口:addr=*一扇區(qū)首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打開IAP功能(ISP_CONTR.7)=1:允許編程改變Flash,設(shè)置Flash操作等待時間//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用戶可以對"DataFlash/EEPROM區(qū)"進行扇區(qū)擦除ISP_ADDRL=addr;//ISP/IAP操作時的地址寄存器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作時的地址寄存器高八位。EA=0;ISP_TRIG=0*46;//在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,ISP_TRIG=0*B9;//再寫入B9h,ISP/IAP命令才會生效。_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)入口:addr=扇區(qū)單元地址,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)入口:addr=扇區(qū)單元地址出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出數(shù)據(jù)Q0(); //關(guān)閉ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):關(guān)閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//關(guān)閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//關(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器}/*STC89C52RC部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--) { for(a=1;a>0;a--); } } }/********************************************************************************函數(shù)名:voidLCDWrite_String(uchar*,uchary,uchar*s)*函數(shù)功能:向LCD寫入一個字符串*輸入:*,y,*s*輸出:無*******************************************************************************/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s) //*0~15,y0,1,2,3{ LCD_set_*y(*,y,z); while(*s) { LcdWriteData(*s); s++; }}/********************************************************************************函數(shù)名:voidLCD_set_*y(uchar*,uchary,ucharz)*函數(shù)功能:指定向LCD寫入字符串的位置*輸入:*,y,z //*:橫坐標(biāo)y:縱坐標(biāo)z:字符串長度*輸出:無*******************************************************************************/voidLCD_set_*y(uchar*,uchary,ucharz){ uchari; if(y==0) { LcdWrite(0*80+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*80+*); } if(y==1) { LcdWrite(0*c0+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*c0+*); } if(y==2) { LcdWrite(0*94+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*94+*); } if(y==3) { LcdWrite(0*d4+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*d4+*); }}/********************************************************************************函數(shù)名:LcdWrite*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入:*輸出:無*******************************************************************************/*ifndef LCD1602_4PINS //當(dāng)沒有定義這個LCD1602_4PINS時voidLcdWrite(uchar) //寫入命令{LCD1602_E=0;//使能LCD1602_RS=0; //選擇發(fā)送命令LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=;//放入命令Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定LCD1602_E=1; //寫入時序Lcd1602_Delay1ms(5); //保持時間LCD1602_E=0;}*elsevoidLcdWrite(uchar) //寫入命令{LCD1602_E=0; //使能清零LCD1602_RS=0; //選擇寫入命令LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改Lcd1602_Delay1ms(1); LCD1602_E=1; //寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;// Lcd1602_Delay1ms(1); LCD1602_DATAPINS=<<4;//發(fā)送低四位Lcd1602_Delay1ms(1); LCD1602_E=1; //寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;}*endif/********************************************************************************函數(shù)名:LcdWriteData*函數(shù)功能:向LCD寫入一個字節(jié)的數(shù)據(jù)*輸入:dat*輸出:無*******************************************************************************/ *ifndef LCD1602_4PINS voidLcdWriteData(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; //選擇寫入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屏*輸入:無*輸出:無*******************************************************************************/ *ifndef LCD1602_4PINSvoidLcdInit() //LCD初始化子程序{ LcdWrite(0*38);//開顯示LcdWrite(0*0c);//開顯示不顯示光標(biāo)LcdWrite(0*06);//寫一個指針加1 LcdWrite(0*01);//清屏LcdWrite(0*80);//設(shè)置數(shù)據(jù)指針起點}*elsevoidLcdInit() //LCD初始化子程序{LcdWrite(0*32); //將8位總線轉(zhuǎn)為4位總線LcdWrite(0*28); //在四位線下的初始化LcdWrite(0*0c);//開顯示不顯示光標(biāo)LcdWrite(0*06);//寫一個指針加1 LcdWrite(0*01);//清屏LcdWrite(0*80);//設(shè)置數(shù)據(jù)指針起點}*endif程序3:/***************************************************************作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況單片機:STC89C52RC晶振:12M編譯環(huán)境:KeiluVision4V9.00***************************************************************///*include<STC89C52RC.H>*include<reg52.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedint/****************特殊功能寄存器聲明****************/sfrISP_DATA=0*e2;sfrISP_ADDRH=0*e3;sfrISP_ADDRL=0*e4;sfrISP_CMD=0*e5;sfrISP_TRIG=0*e6;sfrISP_CONTR=0*e7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2; //按鈕1sbitK2=P3^3; //按鈕2voidcc(uintaddr);void*c*(uintaddr,uchardat);uchardc*(uintaddr);voidQ0();*ifndefuchar*defineucharunsignedchar*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ù)*/voidLcdWrite(uchar);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit(); /*LCD1602寫入字符串*/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s);/*設(shè)置LCD1602寫入字符串的位置*/voidLCD_set_*y(uchar*,uchary,ucharz); voidIntConfiguration();/*ucharON_Hour=0*07; //初始開燈時間07:00 1ucharWarning_TempH=32; //高溫報警溫度5*/ucharON_Hour; //初始開燈時間07:00 1ucharWarning_TempH; //高溫報警溫度/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(void){LcdInit();IntConfiguration();//////////////////////////////////////////////////////////////////*cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2000,ON_Hour); //對EEPROM區(qū)2002h寫入2*c*(0*2001,Warning_TempH); //對EEPROM區(qū)2002h寫入2*//////////////////////////////////////////////////////////////////while(1){ON_Hour=dc*(0*2000);Warning_TempH=dc*(0*2001);if((ON_Hour==0*07)||(Warning_TempH==32)){ LcdWrite(0*80); LCDWrite_String(0,1,7,"SUCCESS");}elseLcdWrite(0*80);LCDWrite_String(0,1,5,"ERROR");}/*ucharV;V=dc*(0*2002); //開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(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(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,2); //對EEPROM區(qū)2002h寫入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,6); //對EEPROM區(qū)2002h寫入6 }} */}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除*一扇區(qū)(每個扇區(qū)512字節(jié))入口:addr=*一扇區(qū)首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打開IAP功能(ISP_CONTR.7)=1:允許編程改變Flash,設(shè)置Flash操作等待時間//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用戶可以對"DataFlash/EEPROM區(qū)"進行扇區(qū)擦除ISP_ADDRL=addr;//ISP/IAP操作時的地址寄存器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作時的地址寄存器高八位。EA=0;ISP_TRIG=0*46;//在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,ISP_TRIG=0*B9;//再寫入B9h,ISP/IAP命令才會生效。_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)入口:addr=扇區(qū)單元地址,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)入口:addr=扇區(qū)單元地址出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出數(shù)據(jù)Q0(); //關(guān)閉ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):關(guān)閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//關(guān)閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//關(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器EA=1;}/*STC89C52RC部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--) { for(a=1;a>0;a--); } } }/********************************************************************************函數(shù)名:voidLCDWrite_String(uchar*,uchary,uchar*s)*函數(shù)功能:向LCD寫入一個字符串*輸入:*,y,*s*輸出:無*******************************************************************************/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s) //*0~15,y0,1,2,3{ LCD_set_*y(*,y,z); while(*s) { LcdWriteData(*s); s++; }}/********************************************************************************函數(shù)名:voidLCD_set_*y(uchar*,uchary,ucharz)*函數(shù)功能:指定向LCD寫入字符串的位置*輸入:*,y,z //*:橫坐標(biāo)y:縱坐標(biāo)z:字符串長度*輸出:無*******************************************************************************/voidLCD_set_*y(uchar*,uchary,ucharz){ uchari; if(y==0) { LcdWrite(0*80+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*80+*); } if(y==1) { LcdWrite(0*c0+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*c0+*); } if(y==2) { LcdWrite(0*94+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*94+*); } if(y==3) { LcdWrite(0*d4+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*d4+*); }}/********************************************************************************函數(shù)名:LcdWrite*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入:*輸出:無*******************************************************************************/*ifndef LCD1602_4PINS //當(dāng)沒有定義這個LCD1602_4PINS時voidLcdWrite(uchar) //寫入命令{LCD1602_E=0;//使能LCD1602_RS=0; //選擇發(fā)送命令LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=;//放入命令Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定LCD1602_E=1; //寫入時序Lcd1602_Delay1ms(5); //保持時間LCD1602_E=0;}*elsevoidLcdWrite(uchar) //寫入命令{LCD1602_E=0; //使能清零LCD1602_RS=0; //選擇寫入命令LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改Lcd1602_Delay1ms(

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論