Ⅰ 我該如何學單片機
首先你要會一點模擬電路(認識電子元件和功能)和數字電路(二、十、十六等數制之間的轉換)最基礎的知識,會電腦的基本操作。
有了這些你還需要工具,沒有工具光看書是沒有用的,學單片機就是要多實踐才能學得好。電腦、學習板這些都是必須的。
現在網上有很多視頻教程很不錯的,我現在也是剛學單片機的,正在看視頻自學,覺得收獲很大。
Ⅱ 手把手教你學51單片機的前 言
目前,51系列單片機在我國已得到大力推廣和廣泛應用,從工業控制系統到小型電子產品都可以見到51單片機的身影,它經典的結構使其成為單片機學習的入門首選,得到了廣大單片機使用者的一致推崇,關於51單片機學習和應用的書也五彩紛呈,本書也是其中的一本。
編寫本書的目的
筆者從事單片機設計工作已有多年,在這期間設計和參與設計了較多的單片機項目,取得了很多單片機實際設計經驗,對單片機設計有了一些較深的認識。所以希望能通過這本書對初步學習單片機的讀者有所幫助,並且也是自己對學習和應用單片機的一個總結。
通常在學校學習的單片機知識偏重於理論而不是技能,可是在工作中需要面對的是實際問題,而不是在紙上談兵;作為一名單片機工程師,筆者在工作中對此深有感觸。所以本書的著重點是想讓讀者了解一個完整的單片機設計過程所需的知識,而不僅僅只是講述單片機的原理。通過本書的學習,讀者可以獨立設計和完成一個簡單的單片機控制系統,即體驗從原理圖設計、製作電路板到單片機系統調試的整個過程。
本書的主要內容
本書概括地論述了單片機的基礎知識,包括單片機的基本結構和工作原理;並就實際單片機項目開發中會遇到的各種問題進行了闡述,列舉了單片機開發的流程和必須遵守的一些規范,說明了模擬器和編程器在開發中的作用以及基本的使用方法。具體內容如下。
首先論述了單片機的基礎知識,包括單片機的基本結構和工作原理,闡述了目前單片機的發展情況,列舉了最新流行的單片機種類,總結了單片機的選擇方法。
在了解單片機基本知識的基礎上,詳細講解了單片機的主要開發語言——匯編語言和C51語言;編程語言的使用是單片機和其他集成電路的重要區別,用它來賦給單片機命令,使單片機按照設計者的意志運行命令。
本書也花了一定的篇幅講解了模擬器和編程器的原理和使用說明。編程器和模擬器是單片機項目開發中常用的工具,模擬器是單片機程序調試中很有用的輔助工具,可以逐步地觀察單片機的運行過程,以便發現程序中的錯誤;而編程器是用來將編寫好的程序寫入單片機的工具。除了傳統的模擬器和編程器外,還列舉了一些最新的單片機開發手段,如在線模擬和ISP(在系統編程),這些新的方法大大降低了單片機的開發費用,在線模擬使得設計者不需要去購買昂貴的模擬器,而ISP則替代了編程器,這進一步降低了學習單片機開發的門檻。
在講解這些理論知識的過程中,本書還簡單講述了單片機開發中的一些規范,包括單片機原理圖、PCB圖以及程序設計的設計規范。這在實際工作中是必須了解和遵守的,也是一個單片機設計工程師必須具備的基本知識。
完成了基本知識的學習後,本書由易至難列舉了一些設計實例,這些實例基本上概括了單片機項目設計中遇到的各種問題。
通常,一個單片機系統設計可以分為如下五大方面。
(1)單片機能夠運行的最小系統,包括振盪電路、復位電路以及電源電路。
(2)單片機I/O口的使用方法和定時器、中斷系統的使用。
(3)單片機的通信介面,單片機的通信在單片機設計中是經常遇到的功能,所以必須注意目前單片機系統常用的各種通信介面和協議。
(4)單片機的系統擴展,系統擴展通常可以分為程序存儲器的擴展、數據存儲器的擴展以及單片機I/O口的擴展三部分。
(5)信號轉換介面,主要是A/D、D/A轉換以及PWM的實現。這是單片機信號處理中經常遇到的問題。
前面兩部分是單片機最基本的功能,後面三部分則是單片機的擴展應用,掌握了這些基本知識,便可應對用單片機解決的各種項目。
本書的特點
本書具有知識全面、實例豐富、操作性強的特點,力求以全面、系統的知識和豐富、簡短的實例指導初學者學習單片機各方面的知識。因此,本書適合於開始學習單片機設計和具有一定單片機基礎知識的讀者,目的是使讀者通過本書的學習可以初步掌握單片機的開發應用。
本書安排有「提示」、「注意」、「說明」小欄目,通過這些小欄目可和讀者分享一些經驗和心得,同時也可為讀者清除學習過程中的難點和疑點。
本光碟內容超值豐富,不但提供了書中全部範例的源代碼和電路圖,而且提供了多媒體視頻教學錄像,用以講解如何使用本書光碟中的源代碼,手把手引導讀者直觀深入地學習。
本書閱讀順序
本書章節的安排是依據讀者對單片機學習的過程、以循序漸進的方式建立的,建議初學者從前至後閱讀。
首先閱讀第1章至第7章,這些章節是單片機設計的基礎知識,必須掌握。只有熟讀了這幾章的內容,才能閱讀後面的章節。其中,第3章可以放到完成基本知識的學習後閱讀。
閱讀第8章至第12章,這幾章是講述單片機設計中的一些基本手段和方法,涉及單片機系統設計中的方方面面,掌握這些知識可以解決單片機設計中的大部分問題。
閱讀第13章——綜合實例,它由淺入深、由簡入繁,將前面講解的一些知識應用到實際項目中,可以讓讀者對單片機設計項目有具體的認識。
致謝
經過緊張的策劃、寫作和編寫,本書才得已完稿。在寫作的過程中,得到了參與本書策劃的各位編輯的大力協助;在此,對所有參與該書編輯、出版的老師表示衷心的感謝。
惠 仇
2008.6.28
Ⅲ 手把手教你學avr單片機C語言程序設計-----周興華
很難找的
Ⅳ 怎樣學習STM32
你這種情況我當初自學單片機的時候也遇到過,不知道從何下手,似乎哪裡都是重點卻哪裡都是釘子。我的解決辦法就是把這些文檔、手冊先放一邊,跟著教程一步一步去動手寫動手做,教程里怎麼做自己就怎麼做。從最簡單的配置啟動文件和點燈開始,千萬不要眼高手低,即使再簡單的事例即使看懂了真自己去做的時候那種感覺和帶來的認識也是完全不一樣的。在學習初期,除了啟動配置庫里的代碼,自己程序里的主代碼最好自己寫一遍,哪怕是照著打也最好不要直接復制粘貼。實踐過程中遇到不懂語句或者電路去再去查閱手冊和資料,盡量自己解決,查的過程中注意不要看一直看起來沒完舍本求末也不要貪大求全,看到解決了問題為止就再把手冊放一邊。平時有空可以看看那幾個常用手冊的目錄,對大體內容有個了解,方便遇到問題時查找。建議學的過程中做筆記,把自己的理解和經驗記錄下來,記在數據手冊的margin上也行,記在專門的本子上也行,這個看自己怎麼習慣怎麼來,兩種方法各有優點一般互相結合,這部分學習中的積累在未來將是你的巨大財富。關於視頻,網上傳的比較多的講的都挺好譬如野火的、青島李想的等等,沒有誰的一定最好一說,適合自己的就是最好的。STM32教程有兩種,一種是基於對寄存器操作,另一種是基於函數庫的直接使用。如果你有單片機基礎,並且想以此為職業,推薦從寄存器操作學起,然後在學函數庫,有基礎學這部分很快,跟51、avr沒多大差別,就是寄存器多、位數多、功能多而已。如果你剛入單片機,推薦從函數庫的使用學起,等到學的差不多再慢慢了解寄存器的相關知識和操作。最後一句話概括就是:千里之行始於足下。
Ⅳ 學單片機 找學校
上海周新華老師好像最近辦了一個單片機的培訓班,他也寫過《手把手教你學單片機(匯編)》《手把手教你學單片機(C語言)》(北航出版社)等書,你可以去
http://www.hlelectron.com/
看看
Ⅵ 手把手教你學單片機課後習題答案:關於用定時器著流水燈程序
在51單片機開發板上,用定時器做了一個流水燈程序,調整非常靈活,很實用拿出來和朋友們一起分享#include<reg52.h>,這是一個左右循環的程序,如果想要其他花樣只需改變數組里元素排列順序即可,很好玩的,也很簡單。
Ⅶ 單片機是如何,學習更有效.
學習單片機的最有效方法
對一個初學單片機的人來說,如果按教科書式的學法,上來就是一大堆指令、名詞,學了半天還搞不清這些指令起什麼作用,能夠產生什麼實際效果,那麼也許用不了幾天就會覺得枯燥乏味而半途而廢。所以學習與實踐結合是一個好方法,邊學習、邊演練,循序漸進,這樣用不了幾次就能將用到的指令理解、吃透、紮根於腦海,甚至「根深蒂固」。也就是說,當你此次學習完某幾條指令後(一次數量不求多,只求懂),接下去就該做實驗了,通過實驗,使你感受剛才的指令產生了控制效果,眼睛看得見(燈光)、耳朵聽得到(聲音),更能深刻理解指令是怎樣轉化成信號去控制電子產品的。說句過分的話,單片機與其說是學出來的,還不如說是做實驗練出來的,何況做實驗本身也是一種學習過程。《電子製作》2003~2004的《手把手教你學單片機》講座就是基於這樣一種邊學邊練的理念展開的,從眾多的讀者反饋來看,效果特別好,許多讀者經3~6個月的學習已能開發簡單的產品了(如霓紅燈廣告牌控制、累加計數器等)。
學習單片機要合理安排學習時間持之以恆
學習單片機可不能「三天打魚、二天曬網」 ,要有持之以恆的毅力與決心,學習完幾條指令後,就應及時做實驗,融會貫通,而不要等幾天或幾個星期有時間後再做實驗,這樣效果不好甚至前學後忘。另外要有打「持久戰」 的心理准備,不要興趣來時學上幾天,無興趣時涼上幾星期。學習單片機很重要的一點就是持之以恆。
學習單片機要使用循環學習法使之根深蒂固
《手把手教你學單片機》講座入門起點低,很多朋友覺得好學、易學,很快就能將講座從頭至尾學完、學懂,但過了幾個月,在開發產品時對指令的具體作用就有些淡忘了。根據現代科學的研究,對只短暫學過一遍的知識,充其量只比浮光掠影稍好。因此,較好的方法是,過一段時間後(1~2個月)再重新做一遍,這樣反復循環幾次就能徹底弄懂消化,永不忘卻。有道是:若人生能細看《水滸傳》10遍,那麼裡面的故事內容、人物場情將永生不忘。
學習單片機要進行適當投資購買實驗器材及書籍資料
單片機技術是一門含金量高的技術,一旦學會後,它給你帶來的效益回報當然也高,無論是應聘求職還是自起爐灶開廠辦公司,其前景是光明無限。因此在學習時要捨得適當投資購買必要的學習、實驗器材,另外還要經常去科技圖書店看看,購買一些適合自己學習、提高的書籍。總之,春天不播種哪來秋天的收獲?考慮到初學者的學習成本,《手把手教你學單片機》講座主要採用「程序完成後軟體模擬→單片機燒錄程序→試驗板通電實驗」的方法(現在的快閃型單片機其程序可燒寫1000次以上),而沒有採用價格昂貴的在線模擬器(ICE)進行實驗,這樣整套實驗器材(不包括PC機)只有幾百元,對大部分已工作的愛好者來說都有這個經濟能力承受。一旦當你掌握了單片機的編程技術,成為一個水平較高的單片機設計人員時,再買在線模擬器也不遲。
准備:
單片機燒錄器
單片機模擬器
單片機(89c2051,便宜)
軟體(Keil)
1、先找本單片機入門的書來看,對於寄存器不必很深的了解
2、照書上的電路圖搭好電路(復位、晶振、IO……)
3、將書上的范常式序燒入單片機跑(或者模擬,看程序運行)
4、當你做完IO流水燈實驗、串口收發數據實驗,再回去看書,能有更深的體會。
5、高級應用的書,或者做更多的東西~~
Ⅷ 51單片機流水燈實驗(我用的是手把手教你學單片機的教程)
呵呵,這個延時有點長哦,有10S,你耐心再看看,有沒有變化,如果再沒變化,你可以軟體模擬一下那個i變數。看他是不是能加到10000,。還有,學51單片機的話建議你去學 郭天祥十天學會51單片機 那個很不錯。希望採納
Ⅸ 我是一名在校大學生 想學習單片機
書可以先不看,那些理論也不用去管它,
學單片機最主要的是動手,
只要你揭破了單片機神密的面紗,其實很簡單,一個月就可以學會了,
至於多媒體的教學材料我想也沒有多大作用.
自己先用萬能板或者熱轉印弄個最簡單的電路,就點亮一個燈,然後熄滅就行了.你就能感覺到原來這就是單片機.
記住:動手,看人家的程序,再動手!
有一個周傳功(好像是這個名字)的<<手把手教你學單片機>>系列教程挺不錯的,找找看.
Ⅹ 手把手教你學會單片機,宋雪松老師的簡易計算器,怎麼用普中科技單片機實現怎麼接線
/* S16 S12 S8 S4分別是123+
S15 S11 S7 S3分別是456-
S14 S10 S6 S2分別是789*
S13 S9 S5 S1分別是0 CLR = /
*/
/* 實現兩個數的運算,每個數的位數至少可以八位 */
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;
sbit led=P3^7;
sbit beep=P2^0;
uint8 key,num;
uint8 fuhao;//定義具體的那個符號,是加減還是乘除。
uint8 flag; //定義有沒有按下符號鍵,這個是統稱
long a,b,c,d; //定義運算數據的第一個和第二個及等於的數變數
uint8 k; //定義小數點後面顯示的位數
uint8 biao;
uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存顯示的數據
void delay(uint16 i)
{
while(i--);
}
void lcdwrc(uint8 c)
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1000);
e=0;
}
void lcdwrd(uint8 dat)
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1000);
e=0;
rs=0;
}
void lcdinit()
{
delay(1500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
lcdwrc(0x08);
lcdwrc(0x01);
lcdwrc(0x06);
lcdwrc(0x0c);
key=0;
num=0;
flag=0;
fuhao=0;
a=0;
b=0;
c=0;
d=0;
biao=0;
led=0;
}
void keyscan()
{
P1=0xfe; //令第一行為0,然後判斷是哪一列按下
if(P1!=0xfe)
{
delay(1000);
if(P1!=0xfe)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=0;break; //1
case 0xd0: num=1;break; //2
case 0xb0: num=2;break; //3
case 0x70: num=3;break; //加
}
}
while(P1!=0xfe);
if(num==0||num==1||num==2) //確認第一行的數1,2,3
{
if(flag==0) //沒有按下符號鍵
{
//led=1;
a=a*10+dat1[num];
}
else
{
//led=1;
b=b*10+dat1[num];
}
}
if(num==3)
{
//led=0;
flag=1;
fuhao=1;//加號+
}
lcdwrd(0x30+dat1[num]);
}
P1=0xfd; //令第二行為0,判斷是哪一列按下
if(P1!=0xfd)
{
delay(1000);
if(P1!=0xfd)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=4;break; //4
case 0xd0: num=5;break; //5
case 0xb0: num=6;break; //6
case 0x70: num=7;break; //減—
}
}
while(P1!=0xfd);
if(num==4||num==5||num==6)
{
if(flag==0) //沒有按下符號鍵
{
//led=1;
a=a*10+dat1[num];
}
else
{
//led=1;
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=2;//帶表減號
}
lcdwrd(0x30+dat1[num]);
}
P1=0xfb; //令第三行為0,判斷哪一列按下
if(P1!=0xfb)
{
delay(1000);
if(P1!=0xfb)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=8;break; //7
case 0xd0: num=9;break; //8
case 0xb0: num=10;break; //9
case 0x70: num=11;break; //乘*
}
}
while(P1!=0xfb);
if(num==8||num==9||num==10)
{
if(flag==0) //沒有按下符號鍵
{
//led=1;
a=a*10+dat1[num];
}
else
{
//led=1;
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=3;//帶表乘號*
}
lcdwrd(0x30+dat1[num]);
}
P1=0xf7; //令第四行為0,判斷哪一列按下
if(P1!=0xf7)
{
delay(1000);
if(P1!=0xf7)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=12;break; //0
case 0xd0: num=13;break; //清除rst
case 0xb0: num=14;break; //等號=
case 0x70: num=15;break; //除/
}
}
while(P1!=0xf7);
switch(num)
{
case 12:
if(flag==0) //沒有按下符號鍵
{
//led=1;
a=a*10+dat1[num];
lcdwrd(0x30);
}
else
{
//led=1;
b=b*10+dat1[num];
lcdwrd(0x30);
}
break;
case 13:
lcdwrc(0x01); //清屏指令
a=0;
b=0;
flag=0;
fuhao=0;
break;
case 15:
flag=1;
fuhao=4;
lcdwrd(0x2f);//除號/
break;
case 14:
if(fuhao==1)//加
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//設置游標左移,屏幕不移動
c=a+b;
while(c!=0) //一位一位顯示
{
lcdwrd(0x30+c%10);//顯示結果的最後一位在0x4f的位置
c=c/10;//取前面的結果數據
}
lcdwrd(0x3d); //顯示等於號=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除為0
}
if(fuhao==2) //減
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//設置游標左移,屏幕不移動
if(a>b)
c=a-b;
else
c=b-a;
while(c!=0) //一位一位顯示
{
lcdwrd(0x30+c%10);//顯示結果的最後一位在0x4f的位置
c=c/10;//取前面的結果數據
}
if(a<b) lcdwrd(0x2d); //顯示-號
lcdwrd(0x3d); //顯示等於號=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除為0
}
if(fuhao==3)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//設置游標左移,屏幕不移動
c=a*b;
while(c!=0) //一位一位顯示
{
lcdwrd(0x30+c%10);//顯示結果的最後一位在0x4f的位置
c=c/10;//取前面的結果數據
}
lcdwrd(0x3d); //顯示等於號=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除為0
}
if(fuhao==3)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//設置游標左移,屏幕不移動
c=a*b;
while(c!=0) //一位一位顯示
{
lcdwrd(0x30+c%10);//顯示結果的最後一位在0x4f的位置
c=c/10;//取前面的結果數據
}
lcdwrd(0x3d); //顯示等於號=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除為0
}
if(fuhao==4)
{
k=0;
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//設置游標左移,屏幕不移動
c=(long)(((float)a/b)*1000);//強制轉換為long。
while(c!=0) //一位一位顯示
{
k++;
lcdwrd(0x30+c%10);//顯示結果的最後一位在0x4f的位置
c=c/10;//取前面的結果數據
if(k==3)
{
lcdwrd(0x2e);
k=0;
}
}
if(a/b<0) //如果a比b小的話那麼除的結果最高位是0
{
lcdwrd(0x30);
}
lcdwrd(0x3d); //顯示等號
a=0;
b=0;
flag=0;
fuhao=0;//全部清除為0
}
break;
}
}
}
void main()
{
lcdinit();
while(1)
{
keyscan();
}
}