物聯(lián)傳媒 旗下網(wǎng)站
登錄 注冊(cè)

SPI總線在51單片機(jī)系統(tǒng)中的實(shí)現(xiàn)

作者:RFID世界網(wǎng) 收編
來(lái)源:?jiǎn)纹瑱C(jī)/DSP
日期:2010-09-08 09:24:38
摘要:一個(gè)完整的單片機(jī)系統(tǒng),通常包括鍵盤(pán)輸入、顯示輸出、打印輸出、數(shù)據(jù)采集等許多功能模塊。
  一個(gè)完整的單片機(jī)系統(tǒng),通常包括鍵盤(pán)輸入、顯示輸出、打印輸出、數(shù)據(jù)采集等許多功能模塊。這些功能模塊一般是通過(guò)I/O端口實(shí)現(xiàn)與單片機(jī)的數(shù)據(jù)交換,但是單片機(jī)的I/O端口有限,且一般用來(lái)處理數(shù)字信號(hào),從而產(chǎn)生了總線式傳輸模式。 現(xiàn)在大多數(shù)單片機(jī)都是傳統(tǒng)的三總線結(jié)構(gòu),即地址,數(shù)據(jù),控制三總線。由于方便控制,三總線得到廣泛的應(yīng)用。但是作為并行總線,它也有一定的局限性。不適合遠(yuǎn)距離的傳輸。與I/O口的數(shù)目存在矛盾。隨著電子技術(shù)的進(jìn)步,發(fā)展出很多新的總線接口,如USB、I2C、CAN、SPI、1-Wire等。這些總線的特點(diǎn)都是串行接口,只需要幾根甚至一根線就可以實(shí)現(xiàn)數(shù)據(jù)的傳輸。本文通過(guò)對(duì)支持SPI總線的AD器件MAX189性能分析,簡(jiǎn)要介紹了SPI總線在單片機(jī)系統(tǒng)中如何應(yīng)用,并利用其制作一款簡(jiǎn)易的電壓表。 

  一、SPI總線簡(jiǎn)介 

  SPI(Serial Peripheral Interface)是MOTOROLA公司提出的同步串行總線方式。因其硬件功能強(qiáng)大而被廣泛應(yīng)用。在單片機(jī)組成的智能儀器和測(cè)控系統(tǒng)中。如果對(duì)速度要求不高,采用SPI總線模式是個(gè)不錯(cuò)的選擇。它可以節(jié)省I/O端口,提高外設(shè)的數(shù)目和系統(tǒng)的性能。標(biāo)準(zhǔn)SPI總線由四根線組成:串行時(shí)鐘線(SCK)、主機(jī)輸入/從機(jī)輸出線(MISO)。主機(jī)輸出/從機(jī)輸入線(MOSI)和片選信號(hào)(CS)。有的SPI接口芯片帶有中斷信號(hào)線或沒(méi)有MOSI。圖1給出了SPI的典型時(shí)序圖。

  SPI主要性能如下: 

  全雙工,三線同步傳輸 

  1.05Mbit/s的最大主機(jī)位速率 

  四種可編程主機(jī)位速率 

  可編程串行時(shí)鐘極性與相位 

  發(fā)送結(jié)束中斷標(biāo)志 

  寫(xiě)沖突保護(hù) 

  總線競(jìng)爭(zhēng)保護(hù) 

  二、MAX189芯片 

  MAX189是美國(guó)美信公司設(shè)計(jì)的一種12位串行A/D轉(zhuǎn)換器。其內(nèi)部集成了大帶寬跟蹤/保持電路和串行接口。轉(zhuǎn)換速率高,功耗低,精度高。并且有SPI、Microwire和TMS320兼容的4線串行接口,與微處理器接口。只需要很少的口線,很節(jié)約資源。 

  MAX189的特點(diǎn): 

  三線高速串行接口,12位分辨率 

  8.5 us逐次逼近型ADC 

  單一5V工作電壓,工作電流1.5mA。關(guān)斷電流2uA 

  0-5v模擬輸入電壓范圍 

  使用片外時(shí)鐘源 

  外置參考電壓 

  內(nèi)部跟蹤/保持電路,75ksps采樣速率 

  1/2LSB整體非線性度 

  MAX189的時(shí)序如圖2,表1給出了MAX189引腳功能。 

  PIN 名稱 功能說(shuō)明 

  1 VCC 電源輸入,+5V(±5%) 

  2 AIN 模擬電壓輸入端,0-REF。 

  3 /SHDN 三電平關(guān)閉輸入端,低電平關(guān)斷 

  4 REF 用于模擬信號(hào)的基準(zhǔn)電壓端,使用外部基準(zhǔn)源時(shí)用作輸入 

  5 GND 模擬和數(shù)字地 

  6 DOUT 串行數(shù)據(jù)輸出端,數(shù)據(jù)在sclk的下降沿輸出 

  7 /CS 片選,低電平有效 

  8 SCLK 串行時(shí)鐘輸入端(最大5MHz) 

  該簡(jiǎn)易電壓表電路采用不帶SPI接口的AT89C2051單片機(jī),其指令系統(tǒng)與51系列完全兼容。可以通過(guò)軟件模擬SPI時(shí)序,包括串行時(shí)鐘。數(shù)據(jù)輸入和輸出。來(lái)實(shí)現(xiàn)對(duì)A/D器件MAX189的操作。所測(cè)電壓經(jīng)過(guò)單片機(jī)的處理,采用三個(gè)七段數(shù)碼管顯示。采用SN74LS164擴(kuò)展I/O口。MAX189的2腳為待測(cè)模擬電壓輸入端。圖3是簡(jiǎn)易電壓表的原理圖,其中A為數(shù)碼管顯示電路,B為A/D轉(zhuǎn)換部分電路。 

  MAX189可以工作在兩種模式下。即普通狀態(tài)和關(guān)斷狀態(tài)。如果將SHDN置低電平。器件處于美斷狀態(tài),電流小于10 uA。當(dāng)把SHDN置高電平或懸空。器件就可以被操作。此時(shí),CS在時(shí)鐘下降沿啟動(dòng)轉(zhuǎn)換.在時(shí)鐘SCLK的每一個(gè)上升沿把一個(gè)最高位為“1”的控制宇節(jié)的各位送入輸入移位寄存器.并啟動(dòng)串行時(shí)鐘.開(kāi)始將輸入電壓值逐次逼近轉(zhuǎn)換。它用輸入跟蹤/保持(T/H)和12位逐次逼近寄存器(SAR)構(gòu)成的電路系統(tǒng)將模擬信號(hào)轉(zhuǎn)換成12位數(shù)宇信號(hào)輸出。T/H電路不需要外部保持電容。輸出數(shù)據(jù)按照高位在前.低位在后的順序。在12個(gè)SCLK的每一個(gè)下降沿決定逐次逼近的各位并將數(shù)據(jù)送到Dout端。每一位轉(zhuǎn)換結(jié)束后Dout由低電平變?yōu)楦唠娖健?轉(zhuǎn)換過(guò)程中不能對(duì)SCLK操作)按照時(shí)序要求。每輸入一個(gè)(移位)脈沖。下降沿取出一位數(shù)據(jù)。單片機(jī)讀取并做處理。讀出12位數(shù)據(jù)后,可以開(kāi)始下一次轉(zhuǎn)換。 

  AT89C2051的串行端口處于模式0。數(shù)據(jù)的發(fā)送和接收都是通過(guò)RXD引腳(這里只用來(lái)發(fā)送數(shù)據(jù)).TXD則負(fù)責(zé)送出移位脈沖。其數(shù)據(jù)位由LSB開(kāi)始發(fā)送/接收8個(gè)位。波特率固定為fosc/12。SN74LS164負(fù)責(zé)接收串行口發(fā)送的數(shù)據(jù)。在傳輸8個(gè)位后。其將數(shù)據(jù)并行送出驅(qū)動(dòng)數(shù)碼管.顯示所測(cè)電壓值。 

  該電壓表小巧,方便,精度高。程序運(yùn)行比較穩(wěn)定。誤差在0.01V數(shù)量級(jí)。(感謝在設(shè)計(jì)過(guò)程中司佑全老師的給予的悉心指導(dǎo)) 

  源程序 

  該程序的作用是是該電路能測(cè)量0-5V的電壓.并用數(shù)碼管實(shí)時(shí)顯示。 

  ;占用p1.5,p1.6,p1.7作為模擬SPI時(shí)序與MAX189連接。 

  sclk equ P1.5;定義緩沖區(qū) 

  cs equ p1.6; 

  dout equ p1.7; 

  buf equ 50h; 

  org 0000h 

  ajmp begin 

  begin: 

  acall init;初始化片內(nèi)資源 

  acall load_data;初始化緩沖區(qū) 

  acall adc_init;對(duì)AD的操作 

  acall con;數(shù)據(jù)處理子程序 

  acall display;顯示子程序 

  acall load_data 

  ajmp begin 

  init:mov 36h,#00000000b;加載初值,取高8位數(shù)據(jù) 

  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: ;啟動(dòng)AD轉(zhuǎn)換 

  setb cs 

  clr cs 

  ret 

  wait: ;等待AD轉(zhuǎn)換的結(jié)束 

  jnb dout,wait; 

  ret 

  fasong:jnb ti,$;發(fā)送數(shù)據(jù) 

  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;掃描顯示器,顯示數(shù)據(jù) 

  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,$發(fā)送數(shù)據(jù) 

  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;帶小數(shù)點(diǎn)的八段顯示數(shù)據(jù)(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 ;不帶小數(shù)點(diǎn)的八段顯示數(shù)據(jù) 

  end