久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4951|回復(fù): 7
收起左側(cè)

51單片機(jī)開發(fā)環(huán)境的搭建 由點(diǎn)亮一個(gè)LED引入

[復(fù)制鏈接]
ID:105323 發(fā)表于 2016-3-4 13:51 | 顯示全部樓層 |閱讀模式
第一章 51單片機(jī)環(huán)境的搭建1.1 由點(diǎn)亮一個(gè)LED引入用單片機(jī)來點(diǎn)亮LED,這幾乎是每個(gè)同學(xué)學(xué)習(xí)單片機(jī)的第一個(gè)實(shí)驗(yàn)。那么誰來點(diǎn),怎么亮?注意這里面涉及到兩個(gè)研究對(duì)象,單片機(jī)和LED。要想知道單片機(jī)如何來點(diǎn),先要知道LED為什么亮。這種由分析被控制對(duì)象來研究控制對(duì)象的思路在本教程后面會(huì)反復(fù)用到,這里先提出來亮個(gè)相。我們先來看LED為什么會(huì)亮,也就是說先來了解LED的工作原理。當(dāng)有電流通過時(shí)(達(dá)到一定值比如5mA),LED便會(huì)發(fā)光。至于進(jìn)一步的工作原理我們不去追究,有興趣的可以自己查查,不屬于我們討論的內(nèi)容。根據(jù)這個(gè)原理,我們只需要給LED一端(右邊)接在5V電源下,LED左邊接地,如圖1所示,產(chǎn)生電勢(shì)差,正向?qū)ǎ敲碙ED有電流通過,就發(fā)光了。



圖1 點(diǎn)亮LED,由于電流過高,LED很快熄滅
但是LED會(huì)很快熄滅,為什么?LED正向?qū)〞r(shí),電阻幾乎為0,根據(jù)歐姆定律,電流無窮大,LED很快被燒掉。因此我們需要給這個(gè)電路加個(gè)限流電阻,這個(gè)限流電阻應(yīng)該取多大,這里我們把LED的電阻當(dāng)作0,電壓為5V,電流設(shè)定為5mA(具體的數(shù)值需要看你購買的LED廠家提供的參數(shù)),根據(jù)歐姆定律就能算出限流電阻為1K。這樣LED就能持續(xù)發(fā)光了,如圖2所示。



圖2 串聯(lián)一個(gè)電阻,LED正常發(fā)光
那么LED怎么熄滅呢?沒有電流通過就可以了。如何實(shí)現(xiàn)沒有電流?LED兩邊等電勢(shì)就行了。因此只需要在LED左邊提供一個(gè)高電平5V,LED就熄滅了,如圖3所示


?
圖3 兩邊等電勢(shì),LED熄滅
以上我們完成了對(duì)LED的分析。前面說了,我們要通過分析被控制對(duì)象(LED)來操作控制對(duì)象(MCU).下面再來分析,如何操作控制對(duì)象。首先要知道MCU是什么?根據(jù)定義,MCU是具有一定可編程能力的數(shù)字電路集合體。那么什么叫做可編程呢?通俗的講,就是根據(jù)人給單片機(jī)的不同指令去執(zhí)行不同的任務(wù)。那這樣就好辦了,如下圖所示,LED左邊接在了MCU的P1.0引腳。根據(jù)前面的分析,只要跟MCU講:”把你的P1.0引腳輸出低電平“,(假設(shè)這里我們的單片機(jī)輸出高電平是5V,低電平是0V。因?yàn)橛械膯纹瑱C(jī)高電平為3.3V)。這時(shí)候LED就點(diǎn)亮了,如果輸出高電平,LED就熄滅了,這樣就實(shí)現(xiàn)了單片機(jī)對(duì)LED的控制,如圖4所示。



圖4 單片機(jī)實(shí)現(xiàn)對(duì)LED的控制
你使用人類語言與單片機(jī)交流,單片機(jī)是聽不懂的。因此你對(duì)單片機(jī)發(fā)送的指令無法傳送給單片機(jī)。單片機(jī)只認(rèn)識(shí)0和1.那么我們馬上想到用0和1來和單片機(jī)對(duì)話,這當(dāng)然可以。其實(shí)早期的程序就是直接寫0和1的。可以這樣做對(duì)程序員來說太痛苦了,單片機(jī)是認(rèn)識(shí)了,程序員卻暈倒了。不信的話,你自己在一張A4的紙上填滿0和1,姑且不論什么含義,看著就暈倒了。這樣就產(chǎn)生了一個(gè)問題,用人類語言,單片機(jī)聽不懂,用單片機(jī)的語言,人類使用不方便。因此就各退一步,來個(gè)折中吧。用什么呢,C語言(早期是匯編,我們后面再談)。把人類語言轉(zhuǎn)成C語言,然后再按照一定的規(guī)則把C語言轉(zhuǎn)成機(jī)器語言。前者叫開發(fā)環(huán)境,后者就是我們通常所說的編譯。你完全可以理解為翻譯。編譯出來的結(jié)果就是單片機(jī)認(rèn)識(shí)的機(jī)器指令。那么這個(gè)指令如何傳送給單片機(jī)呢,這個(gè)過程就叫程序燒寫,或者程序下載,燒寫過程中用到的工具就是燒寫器。把機(jī)器指令輸送到單片機(jī),但上電后,單片機(jī)就開始執(zhí)行這個(gè)指令,從而到達(dá)我們控制器件的目的。
這個(gè)例子非常簡(jiǎn)單,但是給出了單片機(jī)開發(fā)的基本流程。首先我們要知道工作器件的原理。工作器件是我們最終的目的,比如控制led,用來照明;溫度傳感器測(cè)量溫度;液晶顯示內(nèi)容等等。單片機(jī)只是達(dá)到最終目的的手段或者途徑。因此用單片機(jī)來控制工作器件,一開始就要理解工作器件是如何工作的。然后在這個(gè)基礎(chǔ)上,根據(jù)工作器件的需要對(duì)單片機(jī)傳遞不同的指令(人類語言)。單片機(jī)是看不懂人類指令的,因此需要翻譯成單片機(jī)看得懂的語言。然后把翻譯的結(jié)構(gòu)傳送給單片機(jī)。
前面羅嗦了這么多,主要是為初學(xué)者講解了單片機(jī)開發(fā)的初步思想以及單片機(jī)開發(fā)環(huán)境的搭建。主要總結(jié)如下兩點(diǎn):1.從被控制對(duì)象入手來研究如何操作控制對(duì)象。所謂被控制對(duì)象其實(shí)就是我們想要使用的外圍工作器件,他可以是LED,也可以是溫度傳感器,步進(jìn)電機(jī)等等,是我們的最終目的,比如讓LED閃爍,測(cè)量溫度,控制轉(zhuǎn)速等等。如何了解他們的工作原理,最好的方式就是閱讀廠家提供的說明資料。對(duì)于控制對(duì)象(單片機(jī)),這個(gè)也很多,51,MSP430,AVR,PIC等等,如何與他們對(duì)話,同樣的道理,查看芯片手冊(cè)(也是官方資料)。這里反復(fù)強(qiáng)調(diào)是因?yàn)榭吹胶芏喑鯇W(xué)者一碰到問題就去網(wǎng)上論壇發(fā)帖求助,殊不知最好的解決問題的方式是去查看官方資料。2.了解這兩個(gè)對(duì)象之間的關(guān)系后,我們就開始搭建單片機(jī)開發(fā)環(huán)境,編寫指令,編譯指令,最后燒寫指令。


回復(fù)

使用道具 舉報(bào)

ID:105323 發(fā)表于 2016-3-4 13:52 | 顯示全部樓層
1. 下載Keil_C51安裝文件和破解工具:http://www.zg4o1577.cn/keil%E4%B8%8B%E8%BD%BD.html

2. 雙擊Keil_C51_v9.02a文件

這里可根據(jù)個(gè)人情況,隨便填寫


然后點(diǎn)擊下一步開始安裝,等待安裝完成。



Keil破解
3. 右鍵點(diǎn)擊keil軟件,選擇以管理員身份運(yùn)行:


點(diǎn)擊File->License Management,復(fù)制CID內(nèi)容,比如在本例中為:CBCDR-IXPAG


4. 解壓破解器Keil_Lic.rar文件,右鍵單擊Keil_Lic.exe,以管理員身份運(yùn)行,將剛才復(fù)制的CID內(nèi)容,粘貼到破解器中的CID框中,如下
   

   點(diǎn)擊Generate生成序列號(hào),并將該序列號(hào)復(fù)制
   

5. 回到Keil中的License Management界面,
   找到New License ID(LIC)輸入框,并將序列號(hào)復(fù)制進(jìn)去,點(diǎn)擊Add LIC



執(zhí)行成功后的界面如下:


這樣Keil軟件就可以使用了
回復(fù)

使用道具 舉報(bào)

ID:105323 發(fā)表于 2016-3-4 13:53 | 顯示全部樓層
本帖最后由 51黑黑黑 于 2016-3-4 13:58 編輯

1.3指令下載/燒寫程序下載STC-ISP:打開http://www.zg4o1577.cn/mcuteach/250.html  在網(wǎng)頁底部下載
將STC-ISP-v4.80.rar文件解壓,即可使用

回復(fù)

使用道具 舉報(bào)

ID:105323 發(fā)表于 2016-3-4 13:54 | 顯示全部樓層
51單片機(jī)環(huán)境的搭建-1.4點(diǎn)亮一個(gè)LED

1.4 點(diǎn)亮一個(gè)LED
在本教程中,我們使用最常見的STC89C52RC-DIP40單片機(jī)作為主控芯片,這也是很多初學(xué)者入門的單片機(jī)。IDE采用Keil軟件,該軟件自帶編譯器,然后通過燒寫器將指令下載到單片機(jī)。
1.4.1 新建一個(gè)keil工程
(1) 雙擊keil軟件


(2) 點(diǎn)擊project->New uvision Project,選擇保存路徑,取一個(gè)工程名字LED



(3)在CPU中選擇Atmel,找到并選擇AT89C52,點(diǎn)擊確定



接下來彈出一個(gè)對(duì)話框,選擇"否"



(5) 點(diǎn)擊"創(chuàng)建一個(gè)空白文件"或者使用ctrl+N(File下面的那個(gè)圖標(biāo))


?然后點(diǎn)擊保存(ctrl+s),文件名為led.c
我們發(fā)現(xiàn)這個(gè)字體比較小,現(xiàn)在我們把它調(diào)大一點(diǎn),
(6) 點(diǎn)擊Edit->Configuration->Color&Fonts


在Window中,選中 8051: Editor C Files, Element中選擇Text,Font中點(diǎn)擊Courier New...



最后把我們新建的這個(gè)文檔添加到工程中,右鍵點(diǎn)擊SourceGroup,



選擇Add Files to Group ''Sources Group...''
找到我們新建的led.c這個(gè)文件,點(diǎn)擊"add",然后關(guān)閉
1.4.2 復(fù)制如下代碼到led.c文件中(編寫指令)

#include
sbit LED = P1^0;
void main(void)
{
       while(1)
       {
               LED=0;
       }
}
至于includereg52.h,sbit等,暫時(shí)不要理會(huì),你把它當(dāng)成固定格式,語法都可以,后面我們會(huì)談到這個(gè)問題。我們這章的重點(diǎn)是把單片機(jī)的開發(fā)環(huán)境搭建起來,暫時(shí)不要扯遠(yuǎn)了

1.4.3 編譯工程(翻譯指令)
(1) 工程設(shè)置 project->Options for Target...


(2) 點(diǎn)擊target,在Xtal中輸入11.0592



(3) 點(diǎn)擊target, 選中create HEXfile



(4) 點(diǎn)擊編譯



1.4.4燒寫程序(傳送指令到單片機(jī))(后面補(bǔ)充)

回復(fù)

使用道具 舉報(bào)

ID:105323 發(fā)表于 2016-3-4 13:56 | 顯示全部樓層
                                                                                                     第二章 初步認(rèn)識(shí)51單片機(jī)





前面我們學(xué)會(huì)了如何操作一個(gè)MCU的管腳(P1.0),讓它設(shè)置為低電平(sbit LED= P1^0;LED=0),那么我們很容易的就能想到如何將MCU的管腳設(shè)置成高電平.這一講,我們就來討論如何控制單片機(jī)的IO口,也就是輸入輸出端口(input and outputport)

2.1單片機(jī)IO口操作與延時(shí)
既然我們學(xué)會(huì)了如何控制P1.0,那么同樣的方式我們就能控制P1.1,P1.2, ...P1.7了。很奇怪,為什么單片機(jī)的引腳從P1.0開始到P1.7,為什么不是從P1.1到P1.8?基本上你所見到的控制芯片都是以0為起始的。我們把P1.0到P1.7叫做P1端口。那么這樣的端口有多少個(gè)呢,在STC89C52中,一共有4組這樣的端口,分別是P0,P1,P2,P3.每個(gè)端口都有8個(gè)管腳,這樣很快,我們應(yīng)該知道操作這4組共32個(gè)管腳了。我相信寫到這里,每個(gè)人都已經(jīng)知道了如何使用這32個(gè)任意一個(gè)管腳來控制LED。
既然我們學(xué)會(huì)了如何控制一個(gè)LED,那么如何控制兩個(gè)LED?很容易的能猜到代碼如下:
#include
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P2^1;
void main(void)
{
    while(1)
        {
           LED1=0;
           LED2=0;
           LED3=0;
        }

}  
通過以上方式我們能用任意的IO端口來點(diǎn)亮LED。這里就不再贅述了。
既然我們學(xué)會(huì)了如何點(diǎn)亮一個(gè)LED,相信熄滅一個(gè)LED也會(huì)了,并且你能很快的寫出代碼:
#include
sbit LED = P1^0;
void main(void)
{
        while(1)
        {
           LED = 0;
           LED = 1;
        }
}
這樣對(duì)不對(duì)?是對(duì)的。LED=0,燈亮了,LED=1燈滅了。程序確實(shí)是沒有問題,LED也是這樣操作的。問題是人的肉眼分辨不出來,為什么呢?這里就涉及到了單片機(jī)的運(yùn)行速度以及人眼的分辨間隔。下面我們來分析從LED=0(亮)到LED=1(滅),中間的間隔是多長(zhǎng)時(shí)間?這個(gè)涉及到單片機(jī)的執(zhí)行速度與時(shí)鐘周期,機(jī)器周期,指令周期相關(guān),我們暫且不討論。現(xiàn)在我們通過keil軟件調(diào)試的方法找到從LED=0到LED=1這個(gè)過程花了多長(zhǎng)時(shí)間。

(1)打開keil軟件,新建一個(gè)工程,并將以上代碼拷入led.c文件



(2) 點(diǎn)擊Project->options for TargetTarget1...



(3) 在彈出的對(duì)話框中選擇target,Xtal選擇11.0592,然后點(diǎn)擊OK



(4) 點(diǎn)擊debug圖標(biāo),紅色方框所示



(5)彈出來的界面比較糟糕,可以自己調(diào)節(jié),如何調(diào)節(jié)?這里舉一個(gè)例子,比如我想移動(dòng)Register這個(gè)窗口,用鼠標(biāo)左鍵點(diǎn)擊Register窗口的標(biāo)題欄(窗口的藍(lán)色部分),按住鼠標(biāo)不松開并拖動(dòng)。



此時(shí)界面如上圖所示,四個(gè)紅色方框內(nèi)的方框表示四個(gè)方向。此時(shí)將鼠標(biāo)不松開繼續(xù)拖動(dòng)到右邊紅色方框中(注意是要把鼠標(biāo)放到方框內(nèi)),結(jié)果如下:



此時(shí)右邊區(qū)域會(huì)變?yōu)樗{(lán)色,該區(qū)域表示Register即將存放的區(qū)域,然后松開鼠標(biāo),拖動(dòng)結(jié)束。
    點(diǎn)擊Register窗口中Autohide圖標(biāo),如下圖紅色方框所示,將Register窗口自動(dòng)隱藏。


其他窗口的調(diào)整方法類似。
(6) 插入斷點(diǎn)。如下圖所示,在紅色方框位置雙擊鼠標(biāo),則自動(dòng)插入斷點(diǎn),并且出現(xiàn)紅色斷點(diǎn)標(biāo)志。


這里我們插入兩個(gè)斷點(diǎn)如圖所示



點(diǎn)擊紅色方框(1)中的RST,然后點(diǎn)擊紅色方框(2)中的run,此時(shí)黃色箭頭會(huì)跳到紅色方框(3)處,記錄紅色方框(4)中的時(shí)間t1=0.00042209s
點(diǎn)擊方框(2)中的run,此時(shí)黃色箭頭會(huì)跳到紅色方框(5)處,記錄紅色方框(4)中的時(shí)間t2=0.00042426s,那么t2-t1=0.00000217s=2.17us,
表示LED從點(diǎn)亮到熄滅只用了2.17微秒,而人眼的最小分辨時(shí)間間隔大約為0.27s(270000微秒),因此感知不到燈的亮滅過程。你可以將這個(gè)程序下載到單片機(jī)中做做實(shí)驗(yàn),你會(huì)發(fā)現(xiàn)LED很暗。事實(shí)上以上程序?qū)?dǎo)致LED循環(huán)亮滅,由于變化時(shí)間太快,幾個(gè)微秒,我們無法感知,因此給人的感覺就是燈很暗。現(xiàn)在我們?nèi)绾卧O(shè)置延時(shí),讓我們能更清楚的觀察燈的亮滅過程?思路很簡(jiǎn)單,讓單片機(jī)點(diǎn)亮LED后,去干點(diǎn)別的事情,然后再熄滅LED。這個(gè)就好比你坐火車時(shí),提前到了一個(gè)小時(shí),你可以看看書,玩玩手機(jī)。目的是坐火車,看書,玩手機(jī)只起到消磨時(shí)間的作用。那么同樣,在本例中,我們讓單片機(jī)干什么事情呢?可以選擇休眠(我們后面講到),或者讓它去數(shù)數(shù)。比如從1數(shù)到10000等等。這種方式就叫做軟件延時(shí)。
#include
sbit LED = P1^0;
void main(void)
{
    unsigned int i;
        while(1)
        {
               LED = 0;              
             for(i=0;i<40000;i++);
              LED =1;
             for(i=0;i<40000;i++);                    
        }                                 
}

將以上代碼復(fù)制到led.c文件中并保存。該段代碼中,通過去做別的事情來達(dá)到延時(shí)的作用。我們?cè)俅握{(diào)試看看LED熄滅和點(diǎn)亮?xí)r間的間隔,設(shè)置斷點(diǎn)如下:



以上可以看出,1.60636393s-0.00042318s大約1.6s,遠(yuǎn)遠(yuǎn)大于人的分辨時(shí)間。
既然我們能控制一個(gè)LED的亮滅了,那么同理可知,我們當(dāng)然知道如何控制并延時(shí)其他LED了,這樣我們就學(xué)會(huì)如何操作單片機(jī)的IO端口以及如何通過軟件延時(shí)了。
下面我們來看看就這兩招能干什么事情?

回復(fù)

使用道具 舉報(bào)

ID:105323 發(fā)表于 2016-3-4 13:57 | 顯示全部樓層
                                                                                                     第二章 初步認(rèn)識(shí)51單片機(jī)-2.2單片機(jī)控制LCD1602液晶顯示模塊





上面學(xué)的兩招,控制IO和延時(shí),在這里要舉的第一個(gè)例子就是LCD1602。LCD1602什么意思,表示一行可以顯示16個(gè)字符,一共有兩行。先來個(gè)LCD1602的簡(jiǎn)單介紹,1602LCD主要技術(shù)參數(shù):
顯示容量:16×2個(gè)字符
芯片工作電壓:4.5—5.5V
工作電流:2.0mA(5.0V)
模塊最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
引腳功能說明
1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表1所示:


第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
第15腳:背光源正極。
第16腳:背光源負(fù)極。
我們來看看如何使用這兩招控制LCD1602液晶模塊。既然是用單片機(jī)控制LCD1602,那么根據(jù)前面的分析思想,首先要搞清楚誰是控制對(duì)象,誰是被控制對(duì)象。很顯然,LCD1602是被控制對(duì)象,那么我們就先從LCD1602開始分析。所謂控制也可以理解為溝通,那么如何與LCD1602溝通呢?可以想一想,平時(shí)人與人是如何溝通的?溝通之前先要打個(gè)招呼吧,比如“你好”之類的,電話里面要先講個(gè)“喂?”,之后才進(jìn)入溝通正題了。其實(shí)單片機(jī)與LCD1602的溝通方式也一樣,“喂?”在這個(gè)例子里面就叫初始化。后面也會(huì)經(jīng)常碰到這個(gè)“初始化”的概念。其實(shí)器件也是人設(shè)計(jì)的,所以他的工作方式從某種程度上講,也是人的溝通方式。打完招呼后,就開始進(jìn)入真正主題了。什么主題呢?LCD1602是顯示模塊,主要作用當(dāng)然是顯示了。那么顯示什么呢?很明顯,顯示內(nèi)容當(dāng)然來自于單片機(jī)了,單片機(jī)讓它顯示什么它就顯示什么。這個(gè)‘顯示什么’就是傳送的數(shù)據(jù)。那么怎么往1602傳送數(shù)據(jù)呢?1602什么意思,表示2行16個(gè)字符,也就是有不同的顯示地點(diǎn),那么如何確定顯示地點(diǎn)呢?因此前面的分析可以總結(jié)為三個(gè)問題,如何初始化,如何傳送顯示的內(nèi)容(顯示什么),在哪里顯示。這三個(gè)問題如何解答呢?當(dāng)然要去看芯片手冊(cè)了。

為了解決這三個(gè)問題,我們先來看看人與人之間是如何溝通的,如果當(dāng)面溝通,你的信號(hào)(聲音)能夠直接傳到對(duì)方,而且能讓對(duì)方聽懂。如果相距比較遠(yuǎn),那么就使用電話等通信工具。前者信號(hào)傳遞載體是空氣,后者是電話線。那么我們來看看MCU與LCD1602的信號(hào)傳遞載體是什么樣的。查看原理圖。因?yàn)槭荕CU與1602之間的溝通,當(dāng)然這里我們只查看與單片機(jī)相連接的部分。



從圖中我們看到,單片機(jī)通過P2.7,P2.6分別與RS,EN連接,P0端口與D0到D7連接,一共10根線。那么也就是說,單片機(jī)的所有指令,數(shù)據(jù)等都是通過這10根線來完成的。怎么樣去控制LCD呢,當(dāng)然是閱讀LCD的說明手冊(cè)。這里來個(gè)比喻,房間內(nèi)一個(gè)人規(guī)定,敲三下門,屋內(nèi)的人才把門打開。如果你要進(jìn)入屋內(nèi),就必須敲三下,如果你不知道這個(gè)規(guī)則,敲了四下,或者大喊大叫,門也開不了。這個(gè)規(guī)定可以是多樣化,比如一共敲兩下,第一下要敲重一點(diǎn),第二下要敲輕一點(diǎn)。或者重敲三下,輕敲一下,等等。而且這里你不需要問為什么,照著做就行了。其實(shí)LCD1602包括后面會(huì)講到的其他模塊同樣如此,你要與它溝通,當(dāng)然必須按照它的規(guī)則來。下面我們就來解讀它的規(guī)則,來解決前面提到的三個(gè)問題,

LCD1602初始化;在哪里顯示;顯示什么。
(1)LCD1602初始化
關(guān)于這一點(diǎn),說明手冊(cè)上已經(jīng)告訴我們了,這里全盤復(fù)制過來。
延時(shí)15ms
寫指令38H
延時(shí)5ms
寫指令38H
寫指令08H
寫指令01H
寫指令06H
寫指令0CH
以上為初始化過程,延時(shí)部分好解決,前面講過了。這里就看如何寫指令了。寫指令這個(gè)過程肯定是通過上圖中10根線來完成的。D0-D7一共八根線應(yīng)該是用來存放指令的內(nèi)容。問題來了,1602怎么知道單片機(jī)給我的是命令還是數(shù)據(jù)。(命令是什么,在哪里顯示,屏幕清零;數(shù)據(jù)是什么,顯示什么內(nèi)容,顯示A還是B)。LCD1602看到RS為高時(shí),就明白了,哦,你要通過P0端口給我數(shù)據(jù)了,于是LCD1602就把這些數(shù)據(jù)拿過來了。看到RS為低時(shí),就知道你要給我指令了。通過這種方式,單片機(jī)能準(zhǔn)確的傳遞指令或者數(shù)據(jù)信息,實(shí)現(xiàn)與LCD1602的溝通。是不是這樣就能讓LCD1602正常執(zhí)行了。不是的。回到我們前面講的那個(gè)例子,這里加個(gè)條件,屋內(nèi)人聽到敲門三下后,判斷暗號(hào)正確了,但是沒有直接開門,而是通知了他的上級(jí),得到上級(jí)的授權(quán)后,才開門。也就是兩個(gè)條件,暗號(hào)正確和上級(jí)授權(quán)。LCD1602也一樣,收到指令沒有立即執(zhí)行,還要等另外一個(gè)信號(hào),就是EN使能信號(hào)。此時(shí)EN給個(gè)一定寬度的脈沖,LCD1602開始執(zhí)行。




時(shí)序圖如上圖所示,這里少了R/W信號(hào),用于控制從LCD1602讀取還是寫入的,為了簡(jiǎn)化過程,在硬件上把R/W接地了,也就是只能寫不能讀。同時(shí),讀忙信號(hào)也不能操作,這里采用延時(shí)的方法替代。根據(jù)前面的分析很容易的寫出寫指令的代碼:
?void write_com(unsigned charmycmd)
{
  delayMs(5);//注意這里需要延時(shí)5ms比較保險(xiǎn) 代替判斷忙信號(hào)
  P0=mycmd;       //準(zhǔn)備好指令
  RS=0;        //告訴LCD1602,P0中放的是指令不是數(shù)據(jù)
  EN=1;
  delayUs(5); //根據(jù)時(shí)序圖,脈沖要有一定寬度
  EN=0;         //使指令有效,開始執(zhí)行
}
同樣的道理,以上代碼中,只需改一下RS信號(hào)為1,就是寫數(shù)據(jù)的代碼了

void write_com(unsigned char mydata)
{
  delayMs(5);//注意這里需要延時(shí)5ms比較保險(xiǎn) 代替判斷忙信號(hào)
  P0=mycmd;       //準(zhǔn)備好指令
  RS=1;        //告訴LCD1602,P0中放的是數(shù)據(jù)不是指令
  EN=1;
  delayUs(5); //根據(jù)時(shí)序圖,脈沖要有一定寬度
  EN=0;         //使指令有效,開始執(zhí)行
}
講到這里,LCD1602初始化代碼應(yīng)該能寫出了。同時(shí)我們也已經(jīng)寫出了傳遞指令的代碼,那么現(xiàn)在我們只要知道指令內(nèi)容就可以了。
1602LCD的指令說明及時(shí)序
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2所示:



1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。(說明:1為高電平、0為低電平)
指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。
指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。
指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。
指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。
指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F:低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。
指令7:字符發(fā)生器RAM地址設(shè)置。
指令8:DDRAM地址設(shè)置。
指令9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。
指令10:寫數(shù)據(jù)。
指令11:讀數(shù)據(jù)。
你需要給LCD1602什么指令,只需要傳遞給void write_com(unsignedcharmycmd)函數(shù)中的mycmd參數(shù)就行了。
(2)在哪里顯示
知道了這個(gè),現(xiàn)在我們就能解決前面提到的第二個(gè)問題,在哪里顯示,


例如第二行第一個(gè)字符的地址是40H,那么是不是它的地址就是40H了。注意表2中第8條數(shù)據(jù)存儲(chǔ)地址,D7已經(jīng)被寫死了。最終的顯示地址是40H+10000000B,因此我們只要把這個(gè)值傳給mycom,LCD1602就知道在第二行第一個(gè)位置顯示了。
(3)顯示什么
前面講了,如果傳送數(shù)據(jù)就是要顯示的內(nèi)容。比如我要顯示字母A,怎么操作呢。


以上圖中可以知道,如果你要顯示A,那么數(shù)據(jù)的高位為0100,低位為0001,因此為01000001。把這個(gè)數(shù)據(jù)傳送給LCD1602,它就知道要顯示A了。
現(xiàn)在回過頭來看看,我們?cè)谑褂脝纹瑱C(jī)控制LCD1602這個(gè)過程中用到了單片機(jī)的哪些知識(shí)。回去看看圖1,10根連接線,P2.6和P2.7引腳,再加上P0端口,主要是通過P2.6和P2.7高低變化來發(fā)出指令或數(shù)據(jù),P0的變化反映指令或數(shù)據(jù)的內(nèi)容。可見,這個(gè)過程中我們只用到了IO口控制和延時(shí)。其他很長(zhǎng)的部分我們用在理解1602的使用規(guī)則了。注意這里是使用規(guī)則,談不上原理。比如你給LCD1602發(fā)送清屏指令時(shí),你明白LCD1602收到這個(gè)指令是如何操作清屏的嗎?不知道,也沒有必要知道。液晶模塊說明書也不告訴你。好比你使用手機(jī)時(shí),你點(diǎn)擊一下某個(gè)應(yīng)用程序就打開了,然后按照它的規(guī)則去使用就行了,比如聽歌,上網(wǎng)等等,你不用關(guān)心它們是怎么實(shí)現(xiàn)的。其實(shí)手機(jī)也是個(gè)模塊,我們只要學(xué)會(huì)操作就行了,不管它里面發(fā)生了什么事情。
附參考代碼如下:
#include
void LCD_init(void);
void delayUs(unsigned char t);
void delayMs(unsigned char t);
void write_com(unsigned char mycmd);
void write_data(unsigned char mydata);
sbit RS=P2^7;
sbit EN=P2^6;
void main (void)
{

       LCD_init();      
       write_com(0x0f);
       write_data(0x41);
       while(1);
}
void LCD_init(void)
{
delayMs(15);
write_com(0x38);
delayMs(5);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void delayUs(unsigned char t)
{
       while(--t);
}
void delayMs(unsigned char t)
{
       while(--t)
       {
              delayUs(245);
              delayUs(245);
       }
}
void write_com(unsigned char mycmd)
{
  delayMs(5);//注意這里需要延時(shí)5ms比較保險(xiǎn)代替判斷忙信號(hào)
  P0=mycmd;      //準(zhǔn)備好指令
  RS=0;       //告訴LCD1602,P0中放的是指令不是數(shù)據(jù)
  EN=1;
  delayUs(5); //根據(jù)時(shí)序圖,脈沖要有一定寬度
  EN=0;         //使指令有效,開始執(zhí)行
}              
void write_data(unsigned char mydata)
{
  delayMs(5);//注意這里需要延時(shí)5ms比較保險(xiǎn)
  P0=mydata;
  RS=1;
  EN=1;
  delayUs(5);
  EN=0;
}

回復(fù)

使用道具 舉報(bào)

ID:279302 發(fā)表于 2018-1-26 16:05 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人精品久久久国产成人一区 | 99久久夜色精品国产亚洲96 | 亚洲日韩中文字幕一区 | 国产精品视频一区二区三区不卡 | 盗摄精品av一区二区三区 | 精品视频在线播放 | 精品一区二区三区在线观看 | 国产成人久久精品一区二区三区 | 青青草视频免费观看 | 夜夜撸av| 午夜爱爱毛片xxxx视频免费看 | 午夜三区 | 欧美精品福利视频 | 国产一区二区三区四区五区加勒比 | 成人羞羞国产免费视频 | 日韩国产免费 | 久国产| 国产精品久久久久久久免费大片 | 亚洲精品9999 | 亚洲国产精品一区二区三区 | 一区二区av | 成人国产精品免费观看 | 日韩欧美国产一区二区 | 美女久久视频 | 国产精品久久久久一区二区三区 | 久久久精品影院 | 在线激情视频 | 亚洲精品一| 欧美色综合一区二区三区 | 久久久久九九九女人毛片 | 久色| 久久这里只有精品首页 | 亚洲成人毛片 | 中文字幕在线观看视频网站 | 欧美一区视频 | 一区二区高清 | 91久久精品一区二区二区 | 91久久精品日日躁夜夜躁国产 | 欧美a v在线| 久久精品国产免费 | 一区二区三区播放 |