Ⅰ 設計一個單片機應用系統
最簡單的流水燈
/***************
*
* 程序功能 : P0.0口的LED實現亮滅的閃爍實驗
* 應用軟體 : KEIL C
* 版 本 : KEIL 7.06
* 創建時間 : 2005-07-28
*
* 註:為了有更多實用的實驗程序供大家學習,部分程序參考網上的資源,
* 在此謝謝這些無私奉獻的朋友!!!
***********************/
ORG 0000H ;CPU上電復位後,從0000H開始執行
LJMP MAIN ;跳轉到MAIN主程序
ORG 0100H ;主程序從0100H開始,避開中斷入口區地址
MAIN:
MOV P0,#0FFH ;把P0口置一,熄滅8個發光二極體
LOOP:
CLR P0.0 ;把P0.0清零,低電平點亮L0
LCALL DELAY ;調用延時子程序
SETB P0.0 ;把P0.0置1,高電平熄滅L0,
LCALL DELAY ;調用延時子程序
LJMP LOOP ;回到LOOP,不斷的循環執行程序
DELAY: MOV R5,#40 ;延時子程序,改變R5,R6,R7 的值,可以改變延時的時間,從而改變流水燈移動速度
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
Ⅱ 單片機程序怎麼在電腦上調試用什麼軟體好
單片機可以實現在線調試程序,通過軟體設置斷點,進行單步調試,這樣可以看到單片機是如何一步步執行程序的,從而快速找到問題,解決問題。以Keil和IAR為例介紹一下單片機的在線調試。
1.keil
的在線調試功能
以STM32單片機為例,所需要的軟體為Keil MDK,模擬工具為J-link,當程序編寫完成後,編譯通過,通過J-link模擬工具連接電腦和單片機板子,一定要安裝好J-link的驅動,在Debug界面選擇J-Link,並正確設置Setting界面的下的器件型號,如下圖所示。
設置好後,點擊工具欄的Debug按鈕,就進入在線調試模式了,這時候會出現調試工具欄,如下圖所示。
在懷疑有問題的地方設置斷點後,運行單步調試,單片機就可以一步步的執行了,在watch窗口可以選擇查看單片機的GPIO等寄存器,實時了解各埠和變數的變化情況。
2.IAR
的在線調試功能
以STM8單片機為例,以IAR for STM8為例,工具為ST-Link,正確安裝好ST-Link的驅動,程序編譯通過後,執行Debug and download按鈕可以開啟在線模擬模式,如下圖所示。
在有問題的地方設置斷點,執行全速運行後,會在斷點處停下,可以執行單步調試功能進入函數,再一步步執行。
這樣也可以很容易的找到程序bug。
3.使用串口列印進行調試
如果單片機不支持在線模擬功能,可以通過串口列印的形式輸出調試信息。首先要把串口列印程序調試通,在有問題的地方通過給變數設置不同的值然後列印,這樣也可以很直觀的判斷程序的運行情況。所需要的工具為USB/TTL。
由於篇幅有限,無法詳細描述,大家可以根據以上信息搜具體的教程。
以上就是這個問題的回答,感謝留言、評論、轉發。
更多精彩內容請關注本頭條號:玩轉嵌入式。感謝大家。
Ⅲ 單片機程序加密的幾種實用方法
可讀可寫:
1.XOR(最簡單)
2.AES,DES(比較高級)
不可寫只可讀:RSA+MD5
Ⅳ 單片機怎麼燒程序
問題一:51單片機晶元燒入程序 買一個燒錄器就好了,杜邦線直接插到DIP腳上
問題二:單片機如何燒錄程序 STC系列單片機為例:
首先,需要安裝keil軟體和STC_ISP程序下載軟體。
先對你想要實現對單片機的功能用keil編程,然後用STC_ISP下載軟體下載到單片機上,最後打開給單片機提供電源就可以觀察單片機開發板或是自己搭建的板子上的現象了...通過不斷修改程序,下載程序,最終獲得自己在實驗板上想要的結果。這樣就可以了...
實驗板與PC機的連接:一般對現成購買的開發板來說,會有一個USB介面提供5v電源、提供通信或另一個USB用橋答野來下載介面驅動程序,同時有RS232串口,實現MAX232電平與單片機TTL電平之間轉換,用來進行通信下載程序和數據;;對自己搭建的電路板來說,仍會有MAX232晶元和RS232串口用來實現程序的燒寫,實現對單片機寫入數據和程序的下載。用的是RS232串口實現的程序燒寫!
若要用USB來燒寫,需要一個相應的ISP下載軟體和硬體燒寫器,一般這種燒寫器價格不菲。用的是USB口實現燒寫程序!
一般的,燒寫程序還是選用可以用ISP下載的,自己搭建個RS232串口的電路,簡單實用,對單片機燒寫程序就夠用了。
問題三:單片機中燒程序是什麼意思 看處你剛剛入門。單片機是個有意思的東西,好好學。keil是電腦上的編程軟體,燒程序你就理解為往單片機中下載程序。
問題四:單片機開始可以燒程序用了幾次就燒不進去 怎麼回事? 有可能已經燒壞敏喊了,特別是89c52系列 更特別是STC品牌的89C52的。很容易壞,
你要注意了,你電壓可能有問題。
還有就是燒程序的時候需要復亥,如果以前你能燒現在不能燒,說明你復位電路沒有問題,經常復位電路影響燒程序。
問題五:第一次給單片機燒程序要注意什麼? use轉232應該沒有問題,我用現代的晶元試過已經通過。首先我們要分析你有沒有進入ISP模式,用示波器觀察一下串口的波形是否正常,再就是晶元各個管腳的電壓是否正常。排除硬體原因後仍不能解決,建議換一下你的USB轉232線,這方面的牌子實在太多了,雖然原理都一樣,但作為一個故障點來分析也是應該考慮的。
問題六:為什麼單片機程序燒不進去? 用的是什麼型號的單片機?會不會是燒寫前沒有先擦除?單片機保存程序是使用EEPROM或者flash的,都需要先擦除,才能寫入的。第一次能燒進去,是因為單片機出場時本來就是已擦除過的,可以寫入。但之後的寫入之前,都需要先擦除。
問題七:單片機程序燒入rom之後怎樣執行 1,HEX文件包含了代碼數據。是由鏈接器統一分配ROM地址。
2. 程序中的變數,也是在編譯連接時,分配了RAM地址。不存在載入的問題,程序指令對變數的操作,就是對RAM地址的操作,地址值存在在指令中。
3. 堆棧在程序初始化時設置堆棧指針。Keil C 會自動設置好。
4. 一般的51單片機代碼是從 0000開始執行,這是它的復位地址。也有別的型號的單片機並不一定從0開始執行。程序從0開始執行,但它執行的第一句往往是一個跳轉指令(這個Keil C也是自動寫好的),跳到另一塊地址去執行,而不會順序執行到 中斷的地址的。
你如果是用匯編寫程序,這些都是要你自己去分配的,用C寫程序,由編譯器來完成這些底層操作。
問題八:怎麼程序突然燒不進單片機了??? 這種情況會有很多種可能性:
1、單片機已經損壞,樓主換個單片罰試試。
2、單片機開發板損壞,這個情況基本上不可能發生,但樓主需做好准備。
3、USBISP損壞,概率不大,換一個試試。
4、下載軟體出問題了,樓主看看自己的程序下載軟體的型號是否為「AT89S52」。
5、單片機在插座上插反了。
6、某條連接線不牢固。
7、開發板的晶振鬆了,或數值舉派不對。
問題九:8051單片機通過什麼口燒程序? at89c**系列是用並口下載。at89系列可以用isp方式下載。 stc系列可以通過串口下載。51有專門的模擬晶元。。
isp可以用串口或者並口,或者串口轉u *** (這種方式最方便,筆記本上也可以下載)。isp就用到單片機的io口(P1.5,P1.6,P1.7),還有RST引腳+74h373+並口,就可以下載了。。
Ⅳ 單片機的常用指令有哪些medwin
單片機指令功能一覽表
助記符 代碼 說明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接位元組送A
MOV A,@Ri ER~E7 間接RAM送A
MOV A,#data 74 data 立即數送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接位元組送寄存器
MOV Rn,#data 78~7F data 立即數送寄存器
MOV dircet,A F5 dircet A送直接位元組
MOV dircet,Rn 88~8F dircet 寄存器送直接位元組
MOV dircet1,dircet2 85 dircet1 dircet2 直接位元組送直接位元組
MOV dircet,@Ro 86~87 間接RAM送直接位元組
MOV dircet,#data 75 dircet data 立即數送直接位元組
MOV @Ri,A F6~F7 A送間接RAM
MOV @Ri,#data 76~77 data 直接位元組送間接RAM
MOV @Ri,#data 76~77 data 立即數送間接RAM
MOV DPTR,#data16 90 data 15~8 16位常數送數據指針
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))定址的程序存貯
器位元組選A
MOVC A,@A+PC 83 由((A)+(PC));定址的程序存貯器位元組送A
MOVX A,@Ri E2~E3 送外部數據(8位地址)送A
MOVX A,@DPTR E0 送外部數據(16位地址)送A
MOVX @Ri,A F2~F3 A送外部數據(8位地址)
MOVX @DPTR,A F0 A送外部數據(16位地址)
PUSH dircet C0 dircet 直接位元組進棧,SP加1
POP dircet D0 dircet 直接位元組退棧,SP減1
XCH A,Rn C8~CF 交換A和寄存器
XCH A,dircet C5 dircet 交換A和直接位元組
XCH A,@Ri C6~C7 交換A和間接RAM
XCH A,@Ri D6~D7 交換A和間接RAM的低位
SWAP A C4
算術操作 (A的二個半位元組交換)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接位元組加到A
ADD A,@Ri 26~27 間接RAM加到A
ADD A,#data 24data 立即數加到A
ADD A,Rn 38~3F 寄存器和進位位加到A
ADD A,dircet 35dircet 直接位元組和進位位加到A
ADD A,@Ri 36~37 間接位元組和進位位加到A
ADD A,data 34 data 立即數和進位位加到A
ADD A,Rn 98~9F A減去寄存器和進位位
ADD A,dircet 95 dircet A減去直接位元組和進位位
ADD A,@Ri 36~37 間接RAM和進位位加到A
ADD A,data 34 data 立即數和進位位加到A
SUBB A,Rn 98~9F A減去寄存器和進位位
SUBB A,dircet 95 dircet A減去直接位元組和進位位
SUBB A,@Ri 96~97 A減去間接RAM和進位位
SUBB A,#data 94 data A減去立即數和進位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接位元組加1
INC @Ri 06~07 間接RAM加1
DEC A 14 A減1
DEC Rn 18~1F 寄存器減1
DEC dircet 15 dircet 直接位元組減1
DEC @Ri 16~17 間接RAM減1
INC DPTR A3 數據指針加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十進制加法調整
邏輯操作
ANL A,Rn 58~5F 寄存器「與」到A
ANL A,dircet 55 dircet 直接位元組「與」到A
ANL A,@Ri 56~57 間接RAm「與」到A
ANL A,#data 54 data 立即數「與」到A
ANL dircet A 52 dircet A「與」到直接位元組
ANL dircet,#data 53 dircet data 立即數「與」到直接位元組
ORL A,Rn 48~4F 寄存器「或」到A
ORL A,dircet 45 dircet 直接位元組「或」到A
ORL A,@Ri 46~47 間接RAM「或」到A
ORL A,#data 44 data 立即數「或」到A
ORL dircet,A 42 dircet A「或」到直接位元組
ORL dircet,#data 43 dircet data 立即數「或」到直接位元組
XRL A,Rn 68~6F 寄存器「異或」到A
XRL A,dircet 65 dircet 直接位元組「異或」到A
XRL A,@Ri 66~67 間接RAM「異或」到A
XRL A,#data 64 data 立即數「異或」到A
XRL dircet A 62 dircet A「異或」到直接位元組
XRL dircet,#data 63 dircet data 立即數「異或」到直接位元組
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左環移
RLC A 33 A通過進位左環移
RR A 03 A右環移
RRC A 13 A通過進位右環移
控製程序轉移
ACALL addr 11 *1 addr(a7~a0) 絕對子程序調用
LCALL addr 16 12 addr(15~8) 長子程序調用
addr(7~0)
RET 22 子程序調用返回
RETI addr 11 32 中斷調用返回
AJMP addr 11 △1 addr(a7~a6) 絕對轉移
LJMP addr 16 02addr(15~8) 長轉移
addr(7~0)
SJMP rel 80 rel 短轉移,相對轉移
JMP @A+DPTR 73 相對於DPTR間接轉移
JZ rel 60 rel A為零轉移
JNZ rel 70 rel A為零轉移
CJNE A,dircet,rel B5 dircet rel 直接位元組與A比較,不等則轉移
CJNE A,#data,rel B4 data rel 立即數與A比較,不等則轉移
CJNE A,Rn,#data,rel B8~BF data rel 立即數與寄存器比較,不等則轉移
CJNE @Ri,#data,rel B6~B7 data rel 立即數與間接RAM比較,不等則轉移
DJNZ Rn,rel D8~DF rel 寄存器減1,不為零則轉移
DJNZ dircet,rel B5 dircet rel 直接位元組減1,不為零則轉移
NOP 00 空操作
*=a10a9a8l
△=a10a9a80
布爾變數操作
CLR C C3 清零進位
CLR bit C2 清零直接位
SETB C D3 置位進位
SETB bit D2 置位直接位
CPL C B3 進位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接數「與」到進位
ANL C,/bit B0 直接位的反「與」到進位
ORL C,bit 72 bit 直接位「或」到進位
ORL C,/bit A0 bit 直接位的反「或」到進位
MOV C,bit A2 bit 直接位送進位
MOV bit,C 92 bit 進位送直接位
JC rel 40 rel 進位位為1轉移
JNC rel 50 rel 進位位為0轉移
JB bit,rel 20 bit rel 直接位為1相對轉移
JNB bit,rel 30 bit rel 直接位為0相對轉移
JBC bit,rel 10 bit rel 直接位為1相對轉移,然後清零該位
[1]. 循環移位指令(4條)
RL A ;累加器A中的內容左移一位
RR A ;累加器A中的內容右移一位
RLC A ;累加器A中的內容連同進位位CY左移一位
RRC A ;累加器A中的內容連同進位位CY右移一位
[2]. 累加器半位元組交換指令(1條)
SWAP A ; 累加器中的內容高低半位元組互換
[3]. 求反指令(1條)
CPL A ; 累加器中的內容按位取反
[4]. 清零指令(1條)
CLR A ; 0→(A),累加器中的內容清0
[5]. 邏輯與操作指令(6條)
ANL A,data ;累加器A中的內容和直接地址單元中的內容執行與邏輯操作。結果存在寄存器A中。
ANL data,#data ;直接地址單元中的內容和立即數執行與邏輯操作。結果存在直接地址單元中。
ANL A,#data ;累加器A的內容和立即數執行與邏輯操作。結果存在累加器A中。
ANL A,Rn ;累加器A的內容和寄存器Rn中的內容執行與邏輯操作。結果存在累加器A中。
ANL data,A ;直接地址單元中的內容和累加器A的內容執行與邏輯操作。結果存在直接地址單元中。
ANL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行與邏輯操作。結果存在累加器A中。
[6]. 邏輯或操作指令(6條)
這組指令的作用是將兩個單元中的內容執行邏輯或操作。如果直接地址是I/O地址,則為「讀—修改—寫」操作。
ORL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯或操作。結果存在寄存器A中。
ORL data,#data ;直接地址單元中的內容和立即數執行邏輯或操作。結果存在直接地址單元中。
ORL A,#data ;累加器A的內容和立即數執行邏輯或操作。結果存在累加器A中。
ORL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯或操作。結果存在累加器A中。
ORL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯或操作。結果存在直接地址單元中。
ORL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯或操作。結果存在累加器A中。
[7]. 邏輯異或操作指令(6條)
XRL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯異或操作。結果存在寄存器A中。
XRL data,#data ;直接地址單元中的內容和立即數執行邏輯異或操作。結果存在直接地址單元中。
XRL A,#data ;累加器A的內容和立即數執行邏輯異或操作。結果存在累加器A中。
XRL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯異或操作。結果存在累加器A中。
XRL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯異或操作。結果存在直接地址單元中。
XRL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯異或操作。結果存在累加器A中
控制轉移類指令分析
[1]. 無條件轉移指令(4條)
LJMP addr16 ;addr16→(PC),給程序計數器賦予新值(16位地址)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序計數器賦予新值(11位地址),(PC15-11)不改變
SJMP rel ;(PC)+ 2 + rel→(PC)當前程序計數器先加上2再加上偏移量給程序計數器賦予新值
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址單元的值加上數據指針的值給程序計數器賦予新值
[2]. 條件轉移指令(8條)
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,則轉移到偏移量所指向的地址,否則程序往下執行
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的內容不為0,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的內容不等於直接地址單元的內容,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址單元中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
布爾變數操作指令分析
[1]. 位傳送指令(2條)
MOV C,bit ;bit→CY,某位數據送CY
MOV bit,C ;CY→bit,CY數據送某位
[2]. 位置位復位指令(4條)
CLR C ; 0→CY,清CY
CLR bit ; 0→bit,清某一位
SETB C ; 1→CY,置位CY
SETB bit ; 1→bit,置位某一位
[3]. 位運算指令(6條)
ANL C,bit ;(CY)∧(bit)→CY
ANL C,/bit ;(CY)∧( )→CY
ORL C,bit ;(CY)∨(bit)→CY
ORL C,/bit ;(CY)∧()→CY
CPL C ;()→CY
CPL bit ;()→bir
[4]. 位控制轉移指令(5)
JC rel ; (CY)=1轉移,(PC)+2+rel→PC,否則程序往下執行,(PC)+2→PC。
JNC rel ; (CY)=0轉移,(PC)+2+rel→PC,否則程序往下執行,(PC)+2→PC。
JB bit, rel ; 位狀態為1轉移。
JNB bit, rel ; 位狀態為0轉移。
JBC bit, rel ; 位狀態為1轉移,並使該位清「0」。
Ⅵ 51單片機 匯編語言 常用數據處理程序設計 求16個無符號數的最大值
查找最升州大值的程序,不是很胡告簡單的嗎?
如下即可:
ORG 0H
MOV R0, #30H
ACALL ZI
SJMP $
;-----------------------------------
ZI:
MOV B, #0 ;先用0當做最大值.
MOV R7, #16 ;比較16次.
LOOP: MOV A, @R0 ;取來吵做蔽一個數字.
CJNE A, B, B1 ;比較.
B1: JC B2 ;有借位轉移.
MOV B, A ;夠減則存到B中.
B2: INC R0 ;轉到下一個.
DJNZ R7, LOOP ;循環16遍.
RET
;-----------------------------------
END