1 17個實驗學會單片機_第1頁
1 17個實驗學會單片機_第2頁
1 17個實驗學會單片機_第3頁
1 17個實驗學會單片機_第4頁
1 17個實驗學會單片機_第5頁
已閱讀5頁,還剩496頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

17個實驗學會單片基于本17個實驗學會單片基于本人學習單片機的痛苦經歷,特編寫本教程以此獻給廣的單片機初學者,希望您能從中受作者提本教程乃最通俗易懂之單片機教材,如果您還是看不懂請千萬不要足此行,以免誤入歧途,耽誤您的前程*V*目第一章:單片機基礎知基礎知識(第一部分什么是單片-單片機標號信息及封裝類/單片機能做什單片機標號信息及封裝類/單片機能做什如何開始學習單片基礎知識(第二部分單片機引腳介什么是二進什么是十六進邏輯運算位與字節(jié)的概C51數(shù)據類型擴充定C51中的運算C515個基礎語第二章:單片17個實初級第一個實驗:keil軟件使用與點亮人生的第一只發(fā)光二極/-第三個實驗:一個數(shù)碼管顯示0-F/第三個實驗:一個數(shù)碼管顯示0-F/高級第九個實驗:ADled輸出應第十個實驗:AD1602顯示應第十一個實驗:24c02的應第十二個實驗:1302的應第十四個實驗:定時器中斷的紅綠燈應用/第十五個實驗:串口中斷單個字符發(fā)送/第十六個實驗:串口中斷多個字符發(fā)送/第十七個實驗:12864的應-實驗前預熱:基礎必備什么是單片很實驗前預熱:基礎必備什么是單片很多初學者在剛開始接觸單片機的時候不清楚究竟什么是單機。用專業(yè)語言講,單片機就是在一塊硅片上集成了微處理器、存器及各種輸入輸出接口的芯片,這樣一塊芯片就具有了計算機的屬性因而被稱為單片微型計算機,簡稱單片機??吹竭@里大家可能更加口呢如果本教程也按照傳統(tǒng)書籍一樣,一上來就是滿篇專業(yè)術語,讓大看得暈頭轉向,打擊了單片機初學者的信心,那便失去了我寫本教我將適時地為大家解釋稍復雜的概念及專業(yè)知識點,在大家對單片各個知識點循序漸進掌握的過程中,即使是專業(yè)語言也將成為通俗言了-接下來我們就用最通俗的語言給出接下來我們就用最通俗的語言給出單片機的定義。單片機就一塊集成芯片,但這塊集成芯片具有一些特殊的功能,而它的功能實現(xiàn)要靠我們使用者自己來編程完成。我們編程的目的就是控制這芯片的各個引腳在不同時間輸出不同的電平(高電平或低電平,關電平在后面會講到進而控制與單片機各個引腳相連接的外圍電的電氣狀態(tài)編程時我們可以選擇用C語言或匯編語言,根據我多年的編程經驗建議大家直接選用C語言編程,即使讀者對匯編語言一點不了解也會影響大家掌握單片機,反而在學習進度上比先學匯編語言編程要得多,還有一點好處就是不同單片機廠商的匯編語言是不同的,這起來也比較麻煩,而學C語言就可以編程不同廠商的單片機程序,也是C語言通用神奇的特別之處-單片機標號信息及封裝在本教程一單片機標號信息及封裝在本教程一開始,我們首先對單片機芯片名稱及其文字標識做個全面的了解,本書主要講解的是目前國內外用的比較多的以51商比較多,大家千萬不要只見了前用的比較多AT89C51單片機才生產各種單識這是51單片機,世界上不同國家的很多芯片廠51單片機芯片廠商產品列-由于廠商及芯片型號太多,由于廠商及芯片型號太多,我們不能一一舉出,以上所提到的不同商的單片機都是Atmel公司的AT89C51擴展出來的單片機,(原版和模仿版的區(qū)別也就是說只要學會51單片機的操作,這些片機便全部都會操作了,堅持學完本教程你將學會操作所有的單片機關于芯片上的標號我們舉1個例子說明,其他廠商大同小異。若還不明之處,請大家上網搜索。以下STC單片機為例(臺灣公司生的- 40I- 40I-STC89C51RC-其標識分別解釋如下-STC——前綴,表示芯片為STC公司生產的產STC——前綴,表示芯片為STC公司生產的產品8——表示該芯片為8051內核芯片9——表示內部含F(xiàn)lashE2PROM存儲器。還有80C51O表示內存儲器(紫外線可擦ROM(了解即可C——表示該器件為CMOS產品。還有89LV5289LE58LVLE都表示該芯片為低電壓產品(通常為3.3V電壓供電89S525——單片機固定不變2——表示該芯片內部程序存儲空間的大小,1為4KB,2為為12KB,即該數(shù)乘上4KB就是該芯片內部的程序存儲空間大小。序空間大小決定了一個芯片所能裝入執(zhí)行代碼的多少。一般來說,己硬件設備實現(xiàn)功能所需代碼的大小來選擇價格合適的芯片,只要序能裝得下,同類芯片的不同型號不會影響其功能-RC-STC單片機內部RAM(隨機讀寫存儲器)RC-STC單片機內部RAM(隨機讀寫存儲器)512B。還有如RD+示內部RAM1280B40——表示芯片外部晶振最高可接入40MHz。對AT單片機數(shù)值一24,表示其外部晶振最高為24MHzC——產品級別,表示芯片使用溫度范圍。C表示商業(yè)級,溫度范為O℃~+70℃PDIP——產品封裝型號。PDIP表示雙列直插式1325h4w378——不詳(有關資料顯示,此標號表示芯片制造工藝處理工藝知識點:常用芯片封裝1.DIP(DualIn-linePackage)雙列直插式封DIP是指采用雙列直插形式封裝的集成電路芯片,絕大多數(shù)中小規(guī)集成電路(IC)均采用這種封裝形式,其引腳數(shù)一般不超過100個。DIP封裝的CPU芯片有兩排引腳,需要插入到具有DIP結構的芯插座上。當然,也可以直接插在有相同焊孔數(shù)和幾何排列的電路板進行焊接,如下圖所示-2.PQFP帶引線2.PQFP帶引線的塑料芯片封PQFP指帶引線的塑料芯片封裝載體,它是表面貼型封裝之一,形呈正方形,引腳從封裝的四個側面引出,并延伸,是塑料制品,-技術在PCB上安裝布線,具有技術在PCB上安裝布線,具有外形尺寸小、可靠性高的優(yōu)點,如下所示單片機能做什單片機是一種可通過編程控制的微處理器,單片機芯片自身不單獨運用于某項工程或產品上,它必須要靠外圍數(shù)字器件或模擬器的協(xié)調才可發(fā)揮其自身的強大功能,所以我們在學習單片機知識的時不能僅僅學習單片機的一種芯片,還要循序漸進地學習它外圍的-①工業(yè)自動化。如數(shù)據采集、測控技術②智能儀器儀表。如數(shù)字示波器、數(shù)字信號源、數(shù)字萬用表、感應流表等③消費類電子產品。如洗衣機、電冰箱、空調機、電視機、微波爐IC卡、汽車電子設備等④通信方面。如調制解調器、程控交換技術、手機、小靈通等⑤武器裝備。如飛機、軍艦、坦克、導彈、航天飛機、魚雷制導、能武器等這些電子器件內部無一不用到單片機,而且大多數(shù)電器內部的主控片就是由一塊單片機來控制的,可以說,凡是與控制或簡單計算有的電子設備都可以用單片機來實現(xiàn),當然需要根據實際情況選擇不性能的單片機,如atmel、stc、pic、avr、凌陽、C8051及ARM等因此,所學專業(yè)為自動化或與電子有關的理工科大學生,掌握單片是最簡單和基本的要求如果大學四年,甚至七年、八年,你連單片機的知識都沒有掌握,別提更高級的CPLD,F(xiàn)PGA,DSP,ARM技術了,沒有單片機知識-基本的支撐,學其他內容更是難于上青天基本的支撐,學其他內容更是難于上青天如何開始學習單片很多單片機初學者問我的第一句話都是:怎樣才能學好單片機?天,我就結合我自己是如何開始學習單片機的,如何開始上手,又何開始熟練等話題與大家分享。我們現(xiàn)在用的比較多的是8051單機,它的資料比較全,用的人也較多,市場也很大,51單片機內結構簡單,非常適合初學者學習,建議初學者將51單片機作為入級芯片單片機屬于硬件,我強烈反對大家只靠看書學習單片機,我可以親自操作它,才會有深刻的體會,也才能掌握它單片機這門課是非常重視動手實踐的,不能總是看書,但是也不能全不看書,我們需要從書中大概了解一下單片機的各個功能寄存器如果看的多了反而容易搞亂,尤其是現(xiàn)在市場上大多數(shù)講單片機的一開始就講解較復雜的內存、地址、存儲器,更讓初學者感到不知云、難以入門-簡單地說,當我們使用單片機時,實際上就是用簡單地說,當我們使用單片機時,實際上就是用我們自己編寫的軟去控制單片機的各個功能寄存器。再簡單些,就是控制單片機哪些腳的電平什么時候輸出高,什么時候輸出低,由這些高、低變化的平來控制外圍電路,實現(xiàn)我們需要的各種功能,還有并不需要想的片機看似那么復雜,因為它認知的東西只有10關于看書,大家只需大概了解單片機各引腳的功能,簡單了解寄器。第一次、第二次你可能看不明白,但這不要緊,因為還缺少實的感觀認識。所以我總是說,學單片機看書看兩三天就夠了,而我要把更多的時間放到實踐中去,這才是最關鍵的,在實踐過程有懂之處再查書,這樣記憶才深刻關于實踐,有兩種方法建議讀者選擇方法一你自己花錢買一塊單片機的學習板,不要求那種價格上千塊、功能別全的,對于初學者來說你買功能太全的板子,上面有很多東西你和D/A、液晶、蜂鳴器、I2C總線,有USB擴展也最好,這些就差多了,如果我上面提到的這些功能你能熟練應用,可以說對單片機操作你已經入門了,剩下的就是自己練習設計外圍電路,不斷地積-經驗。只要過了第一關,后面的路就好走經驗。只要過了第一關,后面的路就好走多了,萬事開頭難,大家聽說過方法二你身邊如果有單片機方面的高手,向他求助,讓他幫你搭個簡單的小系統(tǒng)板。對于高手來說,做個單片機的最小系統(tǒng)板可能只需要幾鐘的時間.而對于初學者可就難多了,因為只有對硬件徹底了解了你才能熟練地駕馭它。而如果你身邊沒有這樣的高手,又找不到可幫助你的人,那我勸你還是選擇方法一,畢竟自己有一塊學習板要便得多,以后做單片機類的小實驗時經常都能用得上,省時又省事有了單片機學習板之后你就要多練習,最好自己有臺計算機(少影,少打游戲把學習板和計算機連好,打開調試軟件坐在計算前,先學會怎么用調試軟件,然后從最簡單的流水燈實驗做起,等能讓8個流水燈按照你的意愿隨意流動時,你已經入門了你會發(fā)現(xiàn),單片機是多么迷人的東西啊,太好玩了,這不是在學習識,而是在玩,比起跑跑卡丁車,玩玩魔獸世界,要有趣得多。當編寫的程序按你的意愿實現(xiàn)時,你比做任何事都開心,你會上癮的-真的,做電子設計的人真的會上癮。然后你讓數(shù)真的,做電子設計的人真的會上癮。然后你讓數(shù)碼管亮起來,這兩會了以后,你已經不能自拔了就是要這樣練習,在寫程序的時候你肯定會遇到很多問題,而這時再去翻書找答案,或是請教別人,或是上網搜索。當?shù)玫浇獯鸷竽阌浰惠呑?,知識必須應用于現(xiàn)實生活中,解決實際問題,這樣才發(fā)揮它的作用,你自己好好想想,上了這么多年大學,天天上課,在課堂上學到了什么?是不是為了期末考試而忙碌呢?考完得了分,哈哈哈,好高興啊,過一個假期,甚至過一個周末,然后忘得干二凈,是不是?你學到什么了?但是我告訴你單片機一旦學會,遠不會忘了另外,我再說說關于用匯編語言還是C語言編程的問題。很多校大一、大二就開設了C語言課,我也上過,我知道那時上課老師的就是幾乘幾、幾加幾、求階乘、畫星星什么的。學完了有什么用雖然考試我考了90分,可我心里比誰都明白,C語言到底是什么它有什么用?到底它能做什么?我還是一無所知。我們不能過多地價當今的高校教育,但我們必須對自己負責讓你用C語言編單片機的程序時,你是不是就傻了?單片機編程用語言或匯編語言都可以,但是我建議用C語言比較好,如果原來有語言的基礎那學起來會更好,如果沒有,也可以邊學單片機邊C-言C語言很簡單的,因為它只是一種工具言C語言很簡單的,因為它只是一種工具而已,我勸大家最好能學好精它,將來肯定用得著,要不然以后也得學,你一點匯編語言部不根本無所謂,但你一點C語言都不會那你將來會吃苦頭。給大家推譚浩強編寫的《C程序設計》,大家在學習本書的同時再參考上面到的這本書更有利于C語言學習,但根本沒必要再從頭把《C程序計》學一遍,就算再學一遍也許結果還是和你現(xiàn)在一樣,最好的辦就是用到哪里學到哪里匯編語言寫程序代碼效率高,但相對難度較大,而且很煩瑣,尤其遇到算法方面的問題時,麻煩得不得了,現(xiàn)在單片機的主頻在不斷高,我們完全不需要那么高效率的代碼,因為有高頻率的時鐘,單機的ROM空間也在不斷提高,足夠裝下你用C語言編寫的任何代碼C語言的資料又多又好找,將來可移植性非常好,所以我勸大家用語言編程總結上面,只要你有信心,做事能堅持到底,有不成功絕不放棄堅強意志,學會單片機對你來說就是件非常容易的事建議學習步驟如下-①看書大概了解一下單片機結構,①看書大概了解一下單片機結構,大概了解就行,不用都看懂,又讓你出書②用學習板練習編寫程序。學習單片機主要就是練習編寫程序,遇不會的再問人或查書③自己在網上找些小電路類的資料,練習設計外圍電路,焊好后自調試,熟悉過程④自己獨立設計具有個人風格的電路、產品你已經是高手了下面二組圖是51單片機芯片不同封裝的引腳圖和實物圖,其中標NC的是不連接(NoConnect)的意思。當大家首次看見這些引腳時,定會有又多又亂的感覺,而且難以記憶。千萬不要著急,對于初學-----在講解各個引腳含義之前,我在講解各個引腳含義之前,我們首先應該學會如何在實物上區(qū)分腳序號,基于8051內核的單片機,若引腳數(shù)相同,或是封裝相同它們的引腳功能是相通的,其中用的較多的是40DIP封裝51片機,也有20,28,32,44等不同引腳數(shù)的51單片機,這些大家要了解,不能只見了40腳的芯片才認為它是51單片機單片機引腳介無論哪種芯片,單片機也好,其他不知名的芯片也好,當我們觀它的表面時,大都會找到一個凹進去的小圓坑,或是用顏色標識的個小標記(圓點或三角或其他小圖形這個小圓坑或是小標記所應的引腳就是這個芯片的第1引腳,然后逆時針方向數(shù)下去1最后一個引腳我們現(xiàn)在查看上面三組圖中DIP封裝的單片機,在左上角有一個小-坑,并且下面還坑,并且下面還有一個白色小三角,那它的左邊對應的引腳即為此片機的第1引腳,逆時針數(shù)依次2,3,…,40DIP引腳順序圖-對于PQFP封裝的對于PQFP封裝的小圓坑在左下角,在實際焊接或是繪制電路板時大家務必要注意它們的引腳標號,否則,若焊接錨誤,那完成的作足絕對不可能正常工作的-PQFP引腳順序圖接下PQFP引腳順序圖接下來我們以圖DIP封裝引腳圖為例介紹單片機各個引腳的功能個引腳我們按其功能類別將它們分成三類①電源和時鐘引腳。如Vcc、GND、XTAL1、XTAL2(需掌握編程控制引腳。如RST、PSEN、ALE/PROG、EA/VPP(了解即可③I/O口引腳。如PO、P1、P2、P3,48I/O口(需掌握-引腳介紹VCC(40引腳介紹VCC(40腳、GND(20腳)——單片機電源引腳,不同型號單片接入對應電壓電源,正常工作使用電壓為(常壓)+5V,最低能正工作使用電壓為(低壓)+3.3V,大家在使用時要查看其芯片對應檔-XTAL1(19腳、XTAL2(18腳XTAL1(19腳、XTAL2(18腳)——外接時鐘引腳。XTALI為片內蕩電路的輸入端,XTAL2為片內振蕩電路的輸出端。8051的時鐘有種方式,一種是片內時鐘振蕩方式,需在這兩個腳外接石英晶體和;XTALI接地,外部時鐘信號從XTAL2腳輸入第一種方式示意圖(并且是最常用的方式RST(9腳)——單片機的復位引腳。當輸入連續(xù)兩個機器周期以高電平時為有效,用來完成單片機的復位初始化操作,復位后程序數(shù)器PC=0000H,即復位后將從程序存儲器的0000H蓽元讀取第一-指令碼,通俗地講,就是單片機從頭指令碼,通俗地講,就是單片機從頭開始執(zhí)行程序PSEN(29腳)——全稱是程序存儲器允許輸出控制端。在讀外部序存儲器時PSEN低電平有效,以實現(xiàn)外部程序存儲器單元的讀操作由于現(xiàn)在我們使用的單片機內部已經有足夠大的ROM,所以幾乎有人再去擴展外部ROM,因此這個引腳大家只需了解即可在線路板的應用上是空腳(下圖29腳不接任何電平,默認讀取部程序存儲器,圖中紅色指針頭所接的是插座的引腳,供有需要的運用ALE/PROG(30腳)——在單片機擴展外RAM時,ALE用于控制PO口的輸出低8位地址送鎖存器鎖存起來,以實現(xiàn)低位地址和數(shù)的隔離,現(xiàn)在的單片機內部都已經帶有豐富的RAM,所以也不需-再擴展RAM了,因此ALE/PROG這再擴展RAM了,因此ALE/PROG這個引腳的用處已經不太大在線路板的運用上也是空腳。(下圖30腳不接任何電平EANPP(31腳)——EA接高電平時,單片機讀取內部程序存儲器有ROM的,所以在使用8031單片機時,這個引腳是一直接低電平的因為上面這兩種單片機已經是接近淘汰產品,現(xiàn)在我們用的51單機都有內部ROM,所以在設計電路時此引腳始終接高電平-(也是我們所說的(也是我們所說的電平I/O口引腳-PO口、P1口、P2口P3口51單片機P0口內部沒有上拉電阻,為高阻狀態(tài),所以不能正常地出高/低電平,因此該組I/O口在使用時務必要外接上拉電阻,一我們選擇接入10K的上拉電阻下面圖我們不需要理會它的內部細節(jié)結構,因為研究起來也沒有什意義,展示下面這兩個圖片只是想讓你明白為什么P0口需要外接拉電阻(意思就是VCCP0口之間連接一個電阻為什么要接這東西?最簡單的理解就是供電,而P1口不需要接上拉電阻--從圖片中的紅色指針頭可以看到很從圖片中的紅色指針頭可以看到很明顯的對比,單片機P0里面是有接上拉電阻的,P1口有內部上拉電阻,如果不接上拉電阻就會致工作不正常,所以在實際的線路板運用中,就會有下面的電路10K的電阻(上拉電阻帶上拉電阻之所以稱它為“準雙向”是因為該口在作為輸入使用前,要先向該進行寫1(意思就是設置為高電平)操作,然后單片機內部才可正讀出外部信號,也就是要使其先有個“準”備的過程,所以才稱為雙向口-如下圖,SY-1線路板P1如下圖,SY-1線路板P1口接有8盞流水燈,5V電源+限流電阻發(fā)光二極管。當P1口的任意一個口為低電平(0V)時,相應的二管就會亮,高電平(5V)時就不亮或許有些朋友還有疑問,上面說過單片P1口里面不是有上拉電嗎?為什么這樣還有加?是的,上面這個圖片也可以當上拉電阻用這種方式也可以用在P0口-再看看下面圖片的二再看看下面圖片的二極管接法,和上面接法倒轉過來,現(xiàn)在P0口要上拉電阻,發(fā)光二極管才會亮,而P1口因為單片機里面有,就需要上拉電阻也正常發(fā)光,就是這個區(qū)別P2(21腳~28腳)——準雙向8I/O口,每個口可獨立控制內帶上拉電阻,與P1口差不多-P3口(10腳~17腳)——P3口(10腳~17腳)——準雙8I/O口,每個口可獨立控制內帶上拉電阻P3口共兩種功能2作為第二功能使用時,各引腳的定義第二功能簡單解說RXD(P3.0)串行輸入,TXD(P3.1)串行輸出這兩個口是用于電腦上編寫好的程序往單片機燒寫的接口。一個入口一個出口,入口就是電腦上的程序進入單片機存儲器,出口就是單機和電腦交流當中,單片機要告訴電腦它的內部動作,以便在交流程中可以順利交談(編程-如下圖所示上面USB就是用如下圖所示上面USB就是用線連接到電腦USB口的接口很顯然,雖然電腦和單片機之間可以交流,但是直接交流遇到了語不通的問題,現(xiàn)在CH340T上面電路是CH341T,這兩個IC一樣功能扮演了翻譯師的功能,CH340T把電腦格式的程序轉換成單片機格的程序,輸入到單片機?;蛘逤H340T把單片機格式的程序轉換成腦格式的程序,輸入到電腦,為單片機和電腦交流之間連接一個交橋梁,為社會做出了重大貢獻INT0(P3.2)外部中段0,INT1(P3.3)外部中斷-INT0(P3.2)外部中段Int就是下INT0(P3.2)外部中段Int就是下面圖片的英文單詞縮寫外部中斷是什么意思呢舉個生活中的例子,比如你現(xiàn)在在做作業(yè)(正常工作突然門鈴了(中斷,你肯定要停止當前的作業(yè),去處理中斷的事(開門看是誰原來是快遞哥寄快遞,當處理完中斷的事情后,你又恢復正常做作業(yè)的狀態(tài)概括起來就是二件事情,一件是正常工作,一件是中斷工作,中斷理完畢后,又恢復到正常工作,這就是中斷的概念我們來看看單片機的中斷電路圖片-上面INT0和INT1各連接了一個上面INT0和INT1各連接了一個開關,INT0上面的“——”就是指電平有效,就是說,比如SW1開關打下接通時(相當于INT0引腳地(GND單片機自動停止當前工作,馬上進入INT0中斷程序你就理解了,因為是一樣的0,T1(1,WR(,RD(這四個當中,T0,和T1有時候還用,WR和RD就沒有怎么用過學習到的時候再詳細講解吧-單片機是一種數(shù)字集成芯片,數(shù)字電路中單片機是一種數(shù)字集成芯片,數(shù)字電路中只有兩種電平:高電平和電平。其中單片機用到的高電平為+5V,低電平為0V什么是二進數(shù)字電路中只有兩種電平特性,即高電平和低電平,這也就決定了字電路中使用二進制。十進制數(shù)大家應該都不陌生,“逢十進一,一當十”是十進制數(shù)的特點。有了十進制數(shù)的基礎,我們學習二進進制數(shù)1轉換為二進制數(shù)是1B(B是表示二進制數(shù)的后綴進制數(shù)2轉換為二進制數(shù)時,因為已經到2,所以需要進1,那么進制數(shù)即為10B;十進制數(shù)5轉換為二進制數(shù),210B,那么3即10B+1B=11B,4即為11B+1B=100B,5即為100B+1B=101B。依次推詳情看下圖對應表-從圖片對應表可以看到,當你想要什么從圖片對應表可以看到,當你想要什么數(shù)的時候,直接把他們相加可以。比如你想要十進制數(shù)129,那么就是128+1,對應的二進制是0001理解是吧!相當年,我讀書的時候,我們也是把32,64,128這樣背了下來但是,值得慶幸的是,當你大概了解這些十,二進制的規(guī)律之后,本就不用你背,因為有計算機的出來,大大地方便了人們處理算術題如下面十進制129-轉換成二進制感興趣的朋友轉換成二進制感興趣的朋友可以打開電腦上計算器,嘗試換算一下什么是十六進十六進制數(shù)分別為0~9,A,B,C,D,E,F(xiàn),即十進制的10對應六進制的A,11對應B,12對應C,13對應D,14對應E,15對應F我們一般在十六進制數(shù)的最后面加上后綴H,表示該數(shù)為十六進制數(shù)如AH,DEH等。這里的后綴字母不區(qū)分大小寫-0xa00xde表示該數(shù)為十六進制數(shù)在以后的單片機C語言編程當中,我們要大量使用十六進制因為單片機(或者數(shù)字產品)只懂10,而我們使用那么多1來編程,肯定不方便記憶和工作,而二進制轉換成十進制又覺得編計算時麻煩,這就有16進制的出來。這是什么意思呢我們來看看下圖然后得到16進制數(shù)。如上面的二進制是1111,8421全部相加-得到一16進制數(shù)F不難看出得到一16進制數(shù)F不難看出,以4個位的二進制為一組,通過簡單上就可以得到一個16進制數(shù),并且不論你的二進制數(shù)有多長如16位二進制數(shù)1001又長又麻煩,通碼,轉換成16進制數(shù)等于0xfa59,這樣就簡潔多了不知道你還記不記得上面說的,51單片機的一個口,只有8位-11,d8這盞燈不就是亮了看似這樣很容易明白的道理,其實都是某些人刻意研究出來的。數(shù)產品懂二進制代碼,我們覺得太長不好記憶。二,十進制人腦計算不方便,這就有了十六進制的出現(xiàn)十,二,十六進制轉換表-邏輯運算與(乘法“與邏輯運算與(乘法“與”運算是實現(xiàn)“必須都有,否則就沒有”這種邏輯關系的一種算。C語言中運算符為“&其運算規(guī)則如下表達符號如下-在C語言中“&”還有一種“按在C語言中“&”還有一種“按位與”的功能,意思是變量之間按進制數(shù)對應關系一一進行“與”運算如從這不難看出,&有兩種功能,一種是單個位與,一種是按位與這個就是乘,用到的時候再講解或(加法C語言中運算符為“|-其運算規(guī)則如下單個位或0|0=0其運算規(guī)則如下單個位或0|0=0,0|1=1,1|0=1,1|1=1按位1100|0011=1111十進制當中的加法當然不用說啦!大大的“+”號在鍵盤上面,現(xiàn)非(相反“非”運算是實現(xiàn)“求反”這種邏輯關系的一種運算。C語言中運-其運算規(guī)則如下!0=1,!1=0其運算其運算規(guī)則如下!0=1,!1=0其運算符號如下區(qū)別亮點在上面紅色指針的小圓圈那里C語言中“~”表示“按位取反”運算。如~01010101=而上面講到的“!”運算只是對單一位進行運算與,或,非總結與&有兩種功能:單一位與,按位與或|有兩種功能:單一位或,與接位或-非!=單一位非一種功能非!=單一位非一種功能二種功能利用C語言開發(fā)單片機的優(yōu)C語言作為一種非常方便的語言而得到廣泛的支持,很多硬件開發(fā)用C語言編程,如各種單片機、DSP、ARM等。C語言程序本身不不同的系統(tǒng)移植過來直接使用。C語言提供了很多數(shù)學函數(shù)并持浮點運算,開發(fā)效率高,可極大地縮短開發(fā)時間,增加程序可讀和可維護性。單片機的C51編程與用匯編ASM-51編程相比,有如優(yōu)點1對單片機的指令系統(tǒng)不要求有任何的了解,就可以用C語言直接程操作單片機-2寄存器分配、不同存儲器的尋址及數(shù)據類2寄存器分配、不同存儲器的尋址及數(shù)據類型等細節(jié)完全由編譯器動管理3程序有規(guī)范的結構,可分成不同的函數(shù),可使程序結構化4中包含許多標準子程序,具有較強的數(shù)據處理能力,使用方便5有方便的模塊化編程技術,使已編好的程序很容易移植C語言常用語法不多,尤其是單片機的C語言常用語法更少,初學沒有必要再系統(tǒng)地將C語言重學一遍,只要跟著我們的教程學下去當遇到難點時,停下來適當?shù)夭殚咰語言書籍里的相關部分,便會容易掌握,而且可以馬上應用到實踐當中,且記憶深刻(學以致用深刻記憶的重要原因C語言僅僅是一個開發(fā)工具,其本身并不難,難的是如何在將來開龐大系統(tǒng)中靈活運用C語言的正確邏輯編寫出結構完善的程序。在始學習之前,首先大家要有十足的信心,要有拿不下它誓不罷休的烈愿望,我相信你們能行,你們要更加相信自己能行C51中的基本數(shù)據類很多初學者對數(shù)據類型是什么東西搞不明白,我們舉個簡單例子設X=10,Y=I,Z=X+Y,求Z=?在這個例子當中,我們將10和I(文字I)分別賦XY,再X+YZ,由10(十進-已經固定,我們稱X為“常量已經固定,我們稱X為“常量比如姓劉,就具備了一個姓氏常量(常量就是不變的量名字還有確定,就會有各種可能,如元芳,星馳,德華,備,名字就成為個變量(暫時不確實是哪個就會這樣Z=X姓氏(常量)+Y名字(變量當確定好名字后,Z(整個名字)就出來了化而變化,我們也稱Y和Z為“變量”,本題X的值10Y值為I通過上面例子可以看到,在我們日常編程時,X和Y的值我們可以給它任意大小的數(shù),當我們給單片機編程時,單片機也要運算,而單片機的運算中,這個“變量”數(shù)據的大小是有限制的,就好像可255毫升的杯,最滿也只能裝255毫升,你并不能裝256毫升,非你升級水杯的容量-所以我們不能隨意給一個所以我們不能隨意給一個變量賦任意的值(最起碼的標準是賦值于容量值之內為了合理利用單片機內存空間,我們在編程時就要定合適的數(shù)據類型(等于定義水杯的容量,可以裝多少水不同的數(shù)據類型(不同的水杯也就代表了十進制中不同的數(shù)據大小所以我們在設定一個變量之前,必須要給編譯器聲明這個變量的類(水杯容量以便讓編譯器提前從單片機內存中分配給這個變量適的空間(定義好數(shù)據容量后,單片機是自動分配位置的-位與字節(jié)的概用十進制表位與字節(jié)的概用十進制表達水杯容量,裝滿了水就通過我們上面學過的知識,如果用二進制表達255就8個位如下圖,8個位全部相加就是十進制255-現(xiàn)在我們知道,在單片機現(xiàn)在我們知道,在單片機中,所有的數(shù)據都是以二進制形式存儲在儲器中的,既然是二進制,那么就只有兩個數(shù),0和1比如上圖水杯的第一格,沒水(0)和有水(1一個格就是這樣運用概念。這一個格我們在單片機里叫做一位(b位是單片機存器中最小的單位當你理解了一個格的概念后,上面的2~8格是一樣的概念-B,1B=8b字節(jié)Bbyte,位bbit縮寫很顯然,8個格容量的水杯我們定義為一個字節(jié),水杯在單片機里叫做存儲器而單片機外部P0~P3口就4個字節(jié)的存儲器在工作-單片機的C語言中常用的數(shù)單片機的C語言中常用的數(shù)據類型如下表所示三種形式位(b)我們知道是什么了,就是01無符號字符型所占位數(shù)是8位,也就1個字節(jié)。(一個水杯無符號整形所占位數(shù)是16位,也就2個字節(jié)。(兩個水杯只要運用熟練這三個,其它的數(shù)據類型運用就沒有問題,以后我們到再詳細解說大家在C語言的書籍上還能看到有shortint,longint,signedshort等數(shù)據類型,在單片機的C語言中我們默認的規(guī)則如下:shortint-int,longint即為long,前面若無unsigned(int,longint即為long,前面若無unsigned(無符號符號則一律認為是signed型(有符號這點要學會區(qū)別C51數(shù)據類型擴充定單片機內部有很多的寄存器,每個寄存器在單片機內部都分配唯一的地址(幾乎都是1個字節(jié)大小,有些少是2個字節(jié)的一我們會根據寄存器的不同,給寄存器賦予各自的名字為什么這樣做呢?因為單片機只默認認識寄存器的地址,而我們編時,記那么多地址肯定不方便,并且人腦也記不了那么多,為了方人們使用,就有了為地址命名字的出現(xiàn)舉個例子單片機的P1口就是連接到內部動態(tài)存儲器(RAM)的-當程序剛開始時,P1當程序剛開始時,P1口(0x90)默認等于0xff(這里用16進制數(shù),0xff轉換成二進制就是 1111,個8421碼我們之前學過相當于把P1口的八個位裝滿水,為高電平程序執(zhí)行到途中,我們要P1.0口點亮當執(zhí)行完畢P1=0xfe-現(xiàn)在再來看看0x90地址的現(xiàn)在再來看看0x90地址的變化好記?一個沒有所謂,如果多幾個呢那單片機有多少個地址可用呢?不同廠商單片機的都不同。但是原都是一樣的,我們用52單片機作為例子吧水杯雖然是同樣可以做水杯裝水,但是RAM和ROM的作用是不用的-來看看一張來看看一張對比圖就會一目了然-很顯然,我們程序人員寫很顯然,我們程序人員寫的程序就是存儲在ROM里面,就像印刷把知識印在書本上不可以改變一樣,除非你再次編程(印刷重的一點就是,印刷廠用的紙張只能印一次,而現(xiàn)在的單片機可以讓刷至少有幾萬次,完全滿足了我們學習者的需求ROM是什么原理之后,現(xiàn)在再理解它的中文名字就非常容易了RAM(動態(tài)存儲器)像我們的黑板,當中央處理器(老師)調用終端輸出我們編程人員想要的結果-從圖片中可以看到,從圖片中可以看到,RAM前128字節(jié)是用來默認用作自動處理單functionregister的縮寫、和剩下的零碎RAM里的0x90地址除了當正常的0x90地址的存儲器運用之外還可以用作P1口控制單片機的外部終端或者這樣說吧,除特定使用的寄存器之外的都是普通寄存器,這個解一下就可以上面我們說過,直接去用地址來寫作編程,會覺得很麻煩,就有了各個地址命名字去方便我們使用-而且,當你安裝好keil公司的編程軟它程序包里面已經默認把而且,當你安裝好keil公司的編程軟它程序包里面已經默認把名字命名好了,現(xiàn)在只由你直接運用,如們常用的頭文件Reg52文檔里面的部分內容如下,下面的不需要全部懂,找?guī)讉€懂就可以 -======B===============-======B===============-==看看熟悉的P0~P3單片機一開始不==看看熟悉的P0~P3單片機一開始不認識什么P0口,只知道它外到0x80這個地址的寄存器通過我們用sfrP0=0x8(0x80這個地址的寄存器的名字P0sfrP1=0x90(定義0x90這個地址的寄存器的名字為P1),其它如此推Sfr——聲明一8位的寄存器。(一個水杯sfr16——聲明一個16位的寄存器。(二個水杯-sfrX0x81這個地址。(一個水杯,8sfrX0x81這個地址。(一個水杯,8位Sfr16Y用了0x82,0x83這兩個地址(二個水杯,16位,聲名上定義起始址即可,附帶地址自動調用一位如sbitT2=sbitT2EX=定義P1.0這個位名字定義P1.1這個位名字如果不是聲明特殊功能用的位,用bit就可以,以后再詳細介紹對于學習者來講,RAM寄存器命名字已經完全被包含在51單片機完全可以暫不操作它,但在意識上要做到,你想方便運P0~P3這名字來編程,在程序里頭文件肯定少不了-編譯成功后,編譯成功后,P1.0口接的D8發(fā)光二極管就這了,如下圖所示-C51中常用的頭文通常reg51.h,reg52.h,math.h,ctype.hC51中常用的頭文通常reg51.h,reg52.h,math.h,ctype.h,stdio.h,stdlib.h,intrins.h但我們常用的卻只有reg5l.hreg51.h和reg52.h是定義51單片機或52單片機特殊功能寄存器和寄存器的,這兩個頭文件中大部分內容是一樣的,52單片機比51T2寄存器的內容math.h是定義常用數(shù)學運算的,比如求絕對值、求方根、求正弦和弦等,該頭文件中包含有各種數(shù)學運算函數(shù),當我們需要使用時可直接調用它的內部函數(shù)intrins.h是用于位左移,位右移等功能的頭文件,常見的流水燈功就是用這個頭文件里面的函數(shù)實現(xiàn)的,用到的時候再詳細介紹當我們對特殊功能寄存器有了基本的了解后,大家就可以自己動手寫具有自己風格的頭文件了。例如,在SY-1單片機學習板上,我用的是STC公司51內核單片機,該單片機內部除了一51單片所具有的功能外,還有一些特殊功能,當我們要使用這些特殊-能時,就要對它進行另外的能時,就要對它進行另外的操作,此時就需要我們自己定義這些特器地址來定義它們,關于這方面的擴展,我們會在以后的實際應用再次提到C51中的運算C51算術運算、關系(邏輯)運算、位運算符如下表所部分簡單解說(做實驗時記憶更深刻“/”除-用法1:用在整數(shù)除法中時,10/3=3,要整數(shù)用法1:用在整數(shù)除法中時,10/3=3,要整數(shù)3,不要余數(shù)用法2:當進行小數(shù)除法運算時,我們需要這樣寫10/3.0,它的結是3.333333,若寫成10/3它只能得到整數(shù)而得不到小數(shù),這一點大家一定注意“%”求余運算10/3=3求余運算就取1“==”如果測試等于用法:兩個等號寫在一起表示測試是否相等,即判斷兩個等號兩邊數(shù)是否相等的意思,如果測試等于就做這個事情,如果測試不等于做那個事情,有點像21的選擇題,在寫程序時我們再做詳解“!=”判斷兩個等號兩邊的數(shù)是否不相等,和測試等于原理相似位運算符,用于一個位(一個格子)的運算與操作-C515個基C515個基礎語C51中用到的基礎語句如下圖-學習單片機應該掌握的主要內容(5學習單片機應該掌握的主要內容(5部分(1)掌握單片機最小系統(tǒng)能夠運行的必要條件①電②晶③復位電(2)掌握對單片機任意I/O口的操作①輸出控制電平高低②輸入檢測電平高低(3)定時器:重點掌握最常用的方式2(4)中斷:掌握外部中斷、定時器中斷、串口中斷(5)串口通信:掌握單片機之間通信、單片機與計算機之間的通信掌握了以上這幾點知識后,可以說大家對單片機已經基本掌握了,他的知識也就是在這些知識點的基礎上擴展出的,只要大家愿意積嘗試,善于舉一反17,很快便能將單片機相關的知識輕松掌握-第一個實驗軟件使用與第一個實驗軟件使用與點亮人生的第一只發(fā)光二極本章詳細介紹單片機程序常用編譯軟件Keil的用法,用一個完整C51程序來操作發(fā)光二極管的點亮與熄滅,然后調用C51庫函數(shù)來程。認真學好本章,對于初學者來說將會是一個非常好的開頭用實操點亮一只燈程序來學會使用編程軟最終目標:點亮下圖D8發(fā)光二極管-實現(xiàn)方法:把P1.1~P1.7實現(xiàn)方法:把P1.1~P1.7置高電平,P1.0置低電平即可詳細操作步驟-從圖片中不難看出,我們從圖片中不難看出,我們寫的程序(子項目)都是圍繞總項目轉的然后從總項目輸出我們想要的單片機程序第一步:新建總項當我們安裝好KeilUvision3編程軟件后,就 項目——prouect(新項目)來新建項目點擊完newproject后,會有如下對話框-從上面不難看出,我們從上面不難看出,我們新建的單片機程序項目后綴名字是uv2,而當uv2項目產生的時候,會自動附帶很多其它uv2需要的文件,為防止我們產生瀏覽混亂,這個時候我們就需要“新建一個文件夾uv2存在里面,那么附帶的文件也會自己存進去這個文件夾里面方便我們?yōu)g覽和操作了-CPU選擇是找到Atmel并點擊其它+號-AT89C52(選擇51類型的單片機-選擇后選擇后,點確定按鈕-51標51標準代碼,這個暫時沒有什么用,點否就可以-這個時候,我這個時候,我們才創(chuàng)建好總項目,從一開始的導航圖片我們看到,-第二步:為總項第二步:為總項目添加子項為項目添加子項目之前,我們需要新建一個文件(程序編輯窗口點擊軟件file下面那個文本圖標createanewfil(創(chuàng)建一個新的文件-得到如下圖的得到如下圖的程序編輯窗口,在這里面編寫單片機的程序現(xiàn)在我們需要的是點亮一只燈的程序-寫好后,我們還不知寫好后,我們還不知道子項目里的程序有沒有錯,現(xiàn)在我們需要把個子項目添加到“點亮一只燈.uv2”的總項目里,去讓軟件查錯,便我們修正,輸出我們想要的單片機代碼去讓單片機工作,那需要何做呢很顯然,當我們新建一個子項目編輯窗口時(子項目軟件是沒把這個子項目存到總項目當中的,而是需要我們人手添加進去-操作方法是:先保存操作方法是:先保存,然后再把這個子項目添加到總項目去先保存需要點擊如下圖的圖標savetheactivedocument(保存活動文檔是保存當前編輯中的程序編輯窗口(子項目或許有些朋友很聰明,看到窗口上的*號就知道還沒有保存的文件-默認保存在我們創(chuàng)建默認保存在我們創(chuàng)建的“點亮一只燈”文件夾當中,還有重要的一是,記得文件名后綴必須是“.c”,第二次:文件名后綴必須是第三次:文件名后綴必須是“.c”,重要是事情說三遍,這樣后面操作就會萬無一失了-保存后,現(xiàn)保存后,現(xiàn)在我們需要把子項目添加到總項目當中-group1”選擇”addfiletogroupsourcegroup1(添加文件到組,根源組-默認打開的就是默認打開的就是“點亮一只燈”文件夾下面的“點亮一點燈”的C言程序(就是我們剛剛保存的.c文件然后點窗口上的add(添加-Sourcegroup1下有了Sourcegroup1下有了“點亮一只燈”添加成功后,就退出上面那個添加窗口-添加子項目到總項目后,添加子項目到總項目后,我們還不知道我們寫的程序有沒有錯,現(xiàn)要做的是,讓軟件查錯,那要如何做呢如下圖所示如果總項目只有一個子項目的時候(就像點亮一只燈.c,我們就就兩個按鈕就是這樣用,這就為什么叫總項目和子項目的原因,因總項目中可以包含多個子項目的-來看看點擊后來看看點擊后的效果這里只有一個子項目,只點buildtarget就行-從上圖可以看從上圖可以看到,build完后,我們看到0error(0錯誤),0(0警告如果我們把P1=0xff;,后面這個“;”分號去掉,看看是怎么樣-很明顯,它出很明顯,它出來了一句,syntaxerrornear}語法錯誤在花括號附近targetnotcreated(目標沒創(chuàng)建--現(xiàn)在我們把現(xiàn)在我們把分號加上后,它編譯沒有錯誤,證明程序可以運用,但軟件還沒有輸出單片機運行需要的代碼-第三步:輸出第三步:輸出單片機運行需要的代鼠標右擊“target”點“optionsfortargettarget’(選項對于目-制文件”勾上后,點確定-再點built這樣在再點built這樣在編譯沒有錯誤成功后,它就會產生一hex文件(單片機需的代碼我們就可以用這個hex文件讓我們的單片機工作啦-它在什么位置?就在它在什么位置?就在我們新建的“點亮一只燈”的文件夾里面需要用的時候,我們需要到這個文件夾找出來,這樣我P1.0口發(fā)光二極管就可以點亮了-查找方法如果你是查找方法如果你是用仿真軟件再點擊programfile把點亮一只燈.hex文件,找出來就行。(如下圖-你可以復制下面程序去編程你可以復制下面程序去編程軟件,熟悉上面的功能,如果想要靠自記憶去寫,也可以嘗試一下{}程序講解 -單片機里面的地址命名字,方便我們直接單片機里面的地址命名字,方便我們直接用名字使用{}Main()這個是主函數(shù)入口,程序在花括號{}里面執(zhí)行,之于main旁的括號是什么東西,我們以后用到再講解,現(xiàn)在明白它是固定格main()就行P1=11111110P1.0位置低電平,點亮D8發(fā)光二極管需要注意的是,這里的P1不可隨意寫,P是大寫,若寫成p,編譯序時將報錯,因為編譯器并不認識p1,它只認識P1,這是因為我在頭文件中定義的是“sfrP1=0x90;P1=0xfe后面的分號“;”也不要漏掉,不然程序會報錯這些也是大多初學者編寫第一個程序時常犯的錯誤,希望大家留意下-注釋問題知識點:C語注釋問題知識點:C語言中注釋的寫在C語言中,注釋有兩種寫法(1)//兩個斜扛后面跟著的為注釋語句。這種寫法只能注釋一行當換行時,又必須在新行上重新寫兩個斜扛(2)/*…*/斜扛與星號結合使用,這種寫法可以注釋任意行,即扛星號與星號斜扛之間的所有文字都作為注釋下圖是第二種-所有注釋都不參與程序編譯,編譯所有注釋都不參與程序編譯,編譯器在編譯過程會自動刪去注釋,釋的目的是為了我們讀程序方便,一般在編寫較大的程序時,分段入注釋,這樣當我們回過頭來再次讀程序時,因為有了注釋,其代的意義便一目了然了。若無注釋,我們不得不特別費力地將程重新閱讀一遍方可知道代碼含義。養(yǎng)成良好的書寫代碼格式的習慣經常為自己編寫的代碼加入注釋,以后定能方便許多練習把P1.1~P1.7口逐個點亮把P1.0~P1.3點亮,其它四個不亮while語管非常熟悉了,但是,先不要高興得太早,上面的程序并不完善,-何一個程序都要有頭有尾才對,而上面我們寫的何一個程序都要有頭有尾才對,而上面我們寫的程序似乎只有頭而尾。我們分析一下看,當程序運行時,首先進入主函數(shù),順序執(zhí)行面的所有語句,因為主函數(shù)中只有一條語句,當執(zhí)行完這條語句后該執(zhí)行什么了因為我們沒有給單片機明確指示下一步該做什么,所以單片機在運時就很有可能會出錯根據經驗,當Keil編譯器遇到這種情況時,它會自動從主函數(shù)開始重新執(zhí)行語句,所以單片機在運行上面兩個程序時,實際上是在不地重復點亮發(fā)光二極管的操作,而我們的意圖是讓單片機點亮二極后就結束,也就是讓程序停止在某處,這樣一個有頭有尾的程序才整那么如何讓程序停止在某處呢?我們知識點:while()語句的應格式while(表達式{內部語句(內部可為空-}特點:先判斷表達式是真還是假,再執(zhí)行或者不執(zhí)}特點:先判斷表達式是真還是假,再執(zhí)行或者不執(zhí)行內部語句在C語言的判斷條件中,1或以上為真,0為假判斷原則:若表達式不是0,即不是while(0)這樣的形式。這樣說是while(1),while(2),while(3或以上),即為真,那么執(zhí)行while花號的內部語句,如果是while(0)即為假,跳過while,不執(zhí)while括號的內部語句while有兩種形式1如果語句只有一條直接用表達式+執(zhí)行語句+分號結束就行如表達式執(zhí)行語句+分號While(1)是表達式,用來判斷是真是假因為這里是真,所以語句就無限循環(huán)于P1=0xfe,后面再加上一個號表示這是一條結束-2如果有兩條以上表達式如2如果有兩條以上表達式如樣的程序格式顯然是滿足不了多少功能,沒有什么意義的,那我們怎么寫才能讓while執(zhí)行多些語句呢從上面可以觀察到,我們還有花括號可用是的{}-“While(1)+花括號”就可以實現(xiàn)我們想要“While(1)+花括號”就可以實現(xiàn)我們想要的功能{}這樣就可以執(zhí)行完P1=0xfe,又繼續(xù)執(zhí)行P1=0xfa,如果后面還有語就會接著一條條繼續(xù)執(zhí)行,直}的這個結尾,繼續(xù)又重新開始{這個開始繼續(xù)執(zhí)行現(xiàn)在我們可以了解到有無限循環(huán)執(zhí)行它內部語句的用法,-果只有一條語句,直接在這條語句加分號就行,如果只有一條語句,直接在這條語句加分號就行,如果有兩條語句或上就需要加{}花括號如P1=0xfe,而往下執(zhí)因為P1=0xfa;是不屬于while的內部語句花括號原理也是一樣{}不執(zhí)行while花括號里面的語句,執(zhí)-通過這些認我們來編寫一個完整的點亮第通過這些認我們來編寫一個完整的點亮第一個發(fā)光二極管的程序#include< //52系列單片機頭文//主函()這里的main前面多了一個void,void有空的意思,在main前面加也可以然后到P1=0xfe,再停止在while(1);這里,while里面,如果有一條知識點:for語格式-for(1;表達for(1;表達{內部語}例子{}語句解說-執(zhí)行過程-執(zhí)行過程-上圖文字說明1判斷:判斷i是否少3上圖文字說明1判斷:判斷i是否少32執(zhí)行:執(zhí)行for內部語句從上面圖片可以看第一輪1步:初始化i=0(i賦值等2步:判斷i是否少33步:現(xiàn)在i=0是少于3,就執(zhí)行for花括號的內部語句一次第二輪6步:判斷i是否少37步:現(xiàn)在i=1是少于3,就執(zhí)行for花括號的內部語句一次第三輪10步:判斷i是否少3-11步:現(xiàn)在i=1是少于3,就11步:現(xiàn)在i=1是少于3,就執(zhí)行for花括號的內部語句一次i(i++第四輪13步:因為上面i2加了一次,現(xiàn)i=314步:判斷i是否少33,就不執(zhí)for句繼續(xù)往下面執(zhí)行要點1當for初始化完一次后,就沒有它的事了-2因為i初始化0,從0次開始執(zhí)行,2因為i初始化0,從0次開始執(zhí)行,就i<3也是執(zhí)3次(如果上面的理解那for(i=3;i>0;i--{}也是一樣的原理,這里3,如果i>0,就執(zhí)行內部語句然后i--,這里是i1次。這個也是共執(zhí)行3次,執(zhí)行完后就退for語通過以上步驟,這個for語句就執(zhí)行完了,單片機在執(zhí)行這個當我們給i賦的初值越大,它執(zhí)行所需的時間就越長,因此我們就以利用單片機執(zhí)行這個for語句的時間來作為一個簡單延時語句-很多初學者容易犯的錯誤是,想用for語句很多初學者容易犯的錯誤是,想用for語句寫一個延時比較長語句,那么他可能會這寫unsignedchari;(unsignedchar無符號字符型,這是是定i為for(i=0;i<3000;i--{;}但是結果卻發(fā)現(xiàn)這樣寫并不能達到延長時間的效果,因為在這i一個字符型變量,它的最大值為255,當你給它賦一個比最大值都的數(shù)時(裝多些水程序自然就出錯誤了,因此我們尤其要注意每次給變量賦初值時,都要首先考慮變量類型,然后根據變量類型一個合理的值,我們所指的變量類型,就是字符型,和整型,等,且這兩個在51單片機最常用,理解這兩個,其它的都已收入囊中-如果我們想用for語句做一個秒的延時,我如果我們想用for語句做一個秒的延時,我們該怎么寫呢秒是我們日常用的時間單位,如果單片機也用秒的時間來一句句執(zhí)程序語句,這樣就非常沒有效率,還不如直接用人手操作,我們創(chuàng)出單片機代替人手的根本原因,就是讓它自動化,而且快速那單片機到底有多快我們用s(秒單片機用的時間是us(微秒而1秒=1000毫秒=1百萬微秒很明顯,單片機用的時間是我們的時間的1百萬倍如果我們知道單片機執(zhí)行一條語句需要多少時間,就可以for語編寫出一個一秒的延時程序了我們來看看執(zhí)行一個分號需要多少時間。因為晶振是決定時間的們單片機常用的是11.0592M,想計算準確的時間,先在軟件里面置一下-右擊target,點optionfortarget右擊target,點optionfortargettarget,在xtal窗口輸入11.0592后點確定然后通過keil軟件——start/stopdebug可以監(jiān)測到程序執(zhí)行流程,入debug(調試)后(看下圖按鍵盤F10或者F11一步步執(zhí)行F10是跨越式執(zhí)行是細節(jié)語句執(zhí)行,說的多不如動手試一試就會明白很多了-來看看執(zhí)行分號之前的來看看執(zhí)行分號之前的時間從上圖可以看到,執(zhí)行一個分號之前的時間是s(sec那里看到0.00044162s=0.00044162s*100萬=441.62us(小點向右移六位就行執(zhí)行一次分號后的時間-從上圖可以看到行完一次分號從上圖可以看到行完一次分號之后的時間是:分號之前的時間分號之后的時間分號用的時間=445.96us-441.62us=4.34us所以執(zhí)行一次分號的時間是4.34微秒從我們上面圖片程序可以看到{;}-為什么是執(zhí)行230次分號呢230*4.34us(一次為什么是執(zhí)行230次分號呢230*4.34us(一次分號的時間)=998.2us=0.9982ms約等(因為1s=1000ms,1ms=1000us,牢記這個時間關系現(xiàn)在我們知道{;}這個for語法是執(zhí)行了1ms(1毫秒)的時間,但是這還沒有達到們想要的1S的時間,或許有些朋友很聰明可以想出,把這1ms好家伙,現(xiàn)在動手{-{;}}很明顯語言是可{;}}很明顯語言是可以用于內嵌語句執(zhí)行的,從上面圖片不難看到執(zhí)行230次分號后(1ms,還要重復執(zhí)行10001ms了一盞燈的一秒亮與-目標:一盞燈的一秒亮與目標:一盞燈的一秒亮與滅從上面圖片可以看到,讓一只燈亮滅的原理還是比如容易的,首先點亮一只燈,然后一秒延時,再滅燈,再一秒延時,再回到點亮一燈這樣無限循環(huán)的重復來看看程序//頭文-#defineucharunsigned //unsignedchar命名字為//unsignedint命名字為#defineucharunsigned //unsignedchar命名字為//unsignedint命名字為#defineuintunsigneduint//P10個位命名字為sbit//主函數(shù)入{//無限循環(huán)入{1{{;}}-滅延時一{{;}}}}看看這前面部分是什滅延時一{{;}}}}看看這前面部分是什么東//頭文#defineucharunsigned //unsignedchar命名字為//unsignedint命名字為#defineuintunsigneduint-//P10個位命名字為sbit//P10個位命名字為sbit#define也很好理解的,也是作命名字用,因為當引入頭文件后,單片機也只是知道什么是unsignedchar,unsignedint等而我們覺得太長不好寫,就有了#defineucharunsignedchar,unsignedchar(無符號字符型)命名字為uchar,#defineuintint也是同樣的道理,uint(無符號整型還記得我們上面學過的8位,16位嗎?8個位的二進制最大的數(shù)是就是用于表明8個位的水杯(最大十進制數(shù)是255uint16位的水杯,最大的十進制數(shù)可以表達到65535,6萬多-那么現(xiàn)在uinti,和ucharj現(xiàn)在明白了麼uint那么現(xiàn)在uinti,和ucharj現(xiàn)在明白了麼uinti,聲明一個16位的變量i,方便程序內用ucharj,聲明一個8位的變量j,方便程序內用變量位置哪里來?當你定義好,單片RAM(動態(tài)存儲器)自動配的,這不用你操心從上面程序看到在哪里用嗎延時程延時一{{;}}很明顯,j255,所以用uchar就行,i>255<6萬用sbit 也很好理解的,聲名特殊功能寄存器的位,把P1.0個位命名字為led-命名字方式,我們學過四種特殊功能寄存器的位命名字方式,我們學過四種特殊功能寄存器的位命名特殊功能寄存器8位地址命名:sfr特殊功能寄存器16位地址命名:sfr16TC=0x91;(連續(xù)用這兩個地址Define:把什么名字命什么名字(多數(shù)用于英文字母的定義再看看我們常用的四種(牢記特殊功能寄存器位命名Define:把什么名字命什么名字(多數(shù)用于英文字母的定義Uchar字符型Uint整型如何區(qū)分特殊功能寄存器和普通寄存器?原理很簡單的,當你這個存器是特殊功能的,比如P1(廠家告訴你這個寄存器有什么用,是特殊功能,如果定義它的位來運用,就用sbit(特殊功能寄存位命名如果廠家沒有告訴你這個寄存器具體有什么用,就是普寄存器,比如uchari,uintj,等等,當你聲明好后,單片機會自動配寄存器的,如果你想用普通的位,直接用bit就行,如bitflag,現(xiàn)在稍微了解就行,以后用就的時候你就明白了-再來看看程序,和再來看看程序,和我們的流程圖是一模一樣從上面圖片我們發(fā)現(xiàn),延時程序是一模一樣的,那我們有沒有方法同樣的代碼放在別處,需要的時候才調用出來,這樣就可以減少很代碼重寫,不用浪費那么多單片機內部資源-有兩種方式第一種有兩種方式第一種是在主程序(main)上面書寫第二種是在主程序(main)下面書寫來看看第一種,在主程序上面書寫從上面圖片可以看到,當定義好頭文件后和其它相應的名字后,子-序就可以開始書寫了延時子程序講//延序就可以開始書寫了延時子程序講//延時子程voiddel_ms(uint{{{;}}}Void是空的意思,相當于從這個子程序中,沒有東西(數(shù)值)返意思吧,現(xiàn)在不理解,你可以暫時忽略它,直接書寫就行,以后你到有東西(數(shù)值)返回的,對比一下,就一目了然了-del_ms(uintdel_ms是子程序名字,為什么是del_ms(uintdel_ms是子程序名字,為什么是del_ms,而不是其它呢?del是我把英文單詞delay(延時)的縮寫,加_符號,再加ms(毫秒),這樣字面上就可以直接理解到是延時1毫秒的子程序,叫做ms的原因現(xiàn)在我們沒有像上面那樣直接賦值1000次的一毫秒延時,而是把個1000變成可變的數(shù)字,如下圖所示的uint可以看到,現(xiàn)在我們上面1000改變成可變的變量整k,uint(無號整型)可在0~65535之間隨意賦值,定義完后,k就可以在隨意賦值就用了整型,而且這個k,只能在子程序花括號范圍內使用,就del_ms(uint-{K在這里隨意使用,在這{K在這里隨意使用,在這范圍外使用是無效的}你在主程序(main)內定義,就是主程序(main)花括號內可以使用,就是下面的uintiichar可以在子程序和主程序的花括號里隨意用,理解沒回歸正傳-del_ms這名字在英文del_ms這名字在英文或符號之間(不是中文就行,因為這軟件不中文你可以隨你懂的命名字,比如你不太懂英文,直接也行,只要做到一看這名字就知道是什么樣的子程序就行延時子程序調用方法,在主程序內調用-del_ms(多少數(shù)字你定義del_ms(多少數(shù)字你定義記得后面不要漏了分號,這樣做只要是告訴軟件,你已經寫完一條句,不然的話,程序會出錯第二種:子程序在主程序下面寫-這種方式除了位這種方式除了位置不同和加多一句“告訴單片機主程序”下面有子序外,其它一樣,如果你在主程序下面寫子程序而沒有首先告訴單機,程序編譯中會出錯的,你可以自己試試,試過就知道了-第二個實驗:流水燈的目標:流水燈,或者進入我空第二個實驗:流水燈的目標:流水燈,或者進入我空間日志看看最終仿真效果逐個點亮實現(xiàn)程序//頭文件用于左移右移//定義名#defineucharunsigned//定義名#defineuintunsigneduint//延時子程voiddelay_ms(uint{{-{;}}}//主函數(shù)入{//定義a,b兩個變量為字符型{;}}}//主函數(shù)入{//定義a,b兩個變量為字符型//你也可以分開寫如//如:ucharuchar//首先把P1.0置為低電平//點亮第一個發(fā)光二極管//P1的值(0xfe)給b//無限循環(huán)入{-{}7{}}{}7{}}來解說一-{}在這段移位程序之前,我們已經{}在這段移位程序之前,我們已經點亮了第一盞燈,并且延時了一秒1110)賦值給b這樣我們就可以用這個b來操作了我們來看看上面這段for語句,哪些是固定的,哪些是變化的固定的for(a=0;a<7;a++):這段是固定的,共執(zhí)行它的花括號七次P1=b;:是固定的,b的值給P1,就是P1口的端口變化了。delay_ms(1000);:是固定的,延時1秒思-當你想移位操作的時候,這個頭文件肯定少不了,然后括號里面(b,1)b就是移b這個變量的意思,1就是移一位,如果你成_crol_(b,2);就是把b向左移兩位上面這里b=_crol_(b,1);的意思就是,b向左移一位后,再賦值b假設b沒移位之前是等0x(111111101101)又賦值;這樣第二盞燈就點亮, 延時一秒再執(zhí)行7次花括號里面的語句,為什么是執(zhí)行7次呢-有左移肯定有右移有左移肯定有右移,我們來看看intrins.h里面的頭文件介紹L是left(左)的縮寫,r是right(右)的縮寫,看紅色標記那邊的列,這樣_cror_,_iror_往下看的六個已經一目了然了-主要的是這六個我們經主要的是這六個我們經常用而從左邊英文字往下看的的分別char字符型(8位,intlong注意一下這個區(qū)別頭文件的其它幾個我們就不用管了,就記移位這幾個就行-上面的退出,是退上面的退出,是退出for語句作業(yè)嘗試2盞燈同時亮并左移,計算一下移多少次移到最高位-第三個實驗:一個數(shù)碼管顯示第三個實驗:一個數(shù)碼管顯示0-實現(xiàn)目標:一個數(shù)碼管顯示0-F,或者進入我空間日志看看最終仿效果實現(xiàn)流程:先把數(shù)碼管顯示0,隔一秒,又顯示1,隔一秒,…直顯示F,如此循環(huán)寫程序之前,我們先來看看兩個應用器件的介紹1七段數(shù)碼管單個實物內部原理圖-從上面的圖片看到,七段數(shù)碼從上面的圖片看到,七段數(shù)碼管里面就是由8個發(fā)光二極管組成,做七段的原因,就是把七個發(fā)光二極管排列好,已經可以滿足我們常十進制0~9的數(shù)字顯示需要,如上圖左邊的外形圖,a,b,c,d,e,f,(剛好七個發(fā)光二極管,你留意一下它的順序,順時針的排列有一個發(fā)光二極管,我們h表達,就是“外形圖”右下角的那一點再來看看實物圖-因為我們的SY-1單片機因為我們的SY-1單片機學習板是用共陰七段數(shù)碼管,我們就用它講解一下,明白這個,共陽也差不多明白了從上圖我們可以看到,把8個二極管的陰極共同接地,我們就叫做陰,把8個二極管的陽極共同接電源5V,我們就叫做共陽當共陰中的a為高電平,其它的b~h為低電平,那么在數(shù)碼管上,有a那一橫亮起,這樣的話,共陰數(shù)碼管就是高電平亮,低電平就亮-a為高電平時,aa為高電平時,a就亮如果我們想顯示一個0?是不是中間那g和小數(shù)點h為低電平,它的為高電平,就可以顯示出來了-在排列順序中,我們通常是以h在排列順序中,我們通常是以h為最高位,a為最低位,所以二進表達式為1111(h,g為低電平,其它為高電平。00111111=0x3f(16進制還舉多一個例子,如果顯示 就可以把1顯示出來了你感興趣的話,可以用筆記本自己算算74HC573鎖存器的介-Dip貼片形式Dip貼片形式20只-鎖存器的原理是比較容易鎖存器的原理是比較容易理解的,我舉個例子,比如你有八間屋子屋子兩邊都有門(舊時代的屋子都有兩個門,一個叫入口(輸入一個叫出口(輸出并且八間屋子的入口的鎖匙是一樣的,出口鎖匙也是一樣的,當八間屋子需要貨物進時,你需要打開入口的門把貨物存進去,存好貨物后,你把門關上,貨物就在里面,這個輸門的鎖匙就相當于573鎖存器的LE(latchenable)~開關鎖使能還有一個輸出門,當你需要輸出屋子里的貨物時,你需要把輸出門-開,這樣你的貨物就可以出去開,這樣你的貨物就可以出去了,OE(outputenable)~輸出使能但是和這例子有點區(qū)別的是,電平存進573鎖存器里面后,當把輸門關上,不管你輸出多少次,573鎖存器里面的電平依然保持一樣鎖存器從字面上就可以理解到,鎖著就存住了,除非你輸入的電平變化并且輸入門鎖打開,兩個條件滿足,這才可以改573鎖存器電平(5V,或者是低電平來看看573的內部原理圖,你大概看一看就行,因為不是生產器件不需要詳細研究它的內部電路-74HC57320只腳,74HC57320只腳,分為別,GND(2 8個輸入口,在我們的單片機板子上接P0口的八的腳3 8個輸出口,接七段數(shù)碼管的八只腳L(latchenable~-LE腳為高電平時,P0口LE腳為高電平時,P0口上的電平就能進74HC573里面的鎖存器里面的鎖存器74HC573就能輸出電平到數(shù)碼管,OE為高電平時就不能輸出SY-1板子上的電路圖從上面圖片可以看到,P0.0~P0.7U2U3D0~D7用總線進行-接,這樣做的好處接,這樣做的好處是,讓電路簡潔明了,避免太多線看著混亂明白2位數(shù)碼管后,6位也就會明白了兩位數(shù)碼管內部原理-數(shù)碼管合并后的原理也是數(shù)碼管合并后的原理也是比如容易理解的,如果想數(shù)碼管顯示,只滿足兩個條件即可第一個條件是:陽極中是高電平,比如想顯示一個0,陽極的電平式就0x3f第二個條件是:陰極為低電平,有3種如果如果1:個位的共陰端是低電平,十位是高電平,個位數(shù)碼管就顯0,十位數(shù)碼管不顯示-如果2:十位的共如果2:十位的共陰端是低電平,個位是高電平,十位數(shù)碼管就顯0,個位數(shù)碼管不顯示如果3:十位的共陰端是低電平,個位是低電平,兩個數(shù)碼管就同0-明白這個原理明白這個原理后,6位數(shù)碼管就輕松理解-實驗:最右邊的數(shù)碼管(實驗:最右邊的數(shù)碼管(第6個0到F循環(huán)顯示鎖存器連接數(shù)碼管的電路圖為了簡潔一些,我們把連接共陰數(shù)碼管陽極的鎖存器U2,把連共陰數(shù)據管陰極的鎖存器U3完整程-#include#defineucharunsigned#defineuintunsigned#include#defineucharunsigned#defineuintunsignedsbitsbit//延時子程voiddelay_ms(uint{uint{;}}-{//字符型變uchar{ //循環(huán)16次,即從0~F都顯{//字符型變uchar{ //循環(huán)16次,即從0~F都顯示一次{//數(shù)碼管陽極電//U2段碼開關鎖打//U2段碼開關鎖關//0xdf=1101 6個數(shù)碼管共陰//74HC573位碼開關鎖打//74HC573位碼開關鎖關}}}-程序分段瀏覽程序分段瀏覽-程序解我們程序程序解我們程序sbitsbit關,就可以直接用我們認識的名字使用-這組代碼的意思是1花括號中就這組代碼的意思是1花括號中就是數(shù)碼管0~F的段碼表2Uchar指的是這些段碼為字符型,如0x3f,0x06,如果是0x003f是整型3Code的意思是存儲在ROM(靜態(tài)存儲器)當中,因為這些段碼定后就不會變的,為了節(jié)省RAM(動態(tài)存儲器)的容量,所以擇存儲ROM當中里面包含的是在上面那組0~F當中你選擇哪個舉個例就調0x5b出來(調用段碼-主程序講解主程序講解-{//字符型變uchar{{//字符型變uchar{{//數(shù)碼管陽極電//U2開關鎖使能打//U2開關鎖使能關-//0xdf=1101 6個數(shù)碼管共陰//置為低電平(就是選6//0xdf=1101 6個數(shù)碼管共陰//置為低電平(就是選6個數(shù)碼管顯示//U3開關鎖使能打//U3開關鎖使能關}}}從這主程序可以看到,當進入while的for語句后,如num=0,在P0=table[0]調用第一個段碼等于0x3f//U2開關鎖使能打//U2開關鎖使能關鎖存器通過duan=1一開,把0x3f存進U2鎖存器后,共陰數(shù)碼管陽極就有了0x3f電

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論