比如說在微控制器中,你寫 0,它輸出低電平。

既然樓主提到“低電平”,看來對數位電路是有一點了解的。

那麼,翻開數位電路相關教材,最前面幾頁。

一般它都會告訴你,三極體/場效電晶體類似繼電器(一種通過線圈產生磁場、然後用磁場控制物理開關的通斷與否的裝置);在它一個管腳上輸入/切斷電壓訊號,另一個管腳就會出現高/低電平。
這東西,就是數位電路的基礎。

你敲入的任何東西,最終就是通過類似的東西/機制儲存的;所謂“指令”,其實就是“某個命令碼“(一般叫機器碼),這個”命令碼”會改變CPU內部一堆“開關”的狀態,以啟用不同的電路;然後資料(前面提到過,它也是用三極體/場效電晶體的導通與否“記憶”的)利用類似的機制,被送入這個被“指令”啟用的電路——這些電路是工程師們利用最最基礎的三極體控制原理,用一大堆三極體組合出來的:當資料(某種高低電平的組合)經過這些電路後,就會變成另外一組高低電平的組合:這個組合剛好和“指令”代表的功能所應該給出的結果一致。
這段話可能有點難以理解。那麼,看下最簡單的與門吧:資料有兩個,分別通過兩條不同的線路進入與門;輸出只有一個,必須給它輸入兩個高電平,它才會輸出高電平;否則就輸出低電平(這一般簡化表述為:只有輸入兩個1,它才輸出1,否則輸出0)。

——這就是所謂的“與”邏輯;一組這樣的“與”邏輯就與計算機指令/高階語言裡的“按位與”直接對應。
——而按位與這個指令,意思就是選擇一組線路,把資料導通到這組“與”邏輯電路之上;然後這組與邏輯電路就會輸出兩組資料的按位與的結果。
——類似的,二進位制加法,1+1=0(同時進位);1+0=1;0+1=1;0+0=0:這可以用一個異或電路來模擬(因為異或電路的規則就是1+1=0、1+0=1、0+1=1、0+0=0);但這樣(同時進位)這個說明就會丟失了,所以需要同時用一個與門模擬高位進位(前面說過,與門就是隻有兩個1才會輸出1,其它輸出0;綜合異或的說明:這是不是就和二進位制加法的規則剛好一致了呢?)
然後更高一位就成了兩根輸入線上的資料相加、再加上進位資料……依此類推:這就是用開關做加法的思路。而這樣堆起來的一組開關,就叫加法器。
——add指令呢,就是選中上面做的那一堆用來做加法的開關們;然後給它們輸入資料(不要忘了,兩組高低電平而已),這些資料就驅動著構成加法器的那些開關們,噼裡啪啦一陣亂響之後(嗯,如果是老掉牙的繼電器計算機的話:還記得BUG的故事嗎?),電路就穩定在某個狀態了:此時,加法器的輸出,恰恰就是輸入資料的和(當然是這樣了。前面講過,我們是刻意用異或門和與門精心組合,讓它們剛好和加法的效果一致)。

——其它種種指令,莫不大同小異(更復雜/高階的時鐘、流水線啥的……暫時就無視吧)

你可以翻翻課本。上面講過加法器的實現。

而加法器和另外一些邏輯電路加起來,就是所謂的ALU(算術邏輯單元,一下子就高大上了有木有)。

簡而言之,程式碼在計算機內部,本身就是一組特定的高低電平組合;而計算機是精心設計的、海量的、用高低電平控制通斷的開關組;當給這個開關組輸入不同的電平組合時,就會導致它內部出現複雜的開關動作,最終產生另外一組高低電平的組合作為輸出;這些開關動作經過精心設計,使得它的行為是可解釋、可預測的——解釋/預測的規則,就是CPU的指令集。

——換言之,在機器內部,一切本來就是高低電平,不存在轉換問題。
——反而是鍵盤/滑鼠/mic的輸入要經過機械過程到數字訊號的轉換;而視訊、音訊之類的輸出,要經過數模轉換再通過其它機制才能變成人可辨識的資訊
————————————————————————————————
我知道,很多人困惑的,可能並不是開關的原理;而是:如果CPU不過是一堆開關的話,它為什麼能“聽懂”類似“加法”“do...while”這類高大上的複雜指令、甚至做出office、photoshop甚至人工智慧這樣神奇的東西呢?這些高大上的語義,是怎麼被電路所理解的呢?

加法之類簡單指令,前面已經介紹過了;而提到更復雜的東西……這就不得不說說圖靈的貢獻了。

還是從最小兒科的題目開始。假設你從來沒聽說過乘法表;那麼,你怎麼算8×9呢?

我們知道,A x B就是B個A相加或A個B相加的意思。那麼,要算8×9,我們只要把8個9加起來就夠了:8次加法而已。

換句話說,這裡有個很好的思想,即: 很多“高階”數學計算(如乘法),其實用“低階”方法(如加法)一樣是可以算的。

圖靈的貢獻就是,他證明了,如果一臺機器,可以接受一系列的輸入、並按輸入指示完成運算;那麼,當這臺機器可支援的操作滿足“圖靈完備”的要求時,它就可以模擬任何其它數學/邏輯運算!

這實在是太關鍵了。要知道,人類早就想利用機械裝置代替一些腦力工作了。比如說,算盤,按照口訣機械的一陣擺弄,答案就出來了;還有老外的各種機械計算器,比如手搖計算機到炮兵用的彈道計算機、再到德軍的機械加/解密機等等,這種嘗試可以說是數不勝數。

但,再怎麼的,這些東西也只能解決特定的問題。想做能解決全部問題的通用機?天哪,那得有多複雜。

而圖靈,就在這時候,為人類指出了一條通向機械智慧的可行道路……

——一臺只會做加法的機器,只要能想辦法它實現“連續做指定次數加法”,那它就可以模擬一臺乘法機。而能夠模擬任何數學/邏輯運算的機器,並不比加法機複雜太多。

換句話說,要搞出一臺“無所不能”的計算機器,並不需要窮盡一切可能,而是隻要支援程式輸入、再支援少的令人髮指的幾條指令,就可以辦到了。

比如說,CPU,它根本上其實只會三招:與、或、非。

與就是全為真,則輸出真;或是隻要一個為真,則輸出真;非則是輸入真它就輸出假、輸入假就輸出真——所謂的真假,一般寫作1、0,在計算機內部就是高低電平。

別看CPU只會這三板斧;可當它們巧妙的組合起來後(構造成計數器、指令暫存器等等等等再組合成CPU),就達到了圖靈完備的要求,產生了質變。

具體是怎麼做的,這就不是三言兩語能說清楚的了。還是仔細看看自己的數位電路這本書吧。

——數位電路研究的,就是如何用與或非這三板斧,來實現各種高階運算甚至CPU指令集這麼複雜的事物
——而CPU指令集呢,則形成了另外一個強大得多的圖靈機,這就是機器碼(和彙編指令幾乎一一對應);然後呢,諸如c/c++、java等高階語言,就是利用CPU指令集形成的、另一個更加強大的圖靈機(編譯器/直譯器負責兩種圖靈機之間的翻譯工作)。
——而程式設計師們研究的,就是如何用程式語言這樣一個強大的圖靈機,去實現office、photoshop、wow甚至人工智慧這樣複雜的事物。
——這也是一個層層模擬的過程。

————————————————————————————
總之,開關的通斷是基礎;而各種神奇的功能是如何用這麼簡單的東西組合出來的呢,那就必須理解“程式”原理(也就是圖靈機原理)了。

如果說,計算機是一個人,那麼,軟體就是他掌握的知識。這個知識使得他不僅能掰這手指頭數數,甚至還可以去洞悉宇宙的奧祕。

————————————————————————————————
具體一些,人是怎樣開車的呢?

首先,他要知道車的控制原理(知識/軟體);然後,基於這些知識,大腦向他的四肢肌肉發出神經衝動,驅使他完成轉方向盤、掛擋、踩離合器/油門等種種動作,最終達到開車這個目的。

軟體控制硬體,也是類似的原理。
前面說過,程式本身就是高低電平的組合;它通過在CPU上執行來模擬各種決策過程;同時,計算機就是一堆開關;那麼,通過指令向某些地址寫出資料(訪問特定地址是通過各種定址機制/指令完成的,歸根結底也可以說是通過開關切換,改變了電路拓撲),就等於開啟/關閉了對應地址上的某個開關;這個開關可以是類似CPU內部那樣的一組三極體,也可以是通向另外一個繼電器的訊號線——這個訊號就促使繼電器閉合,於是電機導通……

就好象人開汽車一樣,神經發出的微不足道的電脈衝經過肌肉放大,影響了涉及數百甚至數千馬力的能量洪流的發動機/變速箱的運轉,然後汽車就開走了。
計算機也一樣:它通過向控制特定地址上的開關輸出0/1(高低電平),就可以通過事先準備的物理設施驅動諸如航模電機、舵機等等機構,這就完成了航模控制。
完整的控制迴路甚至可以是:
航模上的感測器採集飛行姿態、地形、位置等等資料(最終轉換成高低電平構成的訊號)----訊號通過某些埠送到CPU-----CPU執行程式,程式讀取感測器發來的訊號,決定下一步的行動-----經過程式的智慧判斷後,通過控制特定地址上的開關(前面提過,向這個地址發一組高低電平構成的資料就行了),驅動諸如航模電機、舵機等等機構,完成航模控制。

這,就是所謂的“機器人”(當然,只是最簡化的機器人原理而已)。

陳標龍欲速則不達,放慢腳步。

知乎上問具體專業問題果然不是好選擇。前面的回答不能說是錯的,至少也是不準確的。
不知道題主學過數位電路沒有,學過就比較好理解了。
我們寫的軟體經過這幾個步驟 高階語言-->組合語言--->機器語言。機器語言是二進位制的,每一種指令操作都有對應的二進位制編碼,比如我們執行 ADD R1,R2 指令, ADD有一個唯一的二進位制編碼假設為編碼1 ,R1 R2是CPU暫存器地址也有唯一的編碼設為編碼2 編碼3.這些編碼的具體格式和數值是根據指令格式和具體cpu架構確定的。比如arm的指令字長就固定為32位,特定的位代表著條件碼操作碼等。arm的指令可參考《arm 體系結構與程式設計》杜春雷編
我們的程式就是以這種二進位制編碼格式儲存在cpu的儲存器裡。
有了這幾個唯一編碼之後呢?cpu就開始譯碼操作,進行一些數位電路的組合運算,假設編碼1是 0x10(只是假設,實際各個指令集編號不同),當譯碼電路發現指令的操作碼是0x10時就知道是進行加法運算,此時會輸出一個有效訊號選通加法器;同時也對編碼2和編碼3進行譯碼,選通對應的暫存器(哪一個是源暫存器哪一個是目標暫存器是由指令集格式規定的),然後就將暫存器輸出的資料通過CPU內部的資料線送入加法器進行加法運算,運算的結果送入目標暫存器。這就運行了一個加法運算。
直接回答題主的問題,當你在程式中對IO管腳的暫存器寫0時,微控制器將通過類似上述的步驟對指令進行譯碼,然後將0這個資料寫入到IO管腳暫存器中。暫存器的數值如何送到對應的IO管腳?一般是通過D 觸發器(如圖):

在微控制器內部IO暫存器的資料口連線到D觸發器的D管腳(實際上還有其他電路,用來增大驅動能力等),D管腳下面有小三角的管腳是時鐘訊號管腳,當時鍾訊號上升沿來臨時,D觸發器D埠的資料將輸出到Q埠,Q埠是連線著外部的管腳的。所以只要IO暫存器不改變,Q管腳將一直保持著高電平或者低電平,即你程式表現出來的寫0就使管腳輸出低電平。
更多CPU指令操作內容可瀏覽我的一個回答
http://www.zhihu.com/question/20388579/answer/14985333
總結一下:你的程式編寫完後通過編譯器將變成一堆二進位制的機器編碼----->微控制器對這些編碼進行譯碼,知道你要對哪一個暫存器進行什麼樣的操作----->對應的暫存器被寫入正確的值,如果是IO管腳的話將根據時鐘將暫存器的值輸出到外部IO管腳。所以實際上微控制器也就是一堆數位電路的組合,只不過我們人為的規定什麼樣的編碼要進行什麼樣的操作而已。

隨風arm-linux-(18546)【[email protected]

我怎麼發現得票數最多的沒有真正回答問題呢....
下面是我的答案:
先說程式碼:
我們是用電腦的鍵盤來輸入的指令,每一個指令都對應一個ASCII碼,而這裡的ASCII碼就是有序的電壓的高低(或電流的有無,下面只提電壓的高低),即我們輸入的是電壓的高低,你所看到程式碼是這些電壓的高低控制顯示器所顯示的影象,其實電腦也不知道它是什麼,只知道這樣顯示。
結論:程式碼其實就是儲存在儲存器(記憶體、硬碟或者快閃記憶體等等)中有序的電壓的高低。
再說編譯:

編譯是一個有序的電壓的高低向另一種有序的電壓高低的一種轉換過程,下面以52微控制器為例,我們編譯是從表示ASCII碼的那種有序電壓高低轉換為52微控制器能夠識別的另一種規定好的有序電壓高低,即表示HEX檔案的電壓高低。
結論:編譯出的結果還是電腦中儲存的有序電壓高低。
到微控制器燒錄:

接下倆就是燒錄,理解了上面兩點就很容易理解下面的內容,燒錄就是電腦中的有序電壓高低通過資料線傳輸到微控制器中的ROM中。
接下來ROM就可以釋放其中的電壓來控制外圍的電路。
總結:從程式碼的編輯到最後對電路的控制都是電壓在起作用,只是為了方面我們而給我們展現的形式不一樣而已,而其本質都是電壓,這樣也就不存在轉換。

理解這句話:世界上沒有軟體,軟體只是對硬體的一種反映,就像意識是對世界的一種反映是一樣的!

相信這樣就很容易理解了。

看到有人贊同了我的觀點,很開心,針對題目我再補充一點:
只要你提到0/1,提到軟體,這個問題就沒法理解...因為軟體【包括0/1】和硬體始終存在一道無法跨越的鴻溝;
你說你在微控制器中寫0,請問你是如何寫0的?在鍵盤上敲個0?實際還是電平【和我們理解的數字沒關係】,那個0只是你在電腦顯示器上電平的呈現形式,那個所謂的0【實質是電平】可以傳輸到微控制器中的ROM中,電平控制電平沒什麼疑問吧,這樣就輸出低電平了...
有錯誤歡迎指出。

飲悅C/python

推薦一本書《編碼的奧祕》,你會很明白的

gavin來自農民講習所,講不好請見諒。

剛考完計算機組成原理

對微控制器也略懂一二

所以在這裡給大家展示一下我對題主疑惑的解答

首先,題主說寫0就會輸出低電平

那麼我們就用程式碼展示一下怎麼會顯示低電平

我把題主的意思先用微控制器C語言寫出來

可以在keil中執行的

#include “reg52.h” sbit p1.0 = P1^0 void main() {     while(1)     {          p1.0 = 0;     } } 

好了,題主說在微控制器控制裡,寫0就會輸出低電平,是這樣的。

先看什麼是微控制器:

如圖1

題主說的輸出低電平就是在其中的一個引腳上輸出低電平

我想看不懂程式碼的人也能夠看到

程式碼第七行裡,p1.0這個變數被賦予了0值

那麼咱們深入的看一下給他賦0值微控制器內部發生了什麼變化

首先給大家展示一下微控制器一個引腳內部到底是什麼東東

如圖2

左邊的大家就不用看了

右邊給大家解釋一下,最右邊的就是引腳了

雖然引腳是一個,但是大家可以看到

右邊是有兩個裝置的,上邊的裝置是用來保持內部輸出到引腳的電平不會被外部的訊號所幹擾。下邊的裝置會把從外部收集來的訊號臨時儲存起來,這裡存的不是0就是1。怎麼判斷?大於某一電壓就是1,小於某一電壓就是0。這兩個裝置互不干擾

第七行的程式碼就是將某一引腳輸出低電平並用上邊的保持元件將其維持到低電平。

那麼,就有人想問了,為什麼寫成這樣微控制器就會認識呢?還會奇怪為什麼微控制器認識的語言和程式設計師認識的語言一樣呢?

這裡就牽扯到了計算機組成原理了。我就簡單的介紹一下:

首先,我寫的這段程式碼會在一個軟體裡執行,這個軟體會編譯我的程式碼形成枯燥難懂但是70年代時會被人認為高大上的組合語言,類似這樣的(除綠色字部分,解釋用的):

如圖3

這還不夠,形成這樣的語言會讓計算機中的低等編譯器認識,低等編譯器會將程式碼翻譯成如下圖所示的東東

如圖4

注意,這是16進位制的數,具體怎麼轉化為二進位制我就不詳細展開了。為什麼要編譯成圖3的語言再編譯呢?說白了我感覺就是跟水廠一樣,水廠把我製作的水放到一個通用的大水管裡然後通到不同微控制器的家裡,微控制器按照自己家的情況把水引到廚房等地。(就是這樣吧 - -)

那麼,我們就可以讓微控制器或者叫做計算機來執行這段程式碼了。

對不起,現在才進入到計算機組成原理(對不起計組老師)

現如今,大家所用到的計算機都是馮諾依曼型計算機。

什麼是馮諾依曼型計算機?書上解釋說:

採取儲存程式的方式讓控制器儲存器中讀取二進位制並解釋然後讓運算器去計算數值。

我來再解釋一下,首先讓我們瞭解運算器是什麼東東

如圖5

最下面的就是運算器運算器能夠進行加減乘除邏輯運算,控制器會從儲存器中讀取資料放到上圖運算器上邊的框框裡,一個框框放一個數據。

怎麼放?

看到左右的兩條道道了嗎?資料會在控制器的控制下被放到這些框框裡,當然控制器會控制最下面的運算器做出各種運算然後放回到上邊的框框裡

那麼資料是怎麼回去的呢?

廢話,當然是怎麼來就怎麼滾了,通過左右兩條道道啊親

讓我們來解釋一下最開始樓主說的輸出低電平,上邊的框框有一些是不能隨便放資料的,這些框框用來引出引腳,即有些框框裡的資料連線著引腳啊親

講到這裡,我想我已經比較清楚的解釋了0是怎麼控制低電平的了。

如果哪些地方沒講明白,大家可以交流一下,我會再詳細講講我理解的一些內容。

這是我第一次在知乎上答題,有什麼冒犯的希望大家見諒啊。

.