怎樣下載單片機參數
代碼下載到單片機中的方法有兩種,一種在通過ISP(在線下載)下載到單片機,另外一種比較常見的是通過編程器把代碼燒錄到單片機。
只要把匯編指令都寫出來了,你就可以到指令表中找到每一條指令所對應的機器碼,然后你只要在機器碼后面加上操作數即可,比如,把一個30H單元送入A累加器;指令是這樣的:MOV A , 30H .那么你可以在指令表中查到執行這條指的機器碼是1110 0101,但是由于這條指令后面的那個30H單元的數是根據你的要求在不斷的變的,機器沒規定你只能用30H單元,所以這個30的操作數必須由你填,它們和在一塊兒,這條指令的機器碼是:1110 0101 0011 0000用十六進制來表示:E530,很明顯前兩位E5是機器指定的,而后兩位30是你自己加進去的。共是十六位,占用兩個字節……。 你說的LED燈閃爍,不知是指的流水燈還是一只發光二極管在不停地閃爍?但不管是哪一種,有一點很重要。你在編寫此程序時必須要考慮延時,因為51單片機的晶體振蕩器最低頻率可能是6M(具體數值我已記不清了)。也就是說單片機的每一個機器周期所占用的時間僅2微秒,如果你不考慮延時的話,那么你設計的那盞燈,它閃爍的結果是;亮2微秒,熄2微秒,也就是說每一秒鐘要亮暗50萬次,肉眼看這盞燈根本就不會有熄滅的時候,只是比不閃的燈暗了一半。我們生活中用的白熾燈,每秒鐘亮暗100次,你能感覺出燈泡有熄滅的時候嗎?更何況那是50萬次??! 比如設計流水燈的程序,不妨可以這樣考慮它的算法。計數寄存器的高八位加上低八位,合起來也只有十六位,它能數的數最大也就是65535,就算單片機用的是最低的6M的晶體振蕩器,一個機器周期是12個機器節拍,所以,每一個機器周期占用2微秒時間,從0數到65535,僅用了131070微秒就數完了,約130毫秒,如果就按這個延時去改變燈的亮暗時間,那么這盞燈每秒鐘要亮暗3、4次,肉眼雖然能夠看到燈有熄滅的時間了。但是眼睛看這樣的燈總不會那么舒服,所以至少應讓它延時到1秒鐘亮暗一次。為了計算方便,就讓計數器數100毫秒的時間吧!等計數器數到100毫秒后,就讓它再數一次,然后再數一次……,等它數滿5次后,這就是500毫秒(半秒鐘),然后,我們再去改變燈的亮暗狀態。 這個程序可以這樣來編: MOV A ,#0FEH ;最低位設為0 MOV P1, A ;點亮最低位燈 MOV TCON,#10H ;T1為方式1,定時 BEGIN: MOV R7 ,#05H ;設循環5次 STAR: MOV TH1 #3CH ;計數器數100毫秒 MOV TL1 #AFH SETB TR1 ;開始計數 ROU: JBC TF1 SE ;100毫秒到否? SJMP ROU ;等待到100毫秒 SE: CLR TR1 ;關閉計數器 DJNZ R7 STAR ;5次循環到否? RL A ;把0向左移一位 MOV P1 ,A ;改下一只燈亮 SJMP BEGIN 51的單片機
ORG 0000H MAIN:MOV R2,#2 L1:MOV R3,#200 L2:MOV R4,#200 L3:NOP NOP DJNZ R4,L3 DJNZ R3,L2 DJNZ R2,L1 CPL P1.7 JMP MAIN END
Medwin編寫C51匯編
八只LED燈做流水燈實驗 單片機在上電初始后,其各端口輸出為高電平。如果我們現在想讓接在P1.0口的LED1亮,那么我們只要把P1.0口的電平變為低電平就可以了。想讓LED1滅,LED0亮,只需將P1.0升高,P1.1變低,LED1就熄滅LED2隨后既點亮!依始類推如下所示8只LED變會一亮一暗的做流水燈了. P1.0低、P1.0高、P1.1低、P1.1高、P1.2低、P1.2高、P1.3低、P1.3高、P1.4低、P1.4高、P1.5低、P1.5高、P1.6低、P1.6高、P1.7低、P1.7高、返回到開始、程序結束。 我們不能說P1.1你變低,它就變低了。因為單片機聽不懂我們的漢語的,只能接受二進制的“1、0......”代碼。我們又怎樣來用二進制語議論使單片機按我們的意思去工作呢?為了讓單片機工作,只能將程序寫為二進制代碼交給其執行;早期單片機開發人員就是使用人工編寫的二進制代碼交給單片機去工作的。今天,我們不必用煩人的二進制去編寫程序,完全可以將我們容易理解的“程序語言”通過“翻譯”軟件“翻譯”成單片機所需的二進制代碼,然后交給單片機去執行。這里的“程序語言”目前主要有匯編和C兩種;在這里我們所說的“翻譯”軟件,同行們都叫它為“編譯器”,將“程序語言”通過編譯器產生單片機的二進制代碼的過程叫編譯。前面說到,要想使LED1變亮,只需將對應的單片機引腳電平變為低電平就可以了?,F在讓我們將上面提到的8只LED流水燈實驗寫為匯編語言程序。
“漢語”語言 匯編語言 開始: star: P1.0低 clr p1.0 P1.0高 setb p1.0 P1.1低 clr p1.1 P1.1高 setb p1.1 P1.2低 clr p1.2 P1.2高 setb p1.2 P1.3低 clr p1.3 P1.3高 setb p1.3 P1.4低 clr p1.4 P1.4高 setb p1.4 P1.5低 clr p1.5 P1.5高 setb p1.5 P1.6低 clr p1.6 P1.6高 setb p1.6 P1.7低 clr p1.7 P1.7高 setb p1.7 返回到開始 ljmp star 結束 end
這里用到了四條匯編指令:clr、 setb、 ljmp 、end;
clr:是將其后面指定的位清為0; setb:是將其后面指定的位置成1; ljmp:是無條件跳轉指令,意思是:跳轉到指定的標號處繼續運行。 end:是一條告訴編譯器:程序到此結束的偽指令。偽指令只告訴編譯器此程序到此有何 要求或條件,它不參與和影響程序的執行。這里需要說明的是,按匯編語法要求,所編制的程序(下稱源程序)之格式和書寫要求必須依下列原則: 1、源程序必須為純文本格式文件,如用Windows“附件”中的“記事本”編寫的文本文件;2、源程序的擴展名應是 *.ASM; 3、一行只能寫一條語句,以回車作為本句的結束,每一語句行長度應少于80個字符(即40個漢字)。 4、每行的格式應為:標號: 命令 參數 ;注釋 即一行由四部份組成,各部份的順序不能搞錯,依實際要求可以缺省其中的一部份或幾部份,甚至全部省去,即空白行。需要使用標號時標號后面必須有“:”(冒號),而命令語句和參數之間必須用空格分開,如果命令有多個參數,則參數與參數之間必須用“,”(逗號)分開,需要注釋時注釋前必須用“;”(分號),“;”后面的語句可以寫任何字符,包括漢字用于解釋前面的匯編語句,它將不參與匯編,不生成代碼。由于匯編程序對我們還不直觀,所以在編寫源程序時,應當養成多寫注釋的習慣,這樣有助于今后源程序的閱讀和維護。 標號是標志程序中某一行的符號名,編譯后標號的數值就是標號所在行代碼的地址。在宏匯編ASM51中標號的長度不受限制,但標號中不能包含‘:’或其它的一些特殊符號,也不能用漢字,可以用數字作標號,但必須用字母開頭。當標號作參數用(如標號作轉移地址),在命令后面出現時,必須舍去‘:’(如上面程序中的 LJMP STAR中的 STAR 是不能再有:)。 每行只能有一個標號,一個標號只能用在一處,如果有兩行用了同一個標號,則匯編時就會出錯。由于標號的長度沒有限制,可以用有意義的英文或漢語拼音來說明行,使源程序讀起來更方便。 源程序中的字母不區分大小寫,也就是說 star 和 STAR 是一樣的,請不要用大小寫方式去區分不同的標號: 流水燈實驗詳解二 上一節的實驗最后沒有得到“流水”顯示的效果,主要是單片機執行每條指令的時間很短,我們肉眼無法看到LED的熄滅與點亮。單片機內部能按部就班的自動工作,正是在系統時鐘的作用下,內部各邏輯硬件產生各種所需脈沖信號而實現的。這個時鐘信號(既晶體振蕩信號)的周期稱“振蕩周期”。我們這個實驗中晶體使用的是12MHZ. 在單片機中,要處理最短周期的一條指令需要由12個振蕩周期(既晶振振蕩周期)組成的,這個叫“機器周期”。 8051核的單片機,大多數指令只用一個機器周期(既單周期),也有雙周期和四周期的指令。本實驗中用到的SETB P.x和CLR P.x均屬于單周期指令,也就是說,執行一句 SETB P.x 用時僅1uS(微秒),CLR P.x 也是1uS;難怪我們前面的程序不能看到流水效果。 現在,將程序改動一下,在每點亮一個LED后,讓程序干點別的事,也就是讓它等一會再將該LED熄滅,繼續執行下面的程序: DDW: ;程序開始 CLR P1.0 ;LED1亮 ACALL DELAY ;調用延時子程序 SETB P1.0 ;LED1滅 CLR P1.1 ;換燈,同上 ACALL DELAY SETB P1.1 CLR P1.2 ACALL DELAY SETB P1.2 CLR P1.3 ACALL DELAY SETB P1.3 CLR P1.4 ACALL DELAY SETB P1.4 CLR P1.5 ACALL DELAY SETB P1.5 CLR P1.6 ACALL DELAY SETB P1.6 CLR P1.7 ACALL DELAY SETB P1.7 LJMP DDW ;返回到開始循環 DELAY: ;延時子程序 MOV R1,#50 AD10: MOV R2,#100 AD11: MOV R3,#100 DJNZ R3,$ DJNZ R2,AD11 DJNZ R1,AD10 RET ;延時子程序結束,返回到調用處的下一句 END 請將上面的程序保存為 1LED.asm,進行編譯,并燒寫到AT89S51中,之后將89S51安裝到套件的實驗部份插座上實驗,這回顯示的就是“流水燈”的效果了!?回過頭,讓我們看看延時子程序是怎樣工作的:單片機內部有不少寄存器,這些寄存器在單片機通電時,你可以給他寫入數據(是單片機按你程序要求寫的數據,而不是編程器寫的),當第二次給他寫入新數據時,前次的數據就被新數據覆蓋;當然也可以從寄存器中讀取數據。當單片機沒有電源供給時,寄存器內部的數據也隨即消失;這些寄存器人們叫他RAM,而用編程器將我們編寫的程序燒寫到單片機中的存儲器叫ROM;現在,我們應該清楚:RAM是讓程序去使用的,ROM是我們編寫的程序存放的地方! 前面說過,單片機內部有不少RAM,本實驗用的AT89C51有多少寄存器?我們現在不必關心,現在只須知道單片機內部有名叫R0~R7 的這8個寄存器。這8個寄存器每個都由8個單獨的位寄存器組成,最大存放數據為二進制的 1111 1111,十六進制 = FF,十進制 = 255。在使用時注意不要大于其有效范圍。上面延時程序中,先用到 MOV R1,#50 ,MOV是移動的意思,該句是將50這個十進制數放到R1中;50是立即數,按匯編語言要求前面要加“#”號,匯編語言還規定,十六進制數后面要加“?H”,十六進制數的高位是字母時在字母前面還要加“0”,例如:#0F8H;二進制數后面加“B”,例如:#11110000B。十進制不加,例如:#100。延時程序的第二、三句為: MOV R2,#100 ;MOV R3,#100 ;這兩句意思同前。第四句中DJNZ R3,$ 的意思是將 R3 里面的數減 1 后如果 R3 不等于 0 則跳到后面指定的程序位置,這里的“$”既要跳轉的程序位置,“$”代表當前語句處,也就是說,R3不等于 0,程序返回再次執行本句。如果R3 減 1 后等于0,程序結束本句,繼續執行下面的語句。延時程序的最后一句是RET ,意思是退出本子程序,返回到調用本子程序處的下一句。根據上面的解釋,一進入延時子程序首先為R1, R2, R3 寄存器裝入我們需要的數據,然后先對R3 進行減數,每次減 1 ,R3 減完后減R2 ,減R2 時就費事啦,因為R2 每減 1 后不為 0 需要跳轉到AD11 標號處執行下面的語句,此時R3 再次裝入數據100,并且還要再次對R3 進行減數......,R2 減完后減R1,減R1的過程你研究研究看看。 每執行 DJNZ ?Rn,rel (Rn 指 R0~R7,rel 指轉移地址)指令一次,需要2個機器周期,單片機需耗時2uS(指本實驗),若忽略裝數等語句,延時子程序從開始到結束,單片機共耗時100*100*50*2nS,既1000000uS=1秒!若加上裝數等語句的耗時,延時時間大于1秒。 到此,我們做的流水燈已成功,原理大致也明白啦,若你自認為這一課你完全明白了,那請你將“流水燈”的流向改變一下,也可以改為兩邊向內流,內部向外流......,我想你一定能用前面學到的方法實現這些功能??赡苡行└呤终f,前面的編程方法是最最笨的!,不錯!但玩單片機初期不必講究語言的簡練,只要能完成預先要求就好,這是初學者要知道的。那么還有更好的編程思路嗎?有!請繼續學習下節課
做流水燈實驗詳解三
在上節課中讓 LED 流水是去逐個控制P1端口的每個位來實現的,那么我們在程序一開始就給P1口送一個數,這個數本身就讓P1.0先低,其他位為高,然后讓這個數據向高位移動不就實現“流水”效果啦?的確如此!可惜,8051沒有讓P1數據移動的指令,但有對累加器ACC中數據左移或右移的指令,ACC是8051單片機內部算術邏輯單元中的一個“寄存器”(這里叫他寄存器是不正確的,但你可以先這樣理解,ACC在指令中常寫為A),他在數據傳輸和數據處理過程中作用十分重要,ACC為8位。他可與片內所有單字節寄存器交換數據,實際上P1和其他端口在單片機中也是一個寄存器。這樣我們可以將需移動的數據先放到ACC中,讓其移動,然后將ACC移動后的數據再轉送到P1口,這樣同樣可以實現“流水”效果。
程序如下:DDW: ;開始 MOV ACC,#0FEH ;ACC中先裝入LED1熄滅的數據(即二進制的 1111 1110) MOV P1,ACC ;將ACC的數據送P1口 MOV R0,#7 ;因上句送到?p1口的數據就熄滅了一位,所以將數據再移動7次就完成一個8位流水過程 LOOP: ;數據移動循環 Rl A ;將ACC中的數據左移一位 MOV P1,A ;把ACC移動過的數據送p1口顯示 ACALL DELAY ;調用延時 DJNZ R0,LOOP ;沒有移動夠7次繼續移動 LJMP DDW ;移動完7次后跳到開始重來,以達到循環流動效果 DELAY: ;延時子程序,就是上節課中的延時子程序 MOV R1,#50 ADl0: MOV R2,#100 ADl1: MOV R3,#100 DJNZ R3,$ DJNZ R2,AD11 DJNZ R1,AD10 RET ;延時子程序結束,返回到調用處的下一句 END ;本匯編程序到此結束
接下來,將上述程序編譯,并燒寫到前面我們的實驗芯片中,流水效果與第二節課的一樣。 其實8051單片機有111條指令,這111條指令好比以前我們使用數字傳呼機時的“短語代碼”一樣,可以用幾個“短語代碼”去表示一句完整、通順的語句段落。有的指令常用,有的指令不常用,只要遵守語法規則,你可以用這些指令“組合”成你想象到的任何程序。當然,有時一條指令可以替代很多條指令,這樣會使程序簡捷,費碼減少,在編寫較大程序時可以讓程序存儲器放得下你需要的代碼。這也是單片機高手所追求的。當然,在程序存儲器空間不成問題時,你不這樣做但也可以達到預期的功能,這也不算錯。 單片機內部還有很多“部件”我們只是用到什么說什么,很不系統。但是我也不想系統的介紹這些,因系統介紹單片機結構和指令的書很多,何況寫的遠比我好,因此,希望你在看本講座的過程中,還要結合正規的教材學習其更多的指令和“部件”。
這是我在別的地方找過來的,希望對你有所幫助。
我用的是WAVE6000編譯的。

提交
超越傳統直覺,MATLAB/Simulink助力重型機械的智能化轉型
新大陸自動識別精彩亮相2024華南國際工業博覽會
派拓網絡被Forrester評為XDR領域領導者
智能工控,存儲強基 | ??低晭砭手黝}演講
展會|Lubeworks路博流體供料系統精彩亮相AMTS展會