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頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、STC單片機(jī)中的eeprom寫入和讀取6位的10進(jìn)制數(shù)需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換嗎? 具體是怎樣現(xiàn)的呢?2021-06-04 10:24滿意答復(fù)提問者采納2021-06-04 10:276位10進(jìn)制數(shù),轉(zhuǎn)換為16進(jìn)制,再寫入 EEPROM.long x;分4個(gè)字節(jié)寫入uchar c1;c1= x>>24; / 最高字節(jié)c1=x>>16; / 次高字節(jié)c1=x>>8; / 次低字節(jié)c1=x&0xff; /最低字節(jié)分別寫入就可以了. 追問 我用的是stc12C5A60S2單片機(jī),我將轉(zhuǎn)化軒16進(jìn)制的數(shù)保存在 一個(gè)數(shù)組,然后整個(gè)數(shù)組寫進(jìn)去,當(dāng)需要的時(shí)候再讀出來復(fù)

2、原成十進(jìn)制數(shù)可否呢?答復(fù) : 然可以.追問想了一下,不知應(yīng)該如何用單片機(jī) C語言去實(shí)現(xiàn)啊,可以指導(dǎo)下不?提問者 評(píng)價(jià)謝謝哈評(píng)論| ningling_21知道達(dá)人|來自團(tuán)隊(duì)單片機(jī)學(xué)習(xí)|十級(jí)采納率26%®長(zhǎng):其他編程語言匯編語言C/C+16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序來源:本站整理 佚名2021年01月14日23:330分享導(dǎo)讀16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序unsigned char d10;/用于顯示的10位顯示緩存/=關(guān)鍵詞:進(jìn)制16進(jìn)制轉(zhuǎn)換算成10進(jìn)制程序unsigned char d10;用于顯示的10位顯示緩存/=/16進(jìn)制to10進(jìn)制輸出子程序:顯示數(shù)據(jù),起始位,結(jié)束位,有無小數(shù)點(diǎn)

3、/= void output(unsigned long dd,unsigned char s,unsigned char e,unsigned char dip) unsigned long div;unsigned char tm8,i,j;div=10000000;for (i=0;i<8;i+) tmi=dd/div; dd%=div; div/=10;for (i=0;i<6;i+) if (tmi!=0) break; tmi=nul;tm5|=dip;/小數(shù)點(diǎn)限制,請(qǐng)看 串行LED數(shù)碼管顯示驅(qū)動(dòng)程序j=7; for (i=s;i<e;i+) di=tmj; j-

4、;/把顯示位5-9位的10進(jìn)制數(shù)轉(zhuǎn)換成為16進(jìn)制數(shù)unsigned int input(void) (unsigned int dd,dat;dd=10000;dat=0;for (i=5;i<10;i+) dat+=dd*temp;dd/=10;return(dat);/*89C51系列CPU編程器接收 CPU程序*/# i nclude <reg51.h># i nclude <intrins.h># i nclude <absacc.h>#define e 8#define p 9#define l 10sbit led=P3A2;sbit p2

5、7=P2A7;sbit p26=P2A6;sbit p36=P3A6;sbit p37=P3A7;sbit rst=P3A3;sbit ale=P3A5;sbit vpp=P3A4;bit b_break;unsigned int adds;/13.8mSvoid int_t0(void) interrupt 1 TH0=-100;b_break=1;void wait(unsigned char w) unsigned int t=w*184;b_break=0;TL0=-t%256-1;TH0=-t/256;while (b_break=0) ( void nop(void) (_nop_

6、();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();unsigned char command(void) (TH0=-100;b_break=0;while (RI=0) if (b_break=1) return(0);RI=0;return(SBUF);void earsure(unsigned char cpu) switch (c

7、pu) case 1:/89C51case 2:rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop();ale=0;wait(110);ale=1;nop();break;case 3:case 4:break;case 5:case 6:break;void program(unsigned char cpu) unsigned int bdata adds=0;unsigned char d;switch (cpu) case 1:/89C51case 2:p36=p37=1;rst=1;while (1) TH0=-100;b_break=0;while (R

8、I=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;c

9、ase 3:case 4:case 5:case 6:break;void lock(unsigned char cpu) unsigned char i;switch (cpu) case 1:/89c51case 2:/lock 1rst=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();/lock 2rst=p26=p27=1;p36=p37=0;nop();vpp=1;nop();ale=0;/ for (i=0;i<6

10、;i+) wait(100);wait(1);ale=1;nop();vpp=0;nop();/lock 3rst=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;case 3:case 4:case 5:case 6:break;void main(void) unsigned char disp,flash,temp,cpu;EA=1;SCON=0xd8;PCON=0x80;TMOD=0x21;TL1=TH1=0

11、xff;TR1=1;TH0=-100;ET0=TR0=1;flash=0x80;while (1) ( temp=command(); switch (temp) ( case 0: case 1:/89c51case 2:/89C52case 3:/80f51case 4:/80F52case 5:/87F51case 6:cpu=temp;SBUF=temp;break;/87f52case e:SBUF=temp;earsure(cpu);break;/erasurecase p:SBUF=temp;program(cpu);break;/programcase l:lock(cpu);

12、SBUF=temp;break;/lockdefault:SBUF=temp;break; b_break=0; if (+disp)>flash) (disp=0;led=!led; /HT1380實(shí)時(shí)時(shí)鐘驅(qū)動(dòng)程序sbit clock_dat=P0A1; sbit clock_clk=P0A2; sbit clock_rst=P0A3;sbit a0=ACCA0;sbit a1=ACCA1; sbit a2=ACCA2; sbit a3=ACCA3; sbit a4=ACCA4; sbit a5=ACCA5; sbit a6=ACCA6; sbit a7=ACCA7;void cloc

13、k_out(unsigned char dd) (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_d

14、at=a7;clock_clk=1;clock_clk=0;unsigned char clock_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=cl

15、ock_dat;clock_clk=1;clock_clk=0;a7=clock_dat;return(ACC);unsigned char read_clock(unsigned char ord) ( unsigned char dd=0;clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);dd=clock_in();clock_rst=0;clock_clk=1;return(dd);void write_clock(unsigned char ord,unsigned char dd) ( clock_clk=0;clock_rst=0

16、;clock_rst=1;clock_out(ord);clock_out(dd);clock_rst=0;clock_clk=1;/*單個(gè)漢字庫(kù)字摸提取程序,tc2.0編譯*/# i nclude "stdio.h"# i nclude "dos.h"# i nclude "process.h"# i nclude "string.h"void main(void) (long int num_bytes,qm,wm;unsigned char d,i,j,k,a132,b132;unsigned char *

17、data;unsigned char * hz;static unsigned char dd103;FILE *fp;if (fp=fopen("hzk16f","rb")=NULL) printf("can't open hzk16n");exit(1);clrscr();while (1) data=(unsigned char *) malloc(33);printf("please input:n");scanf("%s,dd); /* 輸入一個(gè)漢字 */qm=* dd;/*通過區(qū)位碼計(jì)

18、算其在hzk16f文件中的偏移地址*/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+) bi=* data+;for (i=0;i<32;i+=2) ai/2=bi;for (i=0;i<32;i+=2) ai/2+16=bi+1;for (i=8;i<16;i+) bi=ai;for

19、 (i=8;i<16;i+) ai=ai+8;for (i=8;i<16;i+) ai+8=bi;/*轉(zhuǎn)換,hzf16f在電腦的儲(chǔ)存格式是以行為字節(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 (ai+k>=0x80) switch (i) case 0:d+=1;break;case 1:d+=2;break;case 2:d+=4;break;case 3:d+=8;break;case 4:d+=0x10;break;case 5

20、:d+=0x20;break;case 6:d+=0x40;break;case 7:d+=0x80;break;for (i=0;i<8;i+) ai+k<<=1;bj+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,",bj+k);printf("n");getch();/按鍵掃描驅(qū)動(dòng)程序unsigned char key,key_h,kpush

21、;unsigned int key_l;/ 按鍵連接到 p1.0、p1.1、p1.2void int_t0(void) interrupt 1 unsigned char dd,i;TL0=TL0+30;TH0=0xfb;/800/*按鍵判別*/if (P1&0x7)=0x7) if (key_l>30)&&(key_l<800)&&(key_h>30) /釋放按鍵,如果之前按鍵時(shí)間少于1秒,讀入鍵值key=kpush;if (+key_h)>200) key_h=200;key_l=0;if (key>=0x80) key

22、=0;/如果之前的按鍵為長(zhǎng)按1秒,去除鍵值 else (kpush=P1&0x7;key_l+;if (key_l>800)&&(key_h>30) /如果按鍵超過1秒,鍵值加0x80標(biāo)志長(zhǎng)按鍵key=kpush|0x80;key_h=0;key_l=0;void main(void) TMOD=0x1;TR0=1;ET0=1;EA=1;while (1) while (!key) switch (key) case 1:break;case 2:break;/串行驅(qū)動(dòng)led顯示,/ 一個(gè)74hc595位移存放器驅(qū)動(dòng)三極管驅(qū)動(dòng)led位,/兩個(gè)74hc595

23、驅(qū)動(dòng)led段,方式位5位x8段x2=10 個(gè)數(shù)碼管/5分頻,每次掃描時(shí)間位1.25ms/定義特殊符號(hào)#define nul 0xf#define qc 0xc#define qb 0xb#define q_ 0xa#define q_ 0xd#define q_ 0xe#define qp 0x10#define qe 0x11#define qj 0x12#define qn 0x13#define qf 0x14#define qa 0x15#define qr 0x16#define qd 0x17#define qu 0x18#define ql 0x19#define qh 0x1a

24、#define qwen 0x1b#define qt 0x1c#define qla 0x1d#define qlb 0x1e#define qlc 0x1f#define qld 0x20#define qle 0x21#define qlf 0x22#define qlg 0x23#define qldp 0x24/顯示段信息,不同led排列組合的段信息只需更改8個(gè)數(shù)值即可./因此,該定義具有通用性./顯示/ -d 20/|c 40|e 10/- g 80/ |b 2 |f 4/_a1.dp 8#define pa 1#define pb 2#define pc 0x40#define

25、pd 0x20#define pe 0x10#define pf 4#define pg 0x80#define pdp 8/#define l0 pdp+pg#define l1 255-pf-pe#define l2 pdp+pc+pf#define l3 pdp+pc+pb#define l4 pdp+pa+pb+pd#define l5 pdp+pb+pe#define l6 pdp+pe#define l7 pdp+pc+pg+pb+pa#define l8 pdp#define l9 pdp+pb#define la pdp+pa#define lb pdp+pd+pe#defin

26、e 1c pdp+pg+pe+pf#define Id pdp+pc+pd#define le pdp+pe+pf#define If pdp+pe+pf+pa#define 1_ 255-pg#define Inul 255#define 11 pdp+pg+pd+pf+pe#define Ip pdp+pa+pf#define It pdp+pd+pe+pf#define Ir pdp+pe+pf+pg+pa#define In pdp+pg+pa#define Ih pdp+pd+pe+pa#define ly pdp+pb+pd#define lu pdp+pg+pd#define l

27、_ pdp+pg+pb+pc+pe+pf#define l l_-pg#define l_1 255-pa#define l_2 255-pa-pg#define lj 255-(pe+pf+pa)#define lwen 255-(pd+pe+pg+pb)#define lall 0#define lla 255-pa#define llb 255-pb#define llc 255-pc#define lld 255-pd#define lle 255-pe#define llf 255-pf#define llg 255-pg#define lldp 255-pdp/串行送出的位信息,目

28、前是 10位led顯示.unsigned char code un_dig=0x7f,0xbf,0xdf,0xef,0xf7,0xfb;/串行送出的短信息.unsigned char codeun_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;sbit d_clk=P0A0;/移位時(shí)鐘sbit d_dat=P0A1;sbit d_st=P0A2;/移位數(shù)據(jù)/移位鎖定unsign

29、ed char dig;/位掃描計(jì)數(shù)器unsigned char d10;顯示緩沖/送出8位串行數(shù)據(jù)void out_disp(unsigned char dd) (unsigned char i;for (i=0;i<8;i+) (if (dd&1) d_dat=1; else d_dat=0;d_clk=0;dd>>=1;d_clk=1;/限制小數(shù)點(diǎn)和閃爍,顯示數(shù)據(jù) |0x040表示有小數(shù)點(diǎn);顯示數(shù)據(jù)|0x80表示閃爍.void out_displ(unsigned char dd) (if (dd>=0x80) (if (s001>flash_tim

30、e) (out_disp(0xff);return;dd&=0x7f;if (dd>=0x40) (dd=un_dispdd&0x3fApdp; else dd=un_dispdd;out_disp(dd);unsigned int s001;/閃爍時(shí)間參考void int_t0(void) interrupt 1 (unsigned char dd;TL0=TL0+30;TH0=0xfb;/800time+;if (+s001)>=800) s001=0;/ 顯示if (+dig)>4) dig=0;d_st=0;dd=ddig+5;out_displ(dd

31、);dd=ddig;out_displ(dd);out_disp(un_digdig);d_st=1;void main(void) ( unsigned char i; TMOD=0x1;TR0=ET0=1;EA=1;/display testfor (i=0;i<10;i+) di=i; while (1) (STC單片機(jī)中的eeprom 寫入和讀取6位的10進(jìn) 制數(shù)需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換嗎?具體是怎樣現(xiàn)的呢? 2021-06-04 10:24 dwsxfg | 分類:內(nèi)存 | 瀏覽 34 次用APP問裝機(jī)高手|馬上下我分享到: 檢舉|2021-06-04 10:27 提問者采納6位1

32、0進(jìn)制數(shù),轉(zhuǎn)換為16進(jìn)制,再寫入EEPROM.long x;分4個(gè)字節(jié)寫入uchar c1;c1= x>>24; /最高字節(jié)c1=x>>16; /次高字節(jié)c1=x>>8; 次低字節(jié)c1=x&0xff;最低字節(jié)分別寫入就可以了.追問我用的是stc12C5A60S2單片機(jī),我將轉(zhuǎn)化軒16進(jìn)制的數(shù)保存在一個(gè)數(shù) 組,然后整個(gè)數(shù)組寫進(jìn)去,當(dāng)需要的時(shí)候再讀出來復(fù)原成十進(jìn)制數(shù)可否 呢?答復(fù)當(dāng)然可以追問想了一下,不知應(yīng)該如何用單片機(jī) C語言去實(shí)現(xiàn)啊,可以指導(dǎo)下不?提問者評(píng)價(jià)謝謝哈一個(gè)牛人的關(guān)于STC的EEPROM的介紹很不錯(cuò)*說明:相關(guān)內(nèi)容來自網(wǎng)上,整理而成.轉(zhuǎn)貼在

33、此主要供參考學(xué)習(xí)用單片機(jī)運(yùn)行時(shí)的數(shù)據(jù)都存在于 RAM 隨機(jī)存儲(chǔ)器中,在掉電后 RAM中的數(shù) 據(jù)是無法保存的,那么怎樣使數(shù)據(jù)在掉電后不喪失呢?這就需要使用EEPROM或FLASHROM 等存儲(chǔ)器來實(shí)現(xiàn).在傳統(tǒng)的單片機(jī)系統(tǒng)中,一般是在片外擴(kuò)展存儲(chǔ)器,單片機(jī)與存 儲(chǔ)器之間通過IIC或SPI等接口來進(jìn)行數(shù)據(jù)通信.這樣不光會(huì)增加開發(fā)本錢,同時(shí)在程序 開發(fā)上也要花更多的心思.在STC單片機(jī)中內(nèi)置了 EEPROM 其實(shí)是采用IAP技術(shù)讀寫內(nèi)部FLASH來實(shí)現(xiàn)EEPROM ,這樣就節(jié)省了片外資源,使用起來也更加方便.下面就詳細(xì)介紹STC單片機(jī)內(nèi)置EEPROM及其使用方法.STC各型號(hào)單片機(jī)內(nèi)置的EEPROM的

34、容量各有不同,見下表:內(nèi)部EEPROM 可以擦寫100000次以上上面提到了 IAP,它的意思是在應(yīng)用編程,即在程序運(yùn)行時(shí)程序存儲(chǔ)器可由程 序自身進(jìn)行擦寫.正是是由于有了 IAP,從而可以使單片機(jī)可以將數(shù)據(jù)寫入到程序存儲(chǔ)器中,使得數(shù)據(jù)如同燒入的程序一樣,掉電不喪失.當(dāng)然寫入數(shù)據(jù)的區(qū)域與程序存儲(chǔ)區(qū)要分開來,以使程序不會(huì)遭到破壞.要使用IAP功能,與以下幾個(gè)特殊功能存放器相關(guān):ISP_DATA : ISP/IAP 操作時(shí)的數(shù)據(jù)存放器.ISP/IAP從Flash讀出的數(shù)據(jù)放在此處,向Flash寫的數(shù)據(jù)也需放在此處ISP_ADDRH : ISP/IAP 操作時(shí)的地址存放器高八位.ISP_ADDRL :

35、 ISP/IAP操作時(shí)的地址存放器低八位.ISP_CMD : ISP/IAP操作時(shí)的命令模式存放器,須命令觸發(fā)存放器觸發(fā)方可生 效.ISP_TRIG : ISP/IAP操作時(shí)的命令觸發(fā)存放器.當(dāng) ISPEN ISP_CONTR.7 =1 時(shí),對(duì) ISP_TRIG 先寫入 0x46 ,再寫入 0xb9 , ISP/IAP命令才會(huì)生效.單片機(jī)芯片型號(hào)起始地址內(nèi)置 EEPROM容量每扇區(qū)512字節(jié)STC89C51RC , STC89LE51RC 0x2000 共八個(gè)扇區(qū)STC89C52RC , STC89LE52RC 0x2000 共八個(gè)扇區(qū)STC89C54RD+ , STC89LE54RD+ 0x

36、8000 共五十八個(gè)扇區(qū)STC89C55RD+ , STC89LE55RD+ 0x8000 共五十八個(gè)扇區(qū)STC89C58RD+ , STC89LE58RD+ 0x8000 共五十八個(gè)扇區(qū)存放器標(biāo)識(shí)地址名稱7 6 5 4 3 2 1 0初始值ISP_DATA 0xE2 ISP/IAP 閃存數(shù)據(jù)存放器 11111111ISP_ADDRH 0xE3 ISP/IAP 閃存地址高位 00000000ISP_ADDRL 0xE4 ISP/IAP 閃存地址低位 00000000ISP_CMD 0xE5 ISP/IAP閃存命令存放器 MS2MS1 MS0 xxxxx000ISP_TRIG 0xE6 ISP/

37、IAP 閃存命令觸發(fā) xxxxxxxxISP_CONTR 0xE7 ISP/IAP 限制存放器 ISPEN SWBS SWRST WT2WT1 WT0 00xx000B7 B6 B5 B4 B3 B2 B1 B0命令/操作模式選擇保存命令選擇-0 0 0待機(jī)模式,無ISP/IAP操作-0 0 1對(duì)用戶的應(yīng)用程序 Flash區(qū)及數(shù)據(jù)Flash區(qū)字節(jié)讀-0 1 0對(duì)用戶的應(yīng)用程序Flash區(qū)及數(shù)據(jù)Flash區(qū)字節(jié)編程 -0 1 1對(duì)用戶的應(yīng)用程序 Flash區(qū)及數(shù)據(jù)Flash區(qū)扇區(qū)擦除 ISP_CONTR : ISP/IAP 限制存放器.ISPEN : ISP/IAP 功能允許位.0:禁止ISP/

38、IAP 編程改變Flash , 1:允許編程 改變FlashSWBS :軟件選擇從用戶主程序區(qū)啟動(dòng)0,還是從ISP程序區(qū)啟動(dòng)1.SWRST : 0:不操作,1:產(chǎn)生軟件系統(tǒng)復(fù)位,硬件自動(dòng)活零.ISP_CONTR 中的SWBS與SWRST這兩個(gè)功能位,可以實(shí)現(xiàn)單片機(jī)的軟件 啟如并啟動(dòng)到ISP區(qū)或用戶程序區(qū),這在“STC單片機(jī)自動(dòng)下載一節(jié),亦有所應(yīng)用.如:ISP_CONTR=0x60? 那么可以實(shí)現(xiàn)從用戶應(yīng)用程序區(qū)軟件復(fù)位到 ISP程序區(qū)開 始運(yùn)行程序.ISP_CONTR=0x20? 那么可以實(shí)現(xiàn)從ISP程序區(qū)軟件復(fù)位到用戶應(yīng)用程序區(qū)開 始運(yùn)行 程序.用IAP向Flash中讀寫數(shù)據(jù),是需要一定的讀

39、寫時(shí)間的,讀寫數(shù)據(jù)命令發(fā)出后, 要等待一段時(shí)間才可以讀寫成功.這個(gè)等待時(shí)間就是由 WT2、WT1、WT0與晶體振蕩 器頻率決定 的.以上的建議時(shí)鐘是WT2、WT1、WT0取不同的值時(shí)的標(biāo)稱時(shí)鐘,用戶系 統(tǒng)中的時(shí)鐘不要過高,否那么可能使操作不穩(wěn)定.stc單片機(jī)EEPROM 讀寫一EEPROM操作函數(shù):#define RdCommand 0x01 #define PrgCommand 0x02 #define EraseCommand 0x03 #define Error 1 #define Ok 0#define WaitTime 0x01#define PerSector 512 unsign

40、ed char xdata Ttotal512? /*翻開ISP,IAP功能*/void ISP_IAP_enable(void) D7 D6 D5 D4 D3 D2 D1 D0 ISPEN SWBS SWRST WT2 WT1 WT0 設(shè)置等待時(shí)間CPU等待時(shí)間(機(jī)器周期)WT2 WT1 WT0讀取編程扇區(qū)擦除建議的系統(tǒng)時(shí)鐘 0 1 1 6 30 5471 5MHz 0 1 0 11 60 10942 10MHz 0 0 1 22 120 21885 20MHz 0 0 0 43 240 43769 40MHz EA=0?/*關(guān)中斷*/ISP_CONTR|=0x18?/*0001,1000*

41、/ISP_CONTR|=WaitTime?/* 寫入硬件延時(shí) */ ISP_CONTR|=0x80?/*ISPEN=1*/ /*關(guān)閉ISP,IAP功能*/void ISP_IAP_disable(void)ISP_CONTR&=0x7f?/* ISPEN = 0 */ ISP_TRIG=0x00?EA=1?/*開中斷*/ /*公用的觸發(fā)代碼*/void ISPgoon(void) ISP_IAP_enable()?/* 翻開 ISP,IAP 功能*/ISP_TRIG=0x46?/* 觸發(fā) ISP_IAP 命令字節(jié) 1 */ ISP_TRIG=0xb9?/* 觸發(fā) ISP_IAP 命令字

42、節(jié) 2 */ _nop_()?/*字節(jié)讀*/unsigned char byte_read(unsigned int byte_addr)一一ISP_ADDRH=(unsigned char)(byte_addr>>8)? /* 地址賦值 */ ISP_ADDRL=(unsigned char)(byte_addr&0x00ff)?ISP_CMD&=0xf8? /* 活除低 3 位*/ISP_CMD|=RdCommand?/*寫入讀命令 */ISPgoon()?/* 觸發(fā)執(zhí)行*/ISP_IAP_disable()?/* 關(guān)閉 ISP,IAP 功能*/ return

43、ISP_DATA?/*返回讀到的數(shù)據(jù)*/ /*扇區(qū)擦除*/void sectorerase(unsigned int sector_addr)unsigned int iSectorAddr?iSectorAddr=(sector_addr&0xfe00)?/* 取扇區(qū)地址 */ISP_ADDRH=(unsigned char)(iSectorAddr>>8)? ISP_ADDRL=0x00?ISP_CMD&=0xf8?/* 活空低 3 位*/ISP_CMD|=EraseCommand?/*擦除命令 3*/ISPgoon()?/* 觸發(fā)執(zhí)行*/ISP_IAP_dis

44、able()?/* 關(guān)閉 ISP,IAP 功能*/ /*字節(jié)寫*/ void byte_write(unsigned int byte_addr, unsigned char original_data) ISP_ADDRH=(unsigned char)(byte_addr>>8)? /* 取地址 */ ISP_ADDRL=(unsigned char)(byte_addr & 0x00ff)?ISP_CMD&=0xf8?/* 活低 3 位*/ISP_CMD|=PrgCommand?/* 寫命令 2*/ ISP_DATA=original_data?/* 寫入數(shù)據(jù)

45、準(zhǔn)備 */ ISPgoon()?/* 觸發(fā)執(zhí)行*/ISP_IAP_disable()?/* 關(guān)閉 IAP 功能*/*字節(jié)寫并校驗(yàn)*/unsigned char byte_write_verify(unsigned int byte_addr, unsigned charoriginal_data)ISP_ADDRH=(unsigned char)(byte_addr>>8)? /* 取地址 */ISP_ADDRL=(unsigned char)(byte_addr&0xff)?ISP_CMD&=0xf8?/* 活低 3 位*/ISP_CMD|=PrgCommand?

46、/* 寫命令 2*/ISP_DATA=original_data?ISPgoon()?/* 觸發(fā)及行*/*開始讀,沒有在此重復(fù)給地址,地址不會(huì)被自動(dòng)改變*/ISP_DATA=0x00?/* 活數(shù)據(jù)傳遞存放器*/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_()?/* 延時(shí) */ISP_IAP_disable()?/* 關(guān)閉 IAP 功能*/if(ISP_DATA=ori

47、ginal_data)/*讀寫數(shù)據(jù)校驗(yàn) */return Ok?/*返回校驗(yàn)結(jié)果*/elsereturn Error?/*數(shù)組寫入*/unsigned char arraywrite(unsigned int begin_addr, unsigned int len, unsig ned char*array)unsigned int i?unsigned int in_addr?/*判是否是有效is圍,此函數(shù)不允許跨扇區(qū)操作*/if(len > PerSector)return Error?in_addr = begin_addr & OxOlff?/* 扇區(qū)內(nèi)偏移量 */if

48、(in_addr+len)>PerSector)return Error?in_addr = begin_addr?/*逐個(gè)寫入并校對(duì)*/ISP_IAP_enable()?/* 翻開 IAP 功能*/for(i=0?i<len?i+)(/*寫一個(gè)字節(jié)*/ISP_ADDRH=(unsigned char)(in_addr >> 8)?ISP_ADDRL=(unsigned char)(in_addr & 0x00ff)?ISP_DATA=arrayi? /* 取數(shù)據(jù) */ISP_CMD&=0xf8?/* 活低 3 位*/ISP_CMD|=PrgComman

49、d?/* 寫命令 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_()?/*比擬對(duì)錯(cuò)*/if(ISP_DATA!=arrayi)(ISP_IAP_disab

50、le()?return Error?in_addr+?/*指向下一個(gè)字節(jié)*/ISP_IAP_disable()?return Ok?/*扇區(qū)讀出*/*程序?qū)Φ刂窙]有作有效性判斷,請(qǐng)調(diào)用前事先保證他在規(guī)定范圍內(nèi)*/void arrayread(unsigned int begin_addr, unsigned char len)(unsigned int iSectorAddr?unsigned int i?iSectorAddr = begin_addr? / & 0xfe00? /* 取扇區(qū)地址 */ ISP_IAP_enable()?for(i=0?i<len?i+)(ISP

51、_ADDRH=(unsigned char)(iSectorAddr>>8)?ISP_ADDRL=(unsigned char)(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_()?Ttotali=ISP_DATA? iSectorAddr+?ISP_IAP_disable()?

52、/* 關(guān)閉 IAP 功能*/主函數(shù)對(duì)EEPROM操作函數(shù)進(jìn)行調(diào)用:#include <stc51rd.h>#include <intrins.h>#include <stc_eeprom.h>#include <ados.h> int i?void delay(unsigned int time)while(time)?void main()_ADOS(22.1184)?/ADOS自動(dòng)下載/for(i=0?i<100?i+)/Ttotali=i?/arraywrite(0x8000,100,Ttotal)?/*第一次運(yùn)行時(shí)向EEPROM中寫

53、入數(shù)據(jù) 然后再將寫入函數(shù)注釋掉,將先前寫 入的數(shù)據(jù)讀出,輸出在P2 口上.*/arrayread(0x8000,100)?for(i=0?i<100?i+)P2=Ttotali?delay(10000)?while(1)?stc單片機(jī)EEPROM 讀寫(二)sfr isp_data=0xe2;sfr isp_addrh=0xe3;sfr isp_addrl=0xe4;sfr isp_cmd=0xe5;sfr isp_trig=0xe6;sfr isp_contr=0xe7;unsigned char eeprom_read(unsigned int addres);void eeprom

54、_write(unsigned int address,unsigned char wdata);void eeprom_eares(unsignedint addres);扇區(qū)擦除.void eeprom_eares(unsignedint addres)扇區(qū)擦除.unsigned i;isp_addrl=addres;低位地址isp_addrh=addres>>8;高位地址isp_contr=0x01;isp_contr=isp_contr|0x80; 設(shè)時(shí)間與充 ISP 操作.isp_cmd=0x03;扇區(qū)命命令isp_trig=0x46;觸發(fā)isp_trig=0xb9;觸發(fā)啟動(dòng).for(i=0;i<3;i+);isp_addrl=0xff;isp_addrh=0xff

溫馨提示

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

評(píng)論

0/150

提交評(píng)論