1. 求好的51單片機學習網站
強烈推薦之一: 小剛之家:bes.8u8.com
(這是一個非常不錯的網站,從廉價的編程器,到KILE的漢化版,再到種類齊全的免費學習和應用軟體和資料,可見站長的良苦用心。我的編程器就是在這里買的,非常不錯!)
強烈推薦之二: 單片機愛好者://www.mcufan.com
強烈推薦之三: 單片機學習網:www.mcustudy.com
(以上這兩個有不少學習資料供瀏覽和下載。)
強烈推薦之四: 電子製作實驗室:www.xie-gang.com
(這里有單片機學習的網上教程,連載喲!)
強烈推薦之五: 51單片機://www.mcu51.com
(這可是大名鼎鼎的喲!她的論壇在單片機世界的影響就象HELLOCQ在HAM中的影響一樣。)
強烈推薦之六: 哦,沒有了! :D :D :D
衷心祝願單片機愛好者及學習者們馬到成功!!!(我也是正在學習中的菜鳥喲! ;) )
2. 誰知道在這個網站http://www.51c51.com/DIY/diy51/diy51.htm上的51單片機編程器的電路圖是否是正確的
網站是深圳學林電子的,電路是正確的,但是製作完了你還要給監控晶元燒寫監控程序,沒有燒寫器的話還是製作不了的。因為除了待燒寫的51單片機外還有一個用作控制下載燒寫程序的51單片機。如果你使用AT89S5X系列單片機來學習的話,建議採用並口ISP下載,你的電腦不會就有串口吧。
3. 單片機網路編程是什麼概念
就是為了解決單片機在網路中的通訊 一般情況下 都有 專用的神經元 晶元 例如 LON 晶元 就是地鐵項目經常用的LON網路通信
4. 有沒有關於keil C51單片機編程的書或者網站啊
書籍:《單片機的C語言應用程序設計》
作者:馬忠梅
網站:www.51c51.com
5. 單片機編程
單片機匯編語言中,符號$表示當前行地址。圖中djnz r2,$指令的意思是當R2減1不為0時,仍然執行當前行指令,知道R2減1到0時,繼續下一條指令。
6. 51單片機網站
這是我根據自己的單片機設計的程序。請根據自己的需要修改各個參數。
org 0000H
ajmp begin
org 000BH;時鍾中斷0入口
mov tl0,#00000B;每次中斷設初值
mov th0,#110B
ajmp time0;轉跳到定時器0子程序
org 0040H
begin:;初始化部分
;設置變數RAM位置
x equ 50H
y equ 51H
z equ 52H
times equ 53H;此變數是中斷次數,只有中斷250次,才能積累2M個機器周期,即1秒鍾,
rtimes equ 54H
wtimes1 equ 55H
wtimes2 equ 56H
;設置字型碼
mov 60H,#005H;0
mov 61H,#0DDH;1
mov 62H,#046H;2
mov 63H,#054H;3
mov 64H,#09CH;4
mov 65H,#034H;5
mov 66H,#024H;6
mov 67H,#05DH;7
mov 68H,#004H;8
mov 69H,#014H;9
mov 5FH,#0FEH;-
;設置各LED位數字的RAM單元
n8 equ 71H
n7 equ 72H
n6 equ 73H
n5 equ 74H
n4 equ 75H
n3 equ 76H
n2 equ 77H
n1 equ 78H
;設置數位選線的位置
l8 bit p3.0
l7 bit p3.6
l6 bit p3.5
l5 bit p3.7
l4 bit p3.1
l3 bit p3.2
l2 bit p3.3
l1 bit p3.4
;設置定時器
setb ea
setb et0
mov th0,#11111111B
mov tl0,#11111B
clr tr0
mov p3,#00H
start:;r2-小時/r3-分鍾/r4-秒/r1是按鍵的值,無按鍵時為10H
mov r2,#00
mov r3,#00
mov r4,#00
;第3、6位顯示橫線「-」
mov n6,5FH
mov n3,5FH
main:;主程序
mov r1,#10H;r1賦10H,沒按鍵
acall chcut;調用r2-r4值轉換為字型碼並存入n1-n8的子程序
acall show;掃描一遍LED
acall key;調用鍵盤掃描子程序(此程序在51dz提供的程序上略加修改,保留注釋)
jb tr0,walkstop;若在走時,不允許調時,跳到walkstop
cjne r1,#4,s2;若r1不是4則跳到下一個計時部分s2(下同)
acall hinc;調用小時加1子程序
acall chcut
acall longdelay;調用長延時子程序
ajmp main;此次設置完成,跳到主程序
s2:
cjne r1,#5,s3
acall minc;調用分鍾加1子程序
acall chcut
acall longdelay
ajmp main;此次設置完成,跳到主程序
s3:
cjne r1,#6,s4
acall sinc;調用秒加1子程序
acall chcut
acall longdelay
ajmp main;此次設置完成,跳到主程序
s4:
cjne r1,#7,s5
acall hdec;調用小時減1子程序
acall chcut
acall longdelay
ajmp main;此次設置完成,跳到主程序
s5:
cjne r1,#8,s6
acall mdec;調用分鍾減1子程序
acall chcut
acall longdelay
ajmp main;此次設置完成,跳到主程序
s6:
cjne r1,#9,s7
acall sdec;調用秒減1子程序
acall chcut
acall longdelay
ajmp main;此次設置完成,跳到主程序
s7:
cjne r1,#0,walkstop
mov r2,#0;時分秒清0
mov r3,#0H
mov r4,#0H
acall chcut
acall longdelay
ajmp main;此次設置完成,跳到主程序
walkstop:
cjne r1,#11,s0
acall stop;調用停止走時子程序
ajmp main;此次設置完成,跳到主程序
s0:
cjne r1,#12,main
acall walk;調用開始走時子程序
ajmp main;此次設置完成,跳到主程序
;以下是子程序
show:;掃描子程序
mov p1,n8;將第8位數字型碼送上P1(下同)
setb l8;使第8位LED亮
acall delay;調用掃描延時子程序
clr l8;使第8位LED滅
mov p1,n7
setb l7
acall delay
clr l7
mov p1,n6
setb l6
acall delay
clr l6
mov p1,n5
setb l5
acall delay
clr l5
mov p1,n4
setb l4
acall delay
clr l4
mov p1,n3
setb l3
acall delay
clr l3
mov p1,n2
setb l2
acall delay
clr l2
mov p1,n1
setb l1
acall delay
clr l1
ret
hdec:
cjne r2,#0,hdnext;如果小時不是0就到hdnext
jnb tr0,hskip;小時是0且tr0是0即不在計時,到hskip
acall warning;小時是0且tr0是1即在計時,就調用報警子程序
clr tr0;停止計時
ret;返回
hskip:mov r2,#100;小時是0又不在計時,就讓r2賦100,到下一些條減1後就是59
hdnext:dec r2;如果小時不是0就到這里減1
ret
mdec:;分鍾減1子程序
cjne r3,#00,mdnext;如果分鍾不是0就到minext
mov r3,#60;如果分鍾是0就到變為60,到下一些條減1後就是59
acall hdec;從小時退位
mdnext:dec r3;如果分鍾不是0就到這里減1
ret
sdec:;秒減1子程序
cjne r4,#00,sdnext;如果秒不是0就到sdnext
mov r4,#60;如果秒是0就到變為60,到下一些條減1後就是59
acall mdec;從分鍾退位
sdnext:dec r4;如果秒不是0就到這里減1
ret
hinc:;小時加1子程序
cjne r2,#99,hinext;如果小時不是99就到hinext
mov r2,#255;如果小時是23就到變為255,到下一些條加1後就是0
hinext:inc r2;如果小時不是99就到這里加1
ret
minc:
cjne r3,#59,minext;如果分鍾不是23就到minext
mov r3,#255;如果分鍾是59就到變為255,到下一些條加1後就是0
acall hinc;分鍾滿,向小時進位
minext:inc r3;如果分鍾不是59就到這里加1
ret
sinc:
cjne r4,#59,sinext;如果秒不是23就到sinext
mov r4,#255;如果是秒是59就到變為255,到下一些條加1後就是0
acall minc;秒滿,向分鍾進位
sinext:inc r4;如果秒不是59就到這里加1
ret
chcut:;將r2-r4值轉換為字型碼並存入n1-n8的子程序
mov a,r2;小時值送Acc(下同)
mov b,#10;B賦10
div ab;AB相除,此時A是小時的十位,B是小時的個位
mov n7,b;小時的個位B送第七位數
mov n8,a;小時的十位A送第八位數
mov a,r3;分解分鍾到第四、五位數
mov b,#10
div ab
mov n4,b
mov n5,a
mov a,r4;分解秒到第一、二位數
mov b,#10
div ab
mov n1,b
mov n2,a
;以下開始轉換各數位的二進制數到字型碼(第6、3位是橫線,由定時器控制有無)
mov a,n8;第8位數送Acc(下同)
add a,#60H;Acc加60H,此時Acc中值所指的RAM地址中為第8位數的字型碼
mov r0,a;Acc送r0
mov n8,@r0;r0間接地址送回n8
mov a,n7;轉換第7位數
add a,#60H
mov r0,a
mov n7,@r0
mov a,n5;轉換第5位數
add a,#60H
mov r0,a
mov n5,@r0
mov a,n4;轉換第4位數
add a,#60H
mov r0,a
mov n4,@r0
mov a,n2;轉換第2位數
add a,#60H
mov r0,a
mov n2,@r0
mov a,n1;轉換第1位數
add a,#60H
mov r0,a
mov n1,@r0
ret
longdelay:;長延時子程序
mov r6,#0FFH
reshow1:acall show
djnz r6,reshow1
mov r6,#0FFH
reshow2:acall show
djnz r6,reshow2
ret
delay:;掃描延時子程序
mov r5,#40H
djnz r5,$
ret
ringdelay:mov r5,#0FFH
djnz r5,$
ret
time0:;定時器0子程序
push Acc;Acc壓棧
mov a,times;已中斷次數送Acc
inc a;次數加1
mov times,a;加1後送回次數變數
cjne a,#250,gotoend;如果Acc不是250說明不到1秒,跳過加秒操作
mov times,#0;是250說明到1秒了,次數變數清0
mov n6,#0FFH;第3、6位清除橫線「-」
mov n3,#0FFH
acall sdec;調用秒減1子程序
ajmp next;退出
gotoend:cjne a,#125,next;若Acc不是125就退出
mov n6,5FH;若是125就給第3、6位顯示5FH中的字型碼橫線「-」
mov n3,5FH
next:pop Acc;退出時,從棧中彈出Acc
reti;此程序中次數在0-124就不顯示橫線,在125-250就顯示橫線
walk:;開始走時子程序
setb tr0
ret
stop:;停止走時子程序
clr tr0
ret
warning:;報警子程序
;放入-FINISH-字型碼
mov n8,#0FEH;-
mov n7,#02EH;F
mov n6,#0DDH;I
mov n5,#00DH;N
mov n4,#0DDH;I
mov n3,#034H;S
mov n2,#08CH;H
mov n1,#0FEH;-
mov wtimes1,#50;設置蜂鳴次數50次
res1:mov wtimes2,#08FH;一次蜂鳴開始
res2:clr p2.0;從此句開始蜂鳴器發聲
mov p3,#0H;LED熄滅
mov r6,#5;掃描延時子程序延時太短,要重復5次
redelay:acall delay;此2句重復5次
djnz r6,redelay
setb p2.0
djnz wtimes2,res2;轉到RES2讓蜂鳴器發聲,轉wtimes2次,即8FH次
mov p3,#0H;從此句開始蜂鳴器不發聲
mov r7,#08FH;LED掃描次數
reshow:acall show
djnz r7,reshow;LED掃描08FH次,即不發聲延時
djnz wtimes1,res1;到RES1開始一次蜂鳴
finish:acall show;這兩句使LED顯示,並進入死循環
ajmp finish
key:mov p0,#00001111b;上四位和下四位分別為行和列,所以送出高低電壓檢查有沒有按鍵按下
jmp k10;跳到K10處開始掃描,這里可以改成其它條件轉移指令來決定本次掃描是否要繼續,例如減1為0轉移或者位為1或0才轉移,這主要用來增加功能,確認上一按鍵功能是否完成?是否相當於經過了延時?是否要封鎖鍵盤?
goend:jmp kend;如果上面判斷本次不執行鍵盤掃描程序,則立即轉到程序尾部,不要浪費CPU的時間
k10:jb p0.0,k20;掃描正式開始,先檢查列1四個鍵是否有鍵按下,如果沒有,則跳到K20檢查列2
k11:mov p0,#11101111b;列1有鍵按下時,P0.0變低,到底是那一個鍵按下?現在分別輸出各行低電平
jb p0.0,k12;該行的鍵不按下時,p0.0為高電平,跳到到K12,檢查其它的行
mov r1,#13;如果正好是這行的鍵按下,將寄存器R0寫下1,表示1號鍵按下了
k12:mov p0,#11011111b
jb p0.0,k13
mov r1,#15;如果正好是這行的鍵按下,將寄存器R0寫下2,表示2號鍵按下了
k13:mov p0,#10111111b
jb p0.0,k14
mov r1,#0;如果正好是這行的鍵按下,將寄存器R0寫下3,表示3號鍵按下了
k14:mov p0,#01111111b
jb p0.0,kend;如果現在四個鍵都沒有按下,可能按鍵松開或干擾,退出掃描(以後相同)
mov r1,#14;如果正好是這行的鍵按下,將寄存器R0寫下4,表示4號鍵按下了
jmp kend;已經找到按下的鍵,跳到結尾吧
k20:jb p0.1,k30;列2檢查為高電平再檢查列3、4
k21:mov p0,#11101111b;列2有健按下時,P0.0會變低,到底是那一行的鍵按下呢?分別輸出行的低電平
jb p0.1,k22;該行的鍵不按下時p0.0為高電平,跳到到K22,檢查另外三行
mov r1,#12;如果正好是這行的鍵按下,將寄存器R0寫下5,表示5號鍵按下了(以後相同,不再重復了)
k22:mov p0,#11011111b
jb p0.1,k23
mov r1,#9
k23:mov p0,#10111111b
jb p0.1,k24
mov r1,#8
k24:mov p0,#01111111b
jb p0.1,kend
mov r1,#7
jmp kend;已經找到按下的鍵,跳到結尾吧(以後相同,不要重復了)
k30:jb p0.2,k40
k31:mov p0,#11101111b
jb p0.2,k32
mov r1,#11
k32:mov p0,#11011111b
jb p0.2,k33
mov r1,#6
k33:mov p0,#10111111b
jb p0.2,k34
mov r1,#5
k34:mov p0,#01111111b
jb p0.2,kend
mov r1,#4
jmp kend
k40:jb p0.3,kend
k41:mov p0,#11101111b
jb p0.3,k42
mov r1,#10
k42:mov p0,#11011111b
jb p0.3,k43
mov r1,#3
k43:mov p0,#10111111b
jb p0.3,k44
mov r1,#2
k44:mov p0,#01111111b
jb p0.3,kend
mov r1,#1
kend: ret
end
7. 單片機編程知識九大問答知識
單片機編程知識九大問答知識
為幫助大家更加了解單片機編程知識,下面,我為大家分享單片機編程知識問答知識,希望對大家有所幫助!
搞單片機開發,一定要會C嗎?
答:匯編語言是一種用文字助記符來表示機器指令的符號語言,是最接近機器碼的一種語言。其主要優點是佔用資源少、程序執行效率高。但是不同的CPU,其匯編語言可能有所差異,所以不易移植。
對於目前普遍使用的RISC架構的8bit MCU來說,其內部ROM、RAM、STACK等資源都有限,如果使用C語言編寫,一條C語言指令編譯後,會變成很多條機器碼,很容易出現ROM空間不夠、堆棧溢出等問題。而且一些單片機廠家也不一定能提供C編譯器。而匯編語言,一條指令就對應一個機器碼,每一步執行什麼動作都很清楚,並且程序大小和堆棧調用情況都容易控制,調試起來也比較方便。所以在資源較少單片機開發中,我們還是建議採用匯編語言比較好。
而C語言是一種編譯型程序設計語言,它兼顧了多種高級語言的特點,並具備匯編語言的功能。C語言有功能豐富的庫函數、運算速度快、編譯效率高、有良好的可移植性,而且可以直接實現對系統硬體的控制。C語言是一種結構化程序設計語言,它支持當前程序設計中廣泛採用的由頂向下結構化程序設計技術。此外,C語言程序具有完善的模塊程序結構,從而為軟體開發中採用模塊化程序設計方法提供了有力的保障。因此,使用C語言進行程序設計已成為軟體開發的一個主流。用C語言來編寫目標系統軟體,會大大縮短開發周期,且明顯地增加軟體的可讀性,便於改進和擴充,從而研製出規模更大、性能更完備的系統。
綜上所述,用C語言進行單片機程序設計是單片機開發與應用的必然趨勢。所以作為一個技術全面並涉足較大規模的軟體系統開發的單片機開發人員最好能夠掌握基本的C語言編程。
當開發一個較復雜而又開發時間短的項目時,用C還是用匯編開發好?
答:對於復雜而開發時間緊的項目時,可以採用C語言,但前提是要求對該MCU系統的C語言和C編譯器非常熟悉,特別要注意該C編譯系統所能支持的數據類型和演算法。雖然C語言是最普遍的一種高級語言,但不同的MCU廠家其C語言編譯系統是有所差別的,特別是在一些特殊功能模塊的操作上。如果對這些特性不了解,那調試起來就有的煩了,到頭來可能還不如用匯編來的快。
C語言和匯編語言在開發單片機時各有哪些優缺點?
答:匯編語言是一種用文字助記符來表示機器指令的符號語言,是最接近機器碼的.一種語言。其主要優點是佔用資源少、程序執行效率高。但是不同的CPU,其匯編語言可能有所差異,所以不易移植。
C語言是一種結構化的高級語言。其優點是可讀性好,移植容易,是普遍使用的一種計算機語言。缺點是佔用資源較多,執行效率沒有匯編高。
對於目前普遍使用的RISC架構的8bit MCU來說,其內部ROM、RAM、STACK等資源都有限,如果使用C語言編寫,一條C語言指令編譯後,會變成很多條機器碼,很容易出現ROM空間不夠、堆棧溢出等問題,而且一些單片機廠家也不一定能提供C編譯器。而匯編語言,一條指令就對應一個機器碼,每一步執行什幺動作都很清楚,並且程序大小和堆棧調用情況都容易控制,調試起來也比較方便。所以在單片機開發中,我們還是建議採用匯編語言比較好。
如果對單片機C語言有興趣,HOLTEK的單片機就有提供C編譯器,可以到HOLTEK的網站免費下載使用。
C或匯編語言可以用於單片機,C++能嗎?
答:在單片機開發中,主要是匯編和C,沒有用C++的。
在教學中要用到8088和196晶元單片機教材,請問哪裡可以找到關於這方面的書或資料?
答:有關這方面的教材,大學里常用的一本是《IBM-PC匯編語言程序設計》清華大學出版社出版的,在網上以及書店都是可以找到的,另外網上還可以搜索到很多其他的教材如:《微機原理及匯編語言教程》(楊延雙 張曉冬 等編著 )和《16/32 位微機原理、匯編語言及介面技術》(作者: 鍾曉捷 陳濤 ,機械工業出版社 出版)等,可以在較大型的科技書店裡查找或者直接從網上訂購。
初學者到底是應該先學C還是匯編?
答:對於單片機的初學者來說,應該從匯編學起。因為匯編語言是最接近機器碼的一種語言,可以加深初學者對單片機各個功能模塊的了解,從而打好扎實的基礎。
我是一名武漢大學電子科技大3的學生,學了電子線路、數字邏輯、匯編和介面、C語言,但是總是感覺很迷茫,覺好象什麼都不會,怎麼辦?
答:大學過程是一個理論過程,實踐的機會比較少,往往會造成理論與實踐相脫節,這是國內大學教育系統的通病,不過對於學生來說切不可好高騖遠。一般從大三會開始接觸到一些專業課程,電子相關專業會開設相關的單片機應用課程並且會有簡單的實驗項目,那麼要充分把握實驗課的機會,多多地實際上機操作練習。平時可以多看看相關的電子技術雜志網站,看看別人的開發經驗,硬體設計方案以及他人的軟體設計經驗。有可能的話,還可以參加一些電子設計大賽,藉此機會2-3個人合作做一個完整系統,會更有幫助。到了大四畢業設計階段,也可以選擇相關的課題作些實際案例增長經驗。做什麼事情都有個經驗的積累過程,循序漸進。
請問作為學生,如何學好單片機?
答:學習好單片機,最主要的是實踐,在實踐中增長經驗。在校學生的話,實踐機會的確會比較少,但是有機會的話,可以畢業實習選擇相關的課題,這樣就可以接觸到實際的項目。而且如果單片機微機原理是一門主課的話,相信學校會安排比較多的實踐上機機會。有能力的話,可以找一些相關兼職工作做做,會更有幫助。而且單片機開發應用需要軟硬體結合,所以不能只滿足於編程技巧如何完美,平時也要注意硬體知識的積累,多上上電子論壇網站,買一些相關雜志。可能的話,可以到電子市場去買一些小零件,自己搭一個小系統讓它工作起來。
如何才能成為單片機的高手啊?
答:要成為單片機高手,應該多實踐,時常關注單片機的發展趨勢;經常上一些相關網站,從那裡可以找到許多有用的資料。
;