A. 手把手教你學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
B. 零基礎怎麼學單片機
可以的,單片機不難,先學C語言,英語常用的單詞認識就行,一般都可以用翻譯軟體。0基礎建議先學51
C. 51單片機流水燈實驗(我用的是手把手教你學單片機的教程)
呵呵,這個延時有點長哦,有10S,你耐心再看看,有沒有變化,如果再沒變化,你可以軟體模擬一下那個i變數。看他是不是能加到10000,。還有,學51單片機的話建議你去學 郭天祥十天學會51單片機 那個很不錯。希望採納
D. 看金沙灘的手把手學單片機有一個問題,編程步進電機的轉動與反轉的代碼疑惑
1.在正轉和反轉里分別有index++和index--兩條語句
而下面有tmp = tmp | BeatCode[index];這一條語句
隨著index的加1或減1便可出現像tmp = tmp | BeatCode[0]、tmp = tmp | BeatCode[1]的正序或tmp = tmp | BeatCode[7]、tmp = tmp | BeatCode[6];這樣的倒序
2.這里的tmp是一個進行運算的中間變數,如果你直接使用P1來進行運算,1運算的一些中間結果將會直接輸出到P1口對外設產生影響,2外設的輸入信號也會影響到運算過程。所以這里先將P1給了tmp,然後用tmp運算,再將運算結果送給P1
E. 手把手教你學會單片機,宋雪松老師的簡易計算器,怎麼用普中科技單片機實現怎麼接線
/* 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();
}
}
F. 單片機教程
王雲 51單片機教程,就很好,身邊很多同學在用。
G. 手把手教你學單片機的圖書簡介
本書以實際編程及做實驗為主線貫穿全書。完全摒棄教科書的方法,採用「程序完成後軟體模擬→單片機燒錄程序→試驗板通電實驗」的方法,以全新的方式邊學邊實驗,將初學者領進單片機世界的大門。隨書所附的光碟中提供了一些工具軟體以及本書所有的實驗程序文件,在學習、實驗時可參考。
H. 手把手教你學51單片機
這個我還是很有發言權的,因為我可謂搞單片機的「革命先烈」。要自學單片機最好先從51單片機開始入門,市面上有很多教程,我推薦去凡億課程看下,比較詳細。 網路裡面也有詳細介紹。