16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序_第1頁
16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序_第2頁
16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序_第3頁
16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序_第4頁
16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余22頁可下載查看

下載本文檔

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

文檔簡介

STC單片機(jī)中的eeprom寫入和讀取6位的10進(jìn)制數(shù)需要進(jìn)行數(shù)據(jù)種類變換嗎?詳盡是怎樣現(xiàn)的呢?2013-06-0410:24滿意回答提問者采納2013-06-0410:276位10進(jìn)制數(shù),變換為16進(jìn)制,再寫入EEPROM.longx;分4個字節(jié)寫入ucharc1;c1=x>>24;//最高字節(jié)c1=x>>16;//次高字節(jié)c1=x>>8;//次低字節(jié)c1=x&0xff;//最低字節(jié)分別寫入就能夠了。追問我用的是stc12C5A60S2單片機(jī),我將轉(zhuǎn)變軒16進(jìn)制的數(shù)保存在一個數(shù)組,此后整個數(shù)組寫進(jìn)去,當(dāng)需要的時候再讀出來復(fù)原成十進(jìn)制數(shù)能否呢?回答當(dāng)然能夠。追問想了一下,不知應(yīng)當(dāng)怎樣用單片機(jī)C語言去實(shí)現(xiàn)啊,能夠指導(dǎo)下不?提問者討論感謝哈討論|ningling_21知道達(dá)人|來自團(tuán)隊(duì)單片機(jī)學(xué)習(xí)|十級采納率26%擅長:其他編程語言匯編語言C/C++16進(jìn)制變換算成10進(jìn)制程序根源:本站整理作者:佚名2009年01月14日23:330分享[導(dǎo)讀]16進(jìn)制變換算成10進(jìn)制程序unsignedchard[10];//用于顯示的10位顯示緩存//======================要點(diǎn)詞:進(jìn)制16進(jìn)制變換算成10進(jìn)制程序unsignedchard[10];//用于顯示的10位顯示緩存//========================================================//16進(jìn)制to10進(jìn)制輸出子程序:顯示數(shù)據(jù),初步位,結(jié)束位,有無小數(shù)點(diǎn)//========================================================voidoutput(unsignedlongdd,unsignedchars,unsignedchare,unsignedchardip){unsignedlongdiv;unsignedchartm[8],i,j;div=10000000;for(i=0;i<8;i++){tm[i]=dd/div;dd%=div;div/=10;}for(i=0;i<6;i++){if(tm[i]!=0)break;tm[i]=nul;}tm[5]|=dip;//小數(shù)點(diǎn)控制,請看“串行LED數(shù)碼管顯示驅(qū)動程序”j=7;for(i=s;i<e;i++){d[i]=tm[j];j--;}}把顯示位5-9位的10進(jìn)制數(shù)變換成為16進(jìn)制數(shù)unsignedintinput(void){unsignedintdd,dat;dd=10000;dat=0;for(i=5;i<10;i++){dat+=dd*temp;dd/=10;}return(dat);}/*89C51系列CPU編程器接收CPU程序*/include<reg51.h>include<intrins.h>include<absacc.h>#definee8#definep9#definel10sbitled=P3^2;sbitp27=P2^7;sbitp26=P2^6;sbitp36=P3^6;sbitp37=P3^7;sbitrst=P3^3;sbitale=P3^5;sbitvpp=P3^4;bitb_break;unsignedintadds;13.8mSvoidint_t0(void)interrupt1{TH0=-100;b_break=1;}voidwait(unsignedcharw){unsignedintt=w*184;b_break=0;TL0=-t%256-1;TH0=-t/256;while(b_break==0){}}voidnop(void){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}unsignedcharcommand(void){TH0=-100;b_break=0;while(RI==0){if(b_break==1)return(0);}RI=0;return(SBUF);}voidearsure(unsignedcharcpu){switch(cpu){case1://89C51case2:rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop();ale=0;wait(110);ale=1;nop();break;case3:case4:break;case5:case6:break;}}voidprogram(unsignedcharcpu){unsignedintbdataadds=0;unsignedchard;switch(cpu){case1://89C51case2:p36=p37=1;rst=1;while(1){TH0=-100;b_break=0;while(RI==0){if(b_break==1)return;}RI=0;d=SBUF;//addressP0=adds%256;P2=adds/256;p27=1;//dataP1=d;nop();//48clcl//vppvpp=1;nop();//48clcl//aleale=0;wait(1);//100uSale=1;nop();//10uSvpp=0;nop();//48clclp27=0;nop();//48clclP1=0xff;TH0=-100;b_break=0;while(d!=P1){if(b_break==1)return;}

//datapollingSBUF=d;adds++;}break;case3:case4:case5:case6:break;}}voidlock(unsignedcharcpu){unsignedchari;switch(cpu){case1://89c51case2://lock1rst=p26=p36=p27=p37=1;nop();vpp=1;nop();ale=0;for(i=0;i<6;i++)wait(100);wait(1);ale=1;nop();vpp=0;nop();//lock2rst=p26=p27=1;p36=p37=0;nop();vpp=1;nop();ale=0;for(i=0;i<6;i++)wait(100);wait(1);ale=1;nop();vpp=0;nop();//lock3rst=p26=p36=1;p27=p37=0;nop();vpp=1;nop();ale=0;for(i=0;i<6;i++)wait(100);wait(1);ale=1;nop();vpp=0;nop();break;case3:case4:case5:case6:break;}}voidmain(void){unsignedchardisp,flash,temp,cpu;EA=1;SCON=0xd8;PCON=0x80;TMOD=0x21;TL1=TH1=0xff;TR1=1;TH0=-100;ET0=TR0=1;flash=0x80;while(1){temp=command();switch(temp){case0:case1://89c51case2://89C52case3://80f51case4://80F52case5://87F51case6:cpu=temp;SBUF=temp;break;//87f52casee:SBUF=temp;earsure(cpu);break;

//erasurecasep:SBUF=temp;program(cpu);break;

//programcasel:lock(cpu);SBUF=temp;break;

//lockdefault:SBUF=temp;break;}b_break=0;if((++disp)>flash){disp=0;led=!led;}}}//HT1380實(shí)時時鐘驅(qū)動程序sbitclock_dat=P0^1;sbitclock_clk=P0^2;sbitclock_rst=P0^3;sbita0=ACC^0;sbita1=ACC^1;sbita2=ACC^2;sbita3=ACC^3;sbita4=ACC^4;sbita5=ACC^5;sbita6=ACC^6;sbita7=ACC^7;voidclock_out(unsignedchardd){ACC=dd;clock_dat=a0;clock_clk=1;clock_clk=0;clock_dat=a1;clock_clk=1;clock_clk=0;clock_dat=a2;clock_clk=1;clock_clk=0;clock_dat=a3;clock_clk=1;clock_clk=0;clock_dat=a4;clock_clk=1;clock_clk=0;clock_dat=a5;clock_clk=1;clock_clk=0;clock_dat=a6;clock_clk=1;clock_clk=0;clock_dat=a7;clock_clk=1;clock_clk=0;}unsignedcharclock_in(void){clock_dat=1;a0=clock_dat;clock_clk=1;clock_clk=0;a1=clock_dat;clock_clk=1;clock_clk=0;a2=clock_dat;clock_clk=1;clock_clk=0;a3=clock_dat;clock_clk=1;clock_clk=0;a4=clock_dat;clock_clk=1;clock_clk=0;a5=clock_dat;clock_clk=1;clock_clk=0;a6=clock_dat;clock_clk=1;clock_clk=0;a7=clock_dat;return(ACC);}unsignedcharread_clock(unsignedcharord){unsignedchardd=0;clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);dd=clock_in();clock_rst=0;clock_clk=1;return(dd);}voidwrite_clock(unsignedcharord,unsignedchardd){clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);clock_out(dd);clock_rst=0;clock_clk=1;}/*

單個漢字庫字摸提取程序,

tc2.0

編譯*/#include"stdio.h"#include"dos.h"#include"process.h"#include"string.h"voidmain(void){longintnum_bytes,qm,wm;unsignedchard,i,j,k,a[132],b[132];unsignedchar*data;unsignedchar*hz;staticunsignedchardd[103];FILE*fp;if((fp=fopen("hzk16f","rb"))==NULL){printf("can'topenhzk16\n");exit(1);}clrscr();while(1){data=(unsignedchar*)malloc(33);printf("pleaseinput:\n");scanf("%s",dd);/*輸入一個漢字

*/qm=*dd;/*經(jīng)過區(qū)位碼計(jì)算其在qm=qm-161;if(qm>87)exit(0);wm=*(dd+1);wm=wm-161;if(wm>94)exit(0);num_bytes=((long)qm*94+wm)*32;fseek(fp,num_bytes,SEEK_SET);fgets(data,33,fp);for(i=0;i<32;i++)b[i]=*data++;for(i=0;i<32;i+=2)a[i/2]=b[i];for(i=0;i<32;i+=2)a[i/2+16]=b[i+1];for(i=8;i<16;i++)b[i]=a[i];for(i=8;i<16;i++)a[i]=a[i+8];for(i=8;i<16;i++)a[i+8]=b[i];

hzk16f

文件中的偏移地點(diǎn)

*//*

變換,hzf16f

在電腦的積蓄格式是以行為字節(jié)計(jì)算的,一般的

lcd

都采納以列為字節(jié)計(jì)算*/for(k=0;k<32;k+=8){for(j=0;j<8;j++){d=0;for(i=0;i<8;i++){if(a[i+k]>=0x80){switch(i){case0:d+=1;break;case1:d+=2;break;case2:d+=4;break;case3:d+=8;break;case4:d+=0x10;break;case5:d+=0x20;break;case6:d+=0x40;break;case7:d+=0x80;break;}}}for(i=0;i<8;i++)a[i+k]<<=1;b[j+k]=d;}}clrscr();printf("/*%s:*/\n",dd);/*輸出0x00格式的16進(jìn)制數(shù)*/for(k=0;k<32;k+=8){for(j=0;j<8;j++)printf("0x%x,",b[j+k]);printf("\n");}getch();}}按鍵掃描驅(qū)動程序unsignedcharkey,key_h,kpush;unsignedintkey_l;//按鍵連結(jié)到p1.0、p1.1、p1.2voidint_t0(void)interrupt1{unsignedchardd,i;TL0=TL0+30;TH0=0xfb;//800/*按鍵鑒別*/if((P1&0x7)==0x7){if((key_l>30)&&(key_l<800)&&(key_h>30)){//釋放按鍵,假如以前按鍵時間少于1秒,讀入鍵值key=kpush;}if((++key_h)>200)key_h=200;key_l=0;if(key>=0x80)key=0;//假如以前的按鍵為長按1秒,除掉鍵值}else{kpush=P1&0x7;key_l++;if((key_l>800)&&(key_h>30)){假如按鍵超出1秒,鍵值加0x80標(biāo)志長按鍵key=kpush|0x80;key_h=0;key_l=0;}}}voidmain(void){TMOD=0x1;TR0=1;ET0=1;EA=1;while(1){while(!key){}switch(key){case1:break;case2:break;}}串行驅(qū)動led顯示,//一個74hc595位移存放器驅(qū)動三極管驅(qū)動//兩個74hc595驅(qū)動led段,方式位5位//5分頻,每次掃描時間位1.25ms

ledx8段

位,x2=10

個數(shù)碼管定義特別符號#definenul0xf#defineqc0xc#defineqb0xb#defineq_0xa#defineq__0xd#defineq___0xe#defineqp0x10#defineqe0x11#defineqj0x12#defineqn0x13#defineqf0x14#defineqa0x15#defineqr0x16#defineqd0x17#definequ0x18#defineql0x19#defineqh0x1a#defineqwen0x1b#defineqt0x1c#defineqla0x1d#defineqlb0x1e#defineqlc0x1f#defineqld0x20#defineqle0x21#defineqlf0x22#defineqlg0x23#defineqldp0x24//顯示段信息,不相同led排列組合的段信息只要改正8個數(shù)值即可。因此,該定義擁有通用性。顯示-d20//|c40|e10//-g80//|b2|f4_a1.dp8#definepa1#definepb2#definepc0x40#definepd0x20#definepe0x10#definepf4#definepg0x80#definepdp8//--------------#definel0pdp+pg#definel1255-pf-pe#definel2pdp+pc+pf#definel3pdp+pc+pb#definel4pdp+pa+pb+pd#definel5pdp+pb+pe#definel6pdp+pe#definel7pdp+pc+pg+pb+pa#definel8pdp#definel9pdp+pb#definelapdp+pa#definelbpdp+pd+pe#definelcpdp+pg+pe+pf#defineldpdp+pc+pd#definelepdp+pe+pf#definelfpdp+pe+pf+pa#definel_255-pg#definelnul255#definellpdp+pg+pd+pf+pe#definelppdp+pa+pf#defineltpdp+pd+pe+pf#definelrpdp+pe+pf+pg+pa#definelnpdp+pg+pa#definelhpdp+pd+pe+pa#definelypdp+pb+pd#definelupdp+pg+pd#definel__pdp+pg+pb+pc+pe+pf#definel___l__-pg#definel_1255-pa#definel_2255-pa-pg#definelj255-(pe+pf+pa)#definelwen255-(pd+pe+pg+pb)#definelall0#definella255-pa#definellb255-pb#definellc255-pc#definelld255-pd#definelle255-pe#definellf255-pf#definellg255-pg#definelldp255-pdp//串行送出的位信息,當(dāng)前是10位led顯示。unsignedcharcodeun_dig[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};串行送出的短信息。unsignedcharcodeun_disp[]={l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l_,lb,lc,l__,l___,lnul,lp,le,lj,ln,lf,la,lr,ld,lu,ll,lh,lwen,lt,lla,llb,llc,lld,lle,llf,llg,lldp,lnul};sbitd_clk=P0^0;//移位時鐘sbitd_dat=P0^1;sbitd_st=P0^2;

//移位數(shù)據(jù)//移位鎖定unsignedchardig;

//位掃描計(jì)數(shù)器unsignedchard[10];

//顯示緩沖送出8位串行數(shù)據(jù)voidout_disp(unsignedchardd){unsignedchari;for(i=0;i<8;i++){if(dd&1)d_dat=1;elsed_dat=0;d_clk=0;dd>>=1;d_clk=1;}}控制小數(shù)點(diǎn)和閃爍,顯示數(shù)據(jù)|0x040表示有小數(shù)點(diǎn);顯示數(shù)據(jù)|0x80表示閃爍。voidout_displ(unsignedchardd){if(dd>=0x80){if(s001>flash_time){out_disp(0xff);return;}}dd&=0x7f;if(dd>=0x40){dd=un_disp[dd&0x3f]^pdp;}elsedd=un_disp[dd];out_disp(dd);}unsignedints001;//閃爍時間參照voidint_t0(void)interrupt1{unsignedchardd;TL0=TL0+30;TH0=0xfb;//800time++;if((++s001)>=800)s001=0;//顯示if((++dig)>4)dig=0;d_st=0;dd=d[dig+5];out_displ(dd);dd=d[dig];out_displ(dd);out_disp(un_dig[dig]);d_st=1;}voidmain(void){unsignedchari;TMOD=0x1;TR0=ET0=1;EA=1;for(i=0;i<10;i++)d[i]=i;//displaytestwhile(1){}}STC單片機(jī)中的eeprom寫入和讀取6位的10進(jìn)制數(shù)需要進(jìn)行數(shù)據(jù)種類變換嗎?詳盡是怎樣現(xiàn)的呢?2013-06-0410:24dwsxfg|分類:內(nèi)存|閱讀34次分享到:舉報(bào)|2013-06-0410:27提問者采納6位10進(jìn)制數(shù),變換為16進(jìn)制,再寫入EEPROM.longx;分4個字節(jié)寫入ucharc1;c1=x>>24;//最高字節(jié)c1=x>>16;//次高字節(jié)c1=x>>8;//次低字節(jié)c1=x&0xff;//最低字節(jié)分別寫入就能夠了。追問我用的是stc12C5A60S2單片機(jī),我將轉(zhuǎn)變軒16進(jìn)制的數(shù)保存在一個數(shù)組,此后整個數(shù)組寫進(jìn)去,當(dāng)需要的時候再讀出來復(fù)原成十進(jìn)制數(shù)能否呢?回答自然能夠。追問想了一下,不知應(yīng)當(dāng)怎樣用單片機(jī)C語言去實(shí)現(xiàn)啊,能夠指導(dǎo)下不?提問者討論感謝哈一個牛人的對于STC的EEPROM的介紹(很不錯)說明:有關(guān)內(nèi)容來自網(wǎng)上,整理而成。轉(zhuǎn)貼在此主要供參照學(xué)習(xí)用單片機(jī)運(yùn)行時的數(shù)據(jù)都存在于RAM(隨機(jī)積蓄器)中,在掉電后RAM中的數(shù)據(jù)是無法保存的,那么怎樣使數(shù)據(jù)在掉電后不扔掉呢?這就需要使用EEPROM或FLASHROM等積蓄器來實(shí)現(xiàn)。在傳統(tǒng)的單片機(jī)系統(tǒng)中,一般是在片外擴(kuò)展積蓄器,單片機(jī)與積蓄器之間經(jīng)過IIC或SPI等接口來進(jìn)行數(shù)據(jù)通信。這樣不只會增加開發(fā)成本,同時在程序開發(fā)上也要花更多的心思。在STC單片機(jī)中內(nèi)置了EEPROM(其實(shí)是采納IAP技術(shù)讀寫內(nèi)部FLASH來實(shí)現(xiàn)EEPROM),這樣就節(jié)儉了片外資源,使用起來也更為方便。下面就詳盡介紹STC單片機(jī)內(nèi)置EEPROM及其使用方法。STC各型號單片機(jī)內(nèi)置的EEPROM的容量各有不相同,見下表:(內(nèi)部EEPROM能夠擦寫100000次以上)上面提到了IAP,它的意思是“在應(yīng)用編程”,即在程序運(yùn)行時程序積蓄器可由程序自己進(jìn)行擦寫。正是是因?yàn)橛辛薎AP,進(jìn)而能夠使單片機(jī)能夠?qū)?shù)據(jù)寫入到程序積蓄器中,使得數(shù)據(jù)憂如燒入的程序相同,掉電不扔掉。自然寫入數(shù)據(jù)的地區(qū)與程序積蓄區(qū)要分開來,以使程序不會碰到損壞。要使用IAP功能,與以下幾個特別功能存放器有關(guān):ISP_DATA:ISP/IAP操作時的數(shù)據(jù)存放器。ISP/IAP從Flash讀出的數(shù)據(jù)放在此處,向Flash寫的數(shù)據(jù)也需放在此處ISP_ADDRH:ISP/IAP操作時的地點(diǎn)存放器高八位。ISP_ADDRL:ISP/IAP操作時的地點(diǎn)存放器低八位。ISP_CMD:ISP/IAP操作時的命令模式存放器,須命令觸發(fā)存放器觸發(fā)方可奏效。ISP_TRIG:ISP/IAP操作時的命令觸發(fā)存放器。當(dāng)ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入0x46,再寫入0xb9,ISP/IAP命令才會奏效。單片機(jī)芯片型號初步地點(diǎn)內(nèi)置EEPROM容量(每扇區(qū)512字節(jié))STC89C51RC,STC89LE51RC0x2000共八個扇區(qū)STC89C52RC,STC89LE52RC0x2000共八個扇區(qū)STC89C54RD+,STC89LE54RD+0x8000共五十八個扇區(qū)STC89C55RD+,STC89LE55RD+0x8000共五十八個扇區(qū)STC89C58RD+,STC89LE58RD+0x8000共五十八個扇區(qū)存放器表記地點(diǎn)名稱76543210初始值ISP_DATA0xE2ISP/IAP閃存數(shù)據(jù)存放器11111111ISP_ADDRH0xE3ISP/IAP閃存地點(diǎn)高位00000000ISP_ADDRL0xE4ISP/IAP閃存地點(diǎn)低位00000000ISP_CMD0xE5ISP/IAP閃存命令存放器MS2MS1MS0xxxxx000ISP_TRIG0xE6ISP/IAP閃存命令觸發(fā)xxxxxxxxISP_CONTR0xE7ISP/IAP控制存放器ISPENSWBSSWRSTWT2WT1WT000xx000B7B6B5B4B3B2B1B0命令/操作模式選擇保存命令選擇-----000待機(jī)模式,無ISP/IAP操作-----001對用戶的應(yīng)用程序Flash區(qū)及數(shù)據(jù)Flash區(qū)字節(jié)讀-----010對用戶的應(yīng)用程序Flash區(qū)及數(shù)據(jù)Flash區(qū)字節(jié)編程-----011對用戶的應(yīng)用程序Flash區(qū)及數(shù)據(jù)Flash區(qū)扇區(qū)擦除ISP_CONTR:ISP/IAP控制存放器。ISPEN:ISP/IAP功能贊同位。0:禁止ISP/IAP編程改變Flash,1:贊同編程改變FlashSWBS:軟件選擇從用戶主程序區(qū)啟動(0),仍是從ISP程序區(qū)啟動(1)。SWRST:0:不操作,1:產(chǎn)生軟件系統(tǒng)復(fù)位,硬件自動清零。ISP_CONTR中的SWBS與SWRST這兩個功能位,能夠?qū)崿F(xiàn)單片機(jī)的軟件啟動,并啟動到ISP區(qū)或用戶程序區(qū),這在“STC單片機(jī)自動下載”一節(jié),亦有所應(yīng)用。如:ISP_CONTR=0x60?則能夠?qū)崿F(xiàn)從用戶應(yīng)用程序區(qū)軟件復(fù)位到ISP程序區(qū)開始運(yùn)行程序。ISP_CONTR=0x20?則能夠?qū)崿F(xiàn)從ISP程序區(qū)軟件復(fù)位到用戶應(yīng)用程序區(qū)開始運(yùn)行程序。用IAP向Flash中讀寫數(shù)據(jù),是需要必定的讀寫時間的,讀寫數(shù)據(jù)命令發(fā)出后,要等待一段時間才能夠讀寫成功。這個等待時間就是由WT2、WT1、WT0與晶體振蕩器頻次決定的。(以上的建議時鐘是(WT2、WT1、WT0)取不相同的值時的標(biāo)稱時鐘,用戶系統(tǒng)中的時鐘不要過高,否則可能使操作不牢固。)stc單片機(jī)EEPROM讀寫(一)EEPROM操作函數(shù):#defineRdCommand0x01#definePrgCommand0x02#defineEraseCommand0x03#defineError1#defineOk0#defineWaitTime0x01#definePerSector512unsignedcharxdataTtotal[512]?/*ISP_TRIG=0x46?/*觸發(fā)ISP_IAP命令字節(jié)1*/ISP_TRIG=0xb9?/*觸發(fā)ISP_IAP命令字節(jié)2*/_nop_()?}/*字節(jié)讀*/unsignedcharbyte_read(unsignedintbyte_addr){ISP_ADDRH=(unsignedchar)(byte_addr>>8)?/*地點(diǎn)賦值*/ISP_ADDRL=(unsignedchar)(byte_addr&0x00ff)?ISP_CMD&=0xf8?/*除掉低3位*/ISP_CMD|=RdCommand?/*寫入讀命令*/ISPgoon()?/*觸發(fā)履行*/ISP_IAP_disable()?/*returnISP_DATA?/*

封閉ISP,IAP功能*/返回讀到的數(shù)據(jù)*/}/*扇區(qū)擦除*/voidsectorerase(unsignedintsector_addr){unsignedintiSectorAddr?iSectorAddr=(sector_addr&0xfe00)?/*取扇區(qū)地點(diǎn)*/ISP_ADDRH=(unsignedchar)(iSectorAddr>>8)?ISP_ADDRL=0x00?ISP_CMD&=0xf8?/*清空低3位*/ISP_CMD|=EraseCommand?/*擦除命令3*/ISPgoon()?/*觸發(fā)履行*/ISP_IAP_disable()?/*封閉ISP,IAP功能*/}/*字節(jié)寫*/voidbyte_write(unsigned

intbyte_addr,

unsigned

charoriginal_data){ISP_ADDRH=(unsignedISP_ADDRL=(unsigned

char)(byte_addr>>8)?/*取地點(diǎn)*/char)(byte_addr&0x00ff)?ISP_CMD&=0xf8?/*清低3ISP_CMD|=PrgCommand?/*ISP_DATA=original_data?/*

位*/寫命令2*/寫入數(shù)據(jù)準(zhǔn)備*/ISPgoon()?/*

觸發(fā)履行

*/ISP_IAP_disable()?/*封閉IAP功能*/}/*字節(jié)寫并校驗(yàn)*/unsignedcharbyte_write_verify(unsignedintbyte_addr,unsignedcharoriginal_data){ISP_ADDRH=(unsigned

char)(byte_addr>>8)?

/*

取地點(diǎn)*/ISP_ADDRL=(unsigned

char)(byte_addr&0xff)?ISP_CMD&=0xf8?/*清低3位*/ISP_CMD|=PrgCommand?/*寫命令2*/ISP_DATA=original_data?ISPgoon()?/*觸發(fā)履行*//*開始讀,沒有在此重復(fù)給地點(diǎn),地點(diǎn)不會被自動改變*/ISP_DATA=0x00?/*清數(shù)據(jù)傳達(dá)存放器*/ISP_CMD&=0xf8?/*清低3位*/ISP_CMD|=RdCommand?/*讀命令1*/ISP_TRIG=0x46?/*觸發(fā)ISP_IAP命令字節(jié)1*/ISP_TRIG=0xb9?/*觸發(fā)ISP_IAP命令字節(jié)2*/_nop_()?/*延時*/ISP_IAP_disable()?/*封閉IAP功能*/if(ISP_DATA==original_data)/*讀寫數(shù)據(jù)校驗(yàn)*/returnOk?/*返回校驗(yàn)結(jié)果*/elsereturnError?}/*數(shù)組寫入*/unsignedchararraywrite(unsignedintbegin_addr,unsignedintlen,unsignedchar*array){unsignedinti?unsignedintin_addr?/*判是否是有效范圍,此函數(shù)不相贊同跨扇區(qū)操作*/if(len>PerSector)returnError?in_addr=begin_addr&0x01ff?/*扇區(qū)內(nèi)偏移量*/if((in_addr+len)>PerSector)returnError?in_addr=begin_addr?/*逐個寫入并校訂*/ISP_IAP_enable()?/*翻開IAP功能*/for(i=0?i<len?i++){/*寫一個字節(jié)*/ISP_ADDRH=(unsignedchar)(in_addr>>8)?ISP_ADDRL=(unsignedchar)(in_addr&0x00ff)?ISP_DATA=array[i]?/*取數(shù)據(jù)*/ISP_CMD&=0xf8?/*清低3位*/ISP_CMD|=PrgCommand?/*寫命令2*/ISP_TRIG=0x46?/*觸發(fā)ISP_IAP命令字節(jié)1*/ISP_TRIG=0xb9?/*觸發(fā)ISP_IAP命令字節(jié)2*/_nop_()?/*讀回來*/ISP_DATA=0x00?ISP_CMD&=0xf8?/*清低3位*/ISP_CMD|=RdCommand?/*讀命令1*/ISP_TRIG=0x46?/*觸發(fā)ISP_IAP命令字節(jié)1*/ISP_TRIG=0xb9?/*觸發(fā)ISP_IAP命令字節(jié)2*/_nop_()?/*比較對錯*/if(ISP_DATA!=array[i]){ISP_IAP_disable()?returnError?}in_addr++?/*指向下一個字節(jié)*/}ISP_IAP_disable()?returnOk?}/*扇區(qū)讀出*//*程序?qū)Φ攸c(diǎn)沒有作有效性判斷,請調(diào)用前早先保證他在規(guī)定范圍內(nèi)*/voidarrayread(unsignedintbegin_addr,unsignedcharlen){unsignedintiSectorAddr?unsignedinti?iSectorAddr=begin_addr?//&0xfe00?/*取扇區(qū)地點(diǎn)*/ISP_IAP_enable()?for(i=0?i<len?i++){ISP_ADDRH=(unsignedchar)(iSectorAddr>>8)?ISP_ADDRL=(unsignedchar)(iSectorAddr&0x00ff)?ISP_CMD&=0xf8?/*清低3位*/ISP_CMD|=RdCommand?/*讀命令1*/ISP_DATA=0?ISP_TRIG=0x46?/*觸發(fā)ISP_IAP命令字節(jié)1*/ISP_TRIG=0xb9?/*觸發(fā)ISP_IAP命令字節(jié)2*/_nop_()?Ttotal[i]=ISP_DATA?iSectorAddr++?}ISP_IAP_disable()?/*封閉IAP功能*/}主函數(shù)對EEPROM操作函數(shù)進(jìn)行調(diào)用:#include<stc51rd.h>#include<intrins.h>#include<stc_eeprom.h>#include<ados.h>inti?voiddelay(unsignedinttime){while(time)?}voidmain(){_ADOS(22.1184)?//ADOS自動下載//for(i=0?i<100?i++)//{//Ttotal[i]=i?//}//arraywrite(0x8000,100,Ttotal)?/*第一次運(yùn)行時向EEPROM中寫入數(shù)據(jù)此后再將寫入函數(shù)說明掉,將先前寫入的數(shù)據(jù)讀出,輸出在P2口上。*/arrayread(0x8000,100)?for(i=0?i<100?i++){P2=~Ttotal[i]?delay(10000)?}while(1)?}stc單片機(jī)EEPROM讀寫(二)sfrisp_data=0xe2;sfrisp_addrh=0xe3;sfrisp_addrl=0xe4;sfrisp_cmd=0xe5;sfrisp_trig=0xe6;sfrisp_contr=0xe7;unsignedchareeprom_read(unsignedintaddres);voideeprom_write(unsignedintaddress,unsignedcharwdata);voideeprom_eares(unsignedintaddres);//扇區(qū)擦除。voideeprom_eares(unsignedintaddres)//扇區(qū)擦除。{unsignedi;isp_addrl=addres;//低位地點(diǎn)isp_addrh=addres>>8;//高位地點(diǎn)isp_contr=0x01;isp_contr=isp_contr|0x80;//設(shè)時間與充ISP操作。isp_cmd=0x03;//扇區(qū)命命令isp_trig=0x46;//觸發(fā)isp_trig=0xb9;//觸發(fā)啟動。for(i=0;i<3;i++);isp_addrl=0xff;isp_addrh=0xff;isp_contr=0x00;isp_cmd=0x00;isp_trig=0x00;}voideeprom_write(unsignedintaddres,unsignedcharwrite_data)//寫數(shù)據(jù)。{unsignedchari;isp_data=write_data;//要寫入的數(shù)據(jù)。isp_addrl=addres;//低位地點(diǎn)isp_addrh=addres>>8;//高位地點(diǎn)isp_contr=0x01;isp_contr=isp_contr|0x80;//設(shè)時間與充ISP操作。isp_cmd=0x02;//寫命令isp_trig=0x46;//觸發(fā)isp_trig=0xb9;//觸發(fā)啟動。for(i=0;i<3;i++);isp_addrl=0xff;isp_addrh=0xff;isp_contr=0x00;isp_cmd=0x00;isp_trig=0x00;}unsignedchareeprom_read(unsignedintaddres){unsignedchari,z;isp_addrl=addres;//低位地點(diǎn)isp_addrh=addres>>8;//高位地點(diǎn)isp_contr=0x01;isp_contr=isp_contr|0x80;//設(shè)時間與充ISP操作。isp_cmd=0x01;//寫命令isp_trig=0x46;//觸發(fā)isp_trig=0xb9;//觸發(fā)啟動。for(i=0;i<3;i++);isp_addrl=0xff;isp_addrh=0xff;isp_contr=0x00;isp_cmd=0x00;isp_trig=0x00;z="isp"_data;return(z);}stc單片機(jī)EEPROM讀寫(三)內(nèi)部EEPROM讀寫定義ISP_DATAEQU0E2H;寫入讀出數(shù)據(jù)存放器.ISP_ADDRHEQU0E3H;地點(diǎn)存放器高8位ISP_ADDRLEQU0E4H;地點(diǎn)存放器低8位ISP_CMDEQU0E5H;命令模式存放器ISP_TRIGEQU0E6H;命令觸發(fā)存放器ISP_CONTREQU0E7H;ISP/IAP控制存放器.IS

溫馨提示

  • 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

提交評論