Abstract:
Key words :
一個完整的單片機系統,通常包括鍵盤輸入、顯示輸出、打印輸出、數據采集等許多功能模塊。這些功能模塊一般是通過I/O端口實現與單片機的數據交換,但是單片機的I/O端口有限,且一般用來處理數字信號,從而產生了總線式傳輸模式。
現在大多數單片機都是傳統的三總線結構,即地址,數據,控制三總線。由于方便控制,三總線得到廣泛的應用。但是作為并行總線,它也有一定的局限性。不適合遠距離的傳輸。與I/O口的數目存在矛盾。隨著電子技術的進步,發展出很多新的總線接口,如USB、I2C、CAN、SPI、1-Wire等。這些總線的特點都是串行接口,只需要幾根甚至一根線就可以實現數據的傳輸。本文通過對支持SPI總線的AD器件MAX189性能分析,簡要介紹了SPI總線在單片機系統中如何應用,并利用其制作一款簡易的電壓表。
一、SPI總線簡介
SPI(Serial Peripheral Interface)是MOTOROLA公司提出的同步串行總線方式。因其硬件功能強大而被廣泛應用。在單片機組成的智能儀器和測控系統中。如果對速度要求不高,采用SPI總線模式是個不錯的選擇。它可以節省I/O端口,提高外設的數目和系統的性能。標準SPI總線由四根線組成:串行時鐘線(SCK)、主機輸入/從機輸出線(MISO)。主機輸出/從機輸入線(MOSI)和片選信號(CS)。有的SPI接口芯片帶有中斷信號線或沒有MOSI。圖1給出了SPI的典型時序圖。
SPI主要性能如下:
全雙工,三線同步傳輸
1.05Mbit/s的最大主機位速率
四種可編程主機位速率
可編程串行時鐘極性與相位
發送結束中斷標志
寫沖突保護
總線競爭保護
SPI(Serial Peripheral Interface)是MOTOROLA公司提出的同步串行總線方式。因其硬件功能強大而被廣泛應用。在單片機組成的智能儀器和測控系統中。如果對速度要求不高,采用SPI總線模式是個不錯的選擇。它可以節省I/O端口,提高外設的數目和系統的性能。標準SPI總線由四根線組成:串行時鐘線(SCK)、主機輸入/從機輸出線(MISO)。主機輸出/從機輸入線(MOSI)和片選信號(CS)。有的SPI接口芯片帶有中斷信號線或沒有MOSI。圖1給出了SPI的典型時序圖。
SPI主要性能如下:
全雙工,三線同步傳輸
1.05Mbit/s的最大主機位速率
四種可編程主機位速率
可編程串行時鐘極性與相位
發送結束中斷標志
寫沖突保護
總線競爭保護
二、MAX189芯片
MAX189是美國美信公司設計的一種12位串行A/D轉換器。其內部集成了大帶寬跟蹤/保持電路和串行接口。轉換速率高,功耗低,精度高。并且有SPI、Microwire和TMS320兼容的4線串行接口,與微處理器接口。只需要很少的口線,很節約資源。
MAX189是美國美信公司設計的一種12位串行A/D轉換器。其內部集成了大帶寬跟蹤/保持電路和串行接口。轉換速率高,功耗低,精度高。并且有SPI、Microwire和TMS320兼容的4線串行接口,與微處理器接口。只需要很少的口線,很節約資源。
MAX189的特點:
三線高速串行接口,12位分辨率
8.5 us逐次逼近型ADC
單一5V工作電壓,工作電流1.5mA。關斷電流2uA
0-5v模擬輸入電壓范圍
使用片外時鐘源
外置參考電壓
內部跟蹤/保持電路,75ksps采樣速率
1/2LSB整體非線性度
MAX189的時序如圖2,表1給出了MAX189引腳功能。
PIN 名稱 功能說明
1 VCC 電源輸入,+5V(±5%)
2 AIN 模擬電壓輸入端,0-REF。
3 /SHDN 三電平關閉輸入端,低電平關斷
4 REF 用于模擬信號的基準電壓端,使用外部基準源時用作輸入
5 GND 模擬和數字地
6 DOUT 串行數據輸出端,數據在sclk的下降沿輸出
7 /CS 片選,低電平有效
8 SCLK 串行時鐘輸入端(最大5MHz)
三線高速串行接口,12位分辨率
8.5 us逐次逼近型ADC
單一5V工作電壓,工作電流1.5mA。關斷電流2uA
0-5v模擬輸入電壓范圍
使用片外時鐘源
外置參考電壓
內部跟蹤/保持電路,75ksps采樣速率
1/2LSB整體非線性度
MAX189的時序如圖2,表1給出了MAX189引腳功能。
PIN 名稱 功能說明
1 VCC 電源輸入,+5V(±5%)
2 AIN 模擬電壓輸入端,0-REF。
3 /SHDN 三電平關閉輸入端,低電平關斷
4 REF 用于模擬信號的基準電壓端,使用外部基準源時用作輸入
5 GND 模擬和數字地
6 DOUT 串行數據輸出端,數據在sclk的下降沿輸出
7 /CS 片選,低電平有效
8 SCLK 串行時鐘輸入端(最大5MHz)
該簡易電壓表電路采用不帶SPI接口的AT89C2051單片機,其指令系統與51系列完全兼容??梢酝ㄟ^軟件模擬SPI時序,包括串行時鐘。數據輸入和輸出。來實現對A/D器件MAX189的操作。所測電壓經過單片機的處理,采用三個七段數碼管顯示。采用SN74LS164擴展I/O口。MAX189的2腳為待測模擬電壓輸入端。圖3是簡易電壓表的原理圖,其中A為數碼管顯示電路,B為A/D轉換部分電路。

MAX189可以工作在兩種模式下。即普通狀態和關斷狀態。如果將SHDN置低電平。器件處于美斷狀態,電流小于10 uA。當把SHDN置高電平或懸空。器件就可以被操作。此時,CS在時鐘下降沿啟動轉換.在時鐘SCLK的每一個上升沿把一個最高位為“1”的控制宇節的各位送入輸入移位寄存器.并啟動串行時鐘.開始將輸入電壓值逐次逼近轉換。它用輸入跟蹤/保持(T/H)和12位逐次逼近寄存器(SAR)構成的電路系統將模擬信號轉換成12位數宇信號輸出。T/H電路不需要外部保持電容。輸出數據按照高位在前.低位在后的順序。在12個SCLK的每一個下降沿決定逐次逼近的各位并將數據送到Dout端。每一位轉換結束后Dout由低電平變為高電平。(轉換過程中不能對SCLK操作)按照時序要求。每輸入一個(移位)脈沖。下降沿取出一位數據。單片機讀取并做處理。讀出12位數據后,可以開始下一次轉換。
AT89C2051的串行端口處于模式0。數據的發送和接收都是通過RXD引腳(這里只用來發送數據).TXD則負責送出移位脈沖。其數據位由LSB開始發送/接收8個位。波特率固定為fosc/12。SN74LS164負責接收串行口發送的數據。在傳輸8個位后。其將數據并行送出驅動數碼管.顯示所測電壓值。
該電壓表小巧,方便,精度高。程序運行比較穩定。誤差在0.01V數量級。(感謝在設計過程中司佑全老師的給予的悉心指導)
源程序
該程序的作用是是該電路能測量0-5V的電壓.并用數碼管實時顯示。
;占用p1.5,p1.6,p1.7作為模擬SPI時序與MAX189連接。
源程序
該程序的作用是是該電路能測量0-5V的電壓.并用數碼管實時顯示。
;占用p1.5,p1.6,p1.7作為模擬SPI時序與MAX189連接。
sclk equ P1.5;定義緩沖區
cs equ p1.6;
dout equ p1.7;
buf equ 50h;
org 0000h
ajmp begin
begin:
acall init;初始化片內資源
acall load_data;初始化緩沖區
acall adc_init;對AD的操作
acall con;數據處理子程序
acall display;顯示子程序
acall load_data
ajmp begin
init:mov 36h,#00000000b;加載初值,取高8位數據
mov 37h,#00000000b
mov r1,#8
mov r3,柏
mov scon,#00h
mov ie,#82h
setb ti
ret
adc_init:acall init_ad;AD的控制
acall wait
acall read_ad
ret
init_ad: ;啟動AD轉換
setb cs
clr cs
ret
wait: ;等待AD轉換的結束
jnb dout,wait;
ret
fasong:jnb ti,$;發送數據
clr ti
mov sbuf,a
ret
read_ad:
Ioop1:
setb sclk
clr sclk
mov C,dout
mov A,36H;
rlc A
mov 36H,A
djnz r1,loop1;讀高8位,存放在36h
cs equ p1.6;
dout equ p1.7;
buf equ 50h;
org 0000h
ajmp begin
begin:
acall init;初始化片內資源
acall load_data;初始化緩沖區
acall adc_init;對AD的操作
acall con;數據處理子程序
acall display;顯示子程序
acall load_data
ajmp begin
init:mov 36h,#00000000b;加載初值,取高8位數據
mov 37h,#00000000b
mov r1,#8
mov r3,柏
mov scon,#00h
mov ie,#82h
setb ti
ret
adc_init:acall init_ad;AD的控制
acall wait
acall read_ad
ret
init_ad: ;啟動AD轉換
setb cs
clr cs
ret
wait: ;等待AD轉換的結束
jnb dout,wait;
ret
fasong:jnb ti,$;發送數據
clr ti
mov sbuf,a
ret
read_ad:
Ioop1:
setb sclk
clr sclk
mov C,dout
mov A,36H;
rlc A
mov 36H,A
djnz r1,loop1;讀高8位,存放在36h
loop11:
setb sclk
clr sclk
mov C,dout
mov a,37H;
RLC a
MOV 37H,a
DJNZ R3,loopll;
mov a,36h
setb cs
ret
load_data:mov buf,0fch;掃描顯示器,顯示數據
mov buf+1,#0fch
mov buf+2,#0h
mov buf+3,#0h
ret
con:mov B,#5
div AB
mov B,#10
div AB
mov DPTR,#table1
movc A,@A+DPTR
mov buf+1,A
mov A,B
mov DPTR,#TABLE
movc A,@A+DPTR
mov buf,A
ret
display:mov r0,#buf;顯示
lop:mov a,@r0
acall sent
inc r0
cjne r0,#buf+8,lop
acall delay
ret
sent:jnb li,$發送數據
clr ti
mov sbuf,a
ret
delay:mov r7,#230;
d1:mov r6,#13O
d2:djnz r6,d2
djnz r7,d1
ret
table1:db 0fdh,61h,0dbh,0f3h,067h
db 0b7h,0bfh,0e1h,0ffh,0e7h;帶小數點的八段顯示數據(0--9)
setb sclk
clr sclk
mov C,dout
mov a,37H;
RLC a
MOV 37H,a
DJNZ R3,loopll;
mov a,36h
setb cs
ret
load_data:mov buf,0fch;掃描顯示器,顯示數據
mov buf+1,#0fch
mov buf+2,#0h
mov buf+3,#0h
ret
con:mov B,#5
div AB
mov B,#10
div AB
mov DPTR,#table1
movc A,@A+DPTR
mov buf+1,A
mov A,B
mov DPTR,#TABLE
movc A,@A+DPTR
mov buf,A
ret
display:mov r0,#buf;顯示
lop:mov a,@r0
acall sent
inc r0
cjne r0,#buf+8,lop
acall delay
ret
sent:jnb li,$發送數據
clr ti
mov sbuf,a
ret
delay:mov r7,#230;
d1:mov r6,#13O
d2:djnz r6,d2
djnz r7,d1
ret
table1:db 0fdh,61h,0dbh,0f3h,067h
db 0b7h,0bfh,0e1h,0ffh,0e7h;帶小數點的八段顯示數據(0--9)
table1:
db 0fch;0
db 060h;1
db 0dah;2
db 0f2h;3
db 066h;4
db 0b6h;5
db 0beh;6
db 0e0h;7
db 0feh;8
db 0f6h;9 ;不帶小數點的八段顯示數據
end
db 0fch;0
db 060h;1
db 0dah;2
db 0f2h;3
db 066h;4
db 0b6h;5
db 0beh;6
db 0e0h;7
db 0feh;8
db 0f6h;9 ;不帶小數點的八段顯示數據
end
此內容為AET網站原創,未經授權禁止轉載。