① 單片機如何實現多路模擬量的數據採集、顯示
普通單片機實現多路模擬量的數據採集、顯示需要:
外部連接一個多通道輸入的ADC晶元,單片機按照一定的周期驅動模擬開關切換到不同的模擬通道,設計模數轉換控制器的控製程序,可以進行定時模擬信號採集和顯示。
(1)51單片機連接adc擴展閱讀:
單片機基本結構及作用:
1、運算器
運算器由運算部件——算術邏輯單元(Arithmetic & Logical Unit,簡稱ALU)、累加器和寄存器等幾部分組成。ALU的作用是把傳來的數據進行算術或邏輯運算,輸入來源為兩個8位數據,分別來自累加器和數據寄存器。
ALU能完成對這兩個數據進行加、減、與、或、比較大小等操作,最後將結果存入累加器。
運算器有兩個功能:
執行各種算術運算。
執行各種邏輯運算,並進行邏輯測試,如零值測試或兩個值的比較。
運算器所執行全部操作都是由控制器發出的控制信號來指揮的,並且,一個算術操作產生一個運算結果,一個邏輯操作產生一個判決。
2、控制器
控制器由程序計數器、指令寄存器、指令解碼器、時序發生器和操作控制器等組成,是發布命令的「決策機構」,即協調和指揮整個微機系統的操作。其主要功能有:
從內存中取出一條指令,並指出下一條指令在內存中的位置。
對指令進行解碼和測試,並產生相應的操作控制信號,以便於執行規定的動作。
指揮並控制CPU、內存和輸入輸出設備之間數據流動的方向。
微處理器內通過內部匯流排把ALU、計數器、寄存器和控制部分互聯,並通過外部匯流排與外部的存儲器、輸入輸出介面電路聯接。外部匯流排又稱為系統匯流排,分為數據匯流排DB、地址匯流排AB和控制匯流排CB。通過輸入輸出介面電路,實現與各種外圍設備連接。
3、主要寄存器
累加器A
累加器A是微處理器中使用最頻繁的寄存器。在算術和邏輯運算時它有雙功能:運算前,用於保存一個操作數;運算後,用於保存所得的和、差或邏輯運算結果。
數據寄存器DR
數據寄存器通過數據匯流排向存儲器和輸入散豎/輸出設備送(寫)或取(讀)數據的暫存單元。它可以保存一條正在解碼的指令,也可以保存正在送槐或往存儲器中存儲的一個數據位元組等等。
指令寄存器IR和指令解碼器ID
指令包括操作碼和操作數。
指令寄存器是用來保存當前正在執行的一條指令。當執行一條指令時,先把它從內存中取到數據寄存器中,然後再傳送到指令寄存器。
當系統執行給定的指令時,必須對操作碼進行解碼,以確定所要求的操作,指令解碼器就是負責這項工作的。其中,指令寄存器中操作碼欄位的輸出就是指令解碼器的輸入。
程序計數器PC
PC用於確定下一條指令鉛掘伍的地址,以保證程序能夠連續地執行下去,因此通常又被稱為指令地址計數器。在程序開始執行前必須將程序的第一條指令的內存單元地址(即程序的首地址)送入PC,使它總是指向下一條要執行指令的地址。
地址寄存器AR
地址寄存器用於保存當前CPU所要訪問的內存單元或I/O設備的地址。由於內存與CPU之間存在著速度上的差異,所以必須使用地址寄存器來保持地址信息,直到內存讀/寫操作完成為止。
顯然,當CPU向存儲器存數據、CPU從內存取數據和CPU從內存讀出指令時,都要用到地址寄存器和數據寄存器。同樣,如果把外圍設備的地址作為內存地址單元來看的話,那麼當CPU和外圍設備交換信息時,也需要用到地址寄存器和數據寄存器。
② 51單片機adc模塊的功能是
ADC模塊當然是實現模數轉換。
③ 51單片機 C語言ADC程序怎麼寫
typedef unsigned char BYTE;
typedef unsigned int WORD;
#include "reg51.h"
#include "intrins.h"
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr P1ASF = 0x9D;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
//延時
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
//初始AD寄存器
void InitADC()
{
P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
}
//AD轉換
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
return ADC_RES;
}
void main()
{ BYTE temp;
P2M1=0; P2M0=0x03; //P2.0和P2.1強推挽
InitADC();
while (1)
{
temp=GetADCResult(0);//轉換P1.0
if(temp>1)
P2|=0x03; //P1.0有電壓 P2.0和P2.1輸出高
else
P2&=0xFC; //P1.0無電壓 P2.0和P2.1輸出低
}
}
④ 51單片機c語言,ADC模數轉換的問題
對於這個,要這么看:
假設中斷A是優先順序高的中斷,中斷B是優先順序低的中斷
如果在正常執行的過程中,發生中斷A,那麼,中斷A執行完成後,會返回正常程序;
如果在正常執行過程中,發生中斷B,又在中斷B處理過程中發生中斷A,那麼,中斷A執行完成後,一定要返回的是中斷B,這是由硬體決定的,不是軟體決定的,所以,軟體沒有任何指令可以讓中斷A執行完成後直接跳過還沒有執行完的中斷B而直接回到主程序,因為這是硬體決定的,軟體做不到,即便你在高級中斷A中關閉了中斷B,但是因為你原來的中斷B還沒有執行完,所以,仍然要把沒執行完的部分執行下去,才能返回到正常程序.
對於ARM系列的可以,對於51來說,是不行的,因為51軟體指令不允許修改PC寄存器的值
⑤ 光強感測器怎麼接入51單片機 給個接入的電路圖
說個原理給你吧,剩下的自己多想想,拿別人的原理圖來就用,知識永遠都是別人的。
1、光強感測器(不知道你說的是什麼元件,我就猜是光敏電阻之類的吧)感應光強的變化,輸出的是電流或者電壓(具體視你的元件和電路而定,如果是電流就加個運放或者串聯個電阻換成電壓,可自己用萬用表測)。
2、這個電壓可能很小,所以需要運放來放大這個信號(電壓足夠大則不需要)。放大後,沒有內置AD的單片機是無法識別這種信號的(數字的世界只有0和1),所以要用一個模擬-數字轉換器,也就是ADC晶元來將這個電壓值轉換成並行或者串列的數據,並送到單片機的IO口上。當然這個ADC的工作也要靠51單片機來控制。
3、將ADC轉換出來的數據與參考光照強度值對比(一般是線性的),獲得「光強度-電壓值」公式,然後選個顯示器件,如數碼管、液晶等等,將強度數據顯示出來。
以上字字手打,希望對你有幫助。如果還不明白,可以慢慢聊!
⑥ 51單片機連電位器一定要adc嗎
一定。51單片機連電位器需要adc的,因為作AD用必須一個接電源一個接地,兩個電阻中間即VREF接單片機引腳或接一個1K的電阻再接單片機引腳。
⑦ adc0809轉換的一些問題(與51單片機配合)
1 、地址是人為定義的,在51單片機中P0口是低位地址8位與數據口8位分時復用,所有連接在地址匯流排上的器件,都必須有一個地址區間(地址塊),例如,RAM 62256需要32Kbyte,0000H--7FFFH,就是一個片選信號。
ad轉換器需要一個,經過地址解碼器,解碼後的「區間」,即儲存器的片選信號,解碼器可以分成1,2,4,8塊----,1就是單一地址,必須解碼器;看自己需要選定,選定一塊,如果需要,這一塊還可以用解碼器再次解碼,原則上可以到單個地址,ADC0809需要8個地址,用低位地址線A0,A1,A2三根,和上面所述的片選信號線,完成對該器件8路ad轉換器的選擇,低位地址線可以共用,片選線不能與其它器件共用。
2、外部數據輸入到P0口是需要有相應的器件被選擇,需要讀寫信號線控制的,這里用 /RD 讀信號,它不是單一發出,它與地址線共同完成對器件的讀寫操作。
這個例子中,需要選擇這個ADC器件(片選),還需要選擇由哪一路轉換器輸出(A0,A1,A2)。
data=P0這條指令和data=P1一樣,沒有地址輸出,沒有/RD輸出,就是沒有選擇到需要的器件。
⑧ 51單片機的adc介面在哪
埠引腳P3.4至P3.7處。
51單片機的P1是輸入埠,P0是輸出埠。ADC的控制信號(INTR、WR、RD和CS)分別在埠引腳P3.4至P3.7處可用。
51單片機是對兼容英特爾8051指令系統的單片機的統稱。