C8051單片機在交流變頻調速系統中的應用
首先,先給大家一個中文的C8051的資料,天天看英文資料,看的人頭都大了。下邊是中文資料的下載地址:
(pdf格式的)
本文簡要介紹了以標準8051為內核的新型單片機 Cygnal C8051的功能,詳細說明了以C8051單片機為控制核心構 成閉環變頻調速系統的方法。經過測試,系統安全可靠,控制性 能優良。
一、Cygnal C8051單片機概述
C8051 是美國Cygnal公司生產的、與標準51兼容的高速單片機, 是全集成混合信號SOC(system on chip)單片機。Cygnal C8051 單 片機片內資源主要有:高速的(20~25MIPS)與8051全兼容的微控制 器內核、8/12 位8 通道輸入ADC、2 路12 位DAC、16 位可編程定時/ 計數器列陳(PCA)、3~5 個通用定時器、8~64 個通用I/O 口、8~ 64KB FLASH內部程序存儲器、256B~4KB內部數據RAM、片內電源 監測、片內看門狗定時器、片內時鐘源以及帶有I2C/SMBus、SPI、1~ 2 個UART串行總線等。片內JTAG仿真電路提供全速、非插入式(不 使用在片資源)的電路內仿真。C8051F 的JTAG接口不僅支持Flash ROM的讀/ 寫操作及非侵入式在系統調試,它的JTAG邏輯還為在系 統測試提供邊界掃描功能。通過邊界寄存器的編程控制,可對所有器 件引腳、SFR 總線和I/O口弱上拉功能實現觀察和控制。 C8051單片機采用開關網絡以硬件方式實現I/O端口的靈活配置。 在這種通過交叉開關配置的I/O 端口系統中,單片機外部為通用I/O 口,如P0 口、P1 口和P2 口。內有輸入/ 輸出的電路單元通過相應的 配置寄存器控制的交叉開關配置到所選擇的端口上。
二、C8051的PWM功能實現原理
C8051單片機有PWM功能和捕捉功能,這些功能都包含在一個稱 為可編程計數器列陳PCA 中。PCA 包含一個16 位的定時/ 計數器和 5個捕捉/比較模塊。16位的PCA專用定時/計數器由PCA0H和PCA0L 組成,其時鐘可以為系統時鐘的12 分頻、系統時鐘的4 分頻、定時器 0溢出、被定義ECI引腳的外部時鐘源,可通過設置PCA0MD寄存器獲 得。每個捕捉/ 比較模塊都有一個1 6 位的模塊寄存器,分別為 PCA0CPHn和PCA0CPLn,都有邊沿觸發捕捉、比較、高速輸出、PWM 四種工作方式,通過PCA0CPMn進行設置。 在PWM工作方式中,系統不斷將PCA計數器的PCA0L的值與該 模塊的PCA0CPLn的常數值進行比較。當兩者相等時,在CEXn引腳上 輸出“1”,當PCA0L溢出時,在CEXn 引腳上輸出“0”,并且自動將 保存在PCA0CPHn中的常數值送入PCA0CPLn。 在引腳CEXn引腳上輸出的PWM波實際是對計數器的PCA時鐘的 256 分頻,其占空比α為 α=[256 -(PCA0CPLn)]/256 可見,8 位PWM波的分辨率為1/256。利用高速輸出工作方式和 軟件可實現8~16 位的PWM波。 通過對交叉開關控制寄存器XBR0的有效設置,CEXn上的PWM 波就由P0 或P1 口的有關端口輸出。
三、基于C8051單片機的三相交流變頻調速系統主要硬件設 計
交流變頻調速系統原理框圖如圖所示,從結構上主要分為控制部 分和執行部分。 控制部分主要由C8051 單片機、時鐘電路、通訊接口、鍵盤與顯 示電路、光電耦合、IPM逆變器、整流模塊、轉速檢測和故障檢測、報 警電路等組成。執行部分為三相異步交流電動機。 系統的工作原理為:電機的轉速由轉速傳感器轉換成矩形脈沖信 號,經光電隔離后進入單片機計數器,由計數器值獲得電機的實際轉 速,與設定轉速比較,經Fuzzy-PID控制器調節后,單片機產生的PWM 波經6N137線性光耦進行電氣隔離后作用于逆變模塊IPM(intelligent Power module),實現電機的閉環變頻調速。霍爾電流、電壓傳感器 將檢測到的逆變模塊的三相輸出電流、電壓信號,經采樣保持后進入 單片機,完成A/D轉換后,由CPU進行處理。逆變模塊工作時所需要 的直流電壓信號由整流電路對380V電源進行全橋整流得到。
C8051F320單片機簡介
C8051F320是由美國Cygnal公司推出的C8051F系列單片機中的一款小型單片機。它是集成的混合信號片上系統SOC(System on chip),具有與MCS-51內核及指令集完全兼容的微控制器,除了具有標準8051的數字外設部件之外,片內還集成了數據采集和控制系統中常用的模擬部件和其它數字外設及功能部件。內部Flash存儲器可實現在系統編程,既可作程序存儲器也可作非易失性數據存儲。片內JTAG仿真電路提供全速的電路內仿真,不占用片內用戶資源。支持斷點、單步、觀察點、運行和停止等調試命令,并支持存儲器和寄存器校驗和修改。
C8051F320片內自帶有USB收發器和控制處理器是它區別與同一系列產品的一大特點。用C8051F320來進行USB技術開發既方便又快捷。
C8051F320單片機簡介
1.功能部件及特點
(1)模擬外設 10位的ADC(±1LSB INL):其最大可編程轉換速率可達200kbps,可多達17個外部輸入,可編程為單端輸入或差分輸入,內置一個溫度傳感器(±3℃);2個模擬比較器;2.4V的內部電壓基準;精確的Vdd監視器和欠壓檢測器。
(2)USB功能控制模塊 滿足USB2.0協議;可在全速(12 Mbps)或低速(1.5 Mbps)下運行;集成有一個時鐘恢復源,對于全速或低速傳輸均可不用外部晶振;支持8個靈活通用的端點;內置一個1K的USB專用緩沖存儲器;集成了一個USB接收器,不需要外部電阻。
(3)片內調試模塊 片內調試電路提供全速、非侵入式的在系統調試(不需仿真器);支持端點、單步、觀察點、堆棧監視器;可以觀察/修改存儲器和寄存器;比使用仿真芯片、目標仿真頭和仿真插座的仿真系統有更好的性能。
(4)工作溫度范圍:0~70℃
(5)高速8051微控制器內核 采用流水線指令結構,其70%的指令的執行時間為一個或兩個系統時鐘周期;速度可達25 MIPS(時鐘頻率為25MHz時)。
(6)存儲器 1280字節的內部數據RAM(1K+256);16K字節的可以在系統編程的Flash閃速存儲器。
(7)數字外設 25個字節寬的端點I/O;所有口線均耐5V電壓;可同時使用UART串口、硬件SMBusTM、SPITM;帶有4個可編程的16位計數器/定時器陣列;帶有5個捕捉/比較模塊的通用16位計數器/定時器。
(8)時鐘源 內部晶振,精度為0.25;支持所有USB和UART模式;外部晶振器:晶體、RC、C或外部時鐘;內置一個針對USB控制器的片上時鐘乘法器。
(9)供電電壓 片上的參考電源校準器支持USB總線電源操作;校準器的Bypass模式支持USB內部電源操作。
(10)性能特點 C8051F320在保持CISC結構及指令系統不變的情況下,對指令運行實行流水作業,推出了CIP-51的CPU模式,從而大大提高了指令運行速度,使8051兼容機系列進入了8位高速單片機行列。
傳統的單片機I/O端口大都是固定為某個特殊功能的輸入/輸出口,可以是單功能或多功能,I/O端口可編程選擇為單向/雙向以及上拉、開漏等。這種固定方式既占用較多引腳,配置又不夠靈活。C8051F320采用開關網絡以硬件方式實現I/O端口的靈活配置,如圖1所示。在這種通過交叉開關配置的I/O端口系統中,單片機外部為通用I/O口,如P0口、P1口和P2口。內有輸入/輸出的電路單元通過相應的配置寄存器控制的交叉開關配置到所選擇的端口上。
C8051F320還提供了一個完整而先進的時鐘系統,如圖2所示。在這個系統中,片內設置有一個可編程的時鐘振蕩器(無需外部器件),可提供2、4、8和16 MHz時鐘的編程設定。外部振蕩器可選擇4種方式。當程序運行時,可實現內外時鐘的動態切換。編程選擇的時鐘輸出CYSCLK除供片內使用外,還可從隨意選擇的I/O端口輸出。
C8051F320在8位單片機中率先配置了標準的EC2接口(IEEE1149.1)。在上位機軟件支持下,通過串行的EC2接口直接對產品系統進行仿真調試。C8051F的EC2接口不僅支持Flash ROM的讀/寫操作及非侵入式在系統調試,還為在系統測試提供邊界掃描功能。通過邊界寄存器的編程控制,可對所有器件引腳、SFR總線和I/O口弱上拉功能實現觀察和控制。
C8051F320把80C51單一的外部復位發展成多源復位:上電復位、掉電復位、外部引腳復位、軟件復位、時鐘檢測復位、比較器0復位和引腳配置復位。眾多的復位源為保障系統的安全、操作的靈活性以及零功耗系統設計帶來極大的好處。
2.引腳及封裝
圖3為其引腳圖。其中,Vdd為數字電源;GND為模擬地;REGIN為5V校準器的輸入端;RST/C2CK為設備的復位引腳或EC2調試接口的時鐘信號;P3.0/C2D為端口3.0或EC2調試接口的雙向信號引腳;VBUS為USB總線輸入腳;D+為USB的D+;D-為USB的D-;P0.2/XTAL1為端口0.2或外部晶振輸入;P0.3/XTAL2為端口0.3或外部晶振輸出;P0.6/CNVSTR為端口0.6或ADC0外部轉換開始輸入腳;P0.7/VRFF為端口0.7或外部參考電源的輸入端或輸出端;P0.0、P0.1、P0.4、P0.5、P1.0~P1.7、P2.0~P2.7 均為相應的端口引腳。
3.電氣特性
校準器的輸入電壓(REGIN引腳)為4.0~5.25V;Vdd(電壓校準器的輸出)為3.0~3.6V(通常取3.3V);VREG偏流(電壓校準器有效時)為70μA;CPU和USB運行時的供給電流為18mA(CPU時鐘為24MHz,USB時鐘為48MHz時)或9mA(CPU時鐘為12MHz,USB時鐘為6 MHz時);內部晶振頻率為12.0MHz;USB時鐘頻率為48.0MHz(全速)、6.0MHz(低速)。
典型的USB應用
C8051F320是一款完全集成的混合信號系統級芯片,片內集成了數據采集和控制系統中常用的模擬部件和其它數字外設及功能部件。其中值得我們注意的是,它集成有一個USB接口,所以我們也可將其看成是一款帶USB接口的微處理器。C8051F320與市場上同類帶USB接口的微處理器相比較,它內部強大的功能模塊大大簡化了USB技術的開發,還能很好地縮短開發周期。下面介紹它的一個典型的USB技術應用。
在這個應用中,主機通過C8051F320芯片中USB接口與C8051F320通訊,來控制信號燈的狀態,檢測開關按鈕的狀態,并采集分壓器和片內溫度傳感器中的數據。在整個通訊中,我們還要使用EC2適配器來進行系統調試。系統的電路原理圖見圖4。
在該應用系統中,SW1按鈕開關連接到C8051F320的復位引腳。按一下SW1,設備將進入硬件復位狀態。將J15跳線的兩引腳連接上后,C8051F320就在外部電源的模式下開始工作。如果要讓320在自己供電的模式下運行,就需在斷開J15的同時,連接上J12的兩個引腳。J4是該應用系統的調試接口。將串行適配器EC2通過該接口連接到C8051F320,可實現在線調試和Flash編程的寫入和擦除(EC2的說明和使用請參見Cygnal公司的產品數據手冊)。J14是USB(通用串行總線)連接器,通過它就可將USB接口和C8051F320芯片連接起來。我們常將USB電纜的一端接上J14,另一端接在計算機的USB通訊口上。這樣就能實現數據傳輸任務。將J12跳線的兩引腳連接上后,外部電容就連接到了C8051F320的P0.7腳。C8051F320的P1.7引腳上連接有一個滑動電阻,只要將J13接上,C8051F320就可從P1.7腳采集到邏輯信號。實際應用中,我們要進行USB技術開發和應用,其硬件部分可在圖4的基礎上根據需要進行擴展。
完整的USB應用系統除了必要的硬件部分,還包括軟件部分,圖5、圖6為主程序流程圖及USB中斷服務程序流程圖。軟件部分分為三大塊:在C8051F320設備上運行的固件程序,在主機上運行的USB設備驅動程序,一個主機應用程序。主機應用程序通過USB接口與C8051F320通訊,允許用戶觀察并改變C8051F320設備上的I/O外設的狀態。在運行主機應用程序前,我們要先安裝設備的USB驅動程序。當設備通過USB接口與主機連接好后,應用程序就開始枚舉,并通過端點0、1和2來完成設備與主機之間的數據傳輸。在USB協議中,端點0數據包被定義為控制數據包,端點1和2分別用來輸入數據和輸出數據。數據包用來顯示各個端口引腳上的邏輯值。在上述應用系統中,P1.7腳上分壓器的輸出邏輯值就通過應用程序中的端點1數據包來傳輸到主機,從而主機讀出數據并在用戶界面上顯示出來。在本刊的網站上給出了源程序,供讀者參考。
C8051F320是一款性能優化的SOC高速單片機,也是一個功能強大的USB接口器件。在開發和應用其USB技術時,與同類產品相比,它在性能、速度、方便性以及成本等方面都具有很大的優勢。
//-----------------------------------------------------------------------------
// Blinky.c
//-----------------------------------------------------------------------------
// Copyright (C) 2005 Silicon Laboratories, Inc.
//
// AUTH: HF
// DATE: 06 NOV 02
//
// MOD: BD
// DATE: 12 APR 04
// - changed timer 2 setup of CKCON
// from: CKCON &= ~0x60;
// to: CKCON &= ~0x30;
//
// This program flashes the green LED on the C8051F32x target board about
// five times a second using the interrupt handler for Timer2.
//
// Target: C8051F32x
//
// Tool chain: KEIL Eval 'c'
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F32x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz
sbit LED = P2^2; // LED='1' means ON
sbit SW2 = P2^0; // SW2='0' means switch pressed
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (int counts);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
// disable watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
SYSCLK_Init (); // Initialize system clock to
// 24.5MHz
PORT_Init (); // Initialize crossbar and GPIO
Timer2_Init (SYSCLK / 12 /2); // Init Timer2 to generate
// interrupts at a 10Hz rate.
EA = 1; // enable global interrupts
while (1) { // spin forever
}
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal 24.5MHz / 8
// oscillator as its clock source. Also enables missing clock detector reset.
//
void SYSCLK_Init (void)
{
OSCICN = 0x80; // configure internal oscillator for
// its lowest frequency
RSTSRC = 0x04; // enable missing clock detector
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
// P3.3 - LED (push-pull)
//
void PORT_Init (void)
{
XBR0 = 0x00; // no digital peripherals selected
XBR1 = 0x40; // Enable crossbar and weak pull-ups
P2MDOUT |= 0x04; // enable LED as a push-pull output
}
//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
//
// Configure Timer2 to 16-bit auto-reload and generate an interrupt at
// interval specified by
//
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK/12 as timebase
CKCON &= ~0x30; // Timer2 clocked based on T2XCLK;
TMR2RL = -counts; // Init reload values
TMR2 = 0xffff; // set to reload immediately
ET2 = 1; // enable Timer2 interrupts
TR2 = 1; // start Timer2
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
// This routine changes the state of the LED whenever Timer2 overflows.
//
void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // clear Timer2 interrupt flag
LED = ~LED; // change state of LED
}
c8051f020的smbus總線完全符合國際系統管理總線IEE 1.1版標準,與I2C完全兼容,可方便地與smbus總線接口和I2C接口器件通信,它由一根雙向數據線sdl 和scl時鐘線構成,可與不同速度的器件通信,因此具有很好的兼容性(通過延長scl低電平時間實現),smbus可工作在主發送器/主接收器/從接收器/從發送器幾種模式.c8051f320的smbus具有五個SFR,它們是:SMBUS0CN SMBUS0STA SMBUS0ADDR SMBUS0CR SMBUS0DA,下面是它的工作過程. (1)先復習一下I2C總線協議,I2C總線可工作在兩種方試,從主器件到從器件的寫,從從器件到主器件的讀,兩種操作都由主器件發起,不過,沒有必要指定一個器件為主器件,任何一個發起指令的器件都將成為主器件,一次操作包括一個開始條件(以SCL的高電平,SDL的低電平表示),一個地址字節(7-1為7位器件地址,0為方向位:1為讀,0為寫),一個或多個字節數據,和一個停止條件(由SCL的高電平,SDL的高電平表示)組成.另外,每個器件在接收到數據后必需應答(ACK),用SCL高電平SCL的低電平表示,否則回答NACK,用SCL高電平SDL的高電平來表示.其時序如下圖 (2)關于總線仲裁 主器件只有在總線空閑時才能占用總線,(一個停止位后或當SCL和SDL保持高電平超過一定時間,我們就認為總線是空閑的,此時總線可以發起操作),當兩個或多個器件同時發起操作時,總線仲裁機制將保證有且只有一個器件贏得總線,具體的過程是它們繼續發起條件,直到當一個器件發送高電平,而另一個器件發送低電平時,由于總線是開漏輸出,于是總線被拉低,于是發送高電平的器件檢測到低電平而主動放棄總線而變成從器件,而發送低電平的器件贏得總線并繼續發送數據. (3)AUX開關 在使用smbus總線時,需要根據器件優先權正確設置交叉開關,例:如果使用UART0而不使用SPI總線,則SMBUS占用P0^2和P0^3,具體情況具體處理.優先權譯碼表如下圖所示. (4)SFR描述 1.SMB0CN:SMBus0 控制寄存器 復位值 BUSY ENSMB STA STO SI AA FTE TOE 00000000 位7 位6 位5 位4 位3 位2 位1 位0 (可位尋址) SFR地址: 0xC0 位 7: BUSY:忙狀態標志 0:SMBus0 空閉 1:SMBus0 忙 位 6: ENSMB:SMBus0 使能 該位使能/禁止 SMBus0 串行接口 0:禁止 SMBus 1:使能 SMBus 位 5: STA:SMBus0 起始標志 0:不發送起始條件。 1:當作為主器件時,若總線空閉,則發送出一個起始條件。 (如果總線不空閑, 在收到停止條件后再發送起始條件。 )如果 STA 被置 1,而此時已經發送或接 收了一個或多個字節并且沒有收到停止條件,則發送一個重復起始條件。為保 證操作正確,應在對 STA位置 1 之前,將 STO標志清 0。 位 4: STO:SMBus0 停止標志 0:不發送停止條件。 1:將 STO置為邏輯 1 將發送一個停止條件。當收到停止條件時,硬件將 STO 清為邏輯 0。如果 STA 和 STO 都被置位,則發送一個停止條件后再發送一個 起始條件。在從方式,置位 STO標志將導致 SMBus 的行為象收到了停止條件 一樣。 位 3: SI:SMBus0 串行中斷標志 當 SMBus0 進入 27 種可能狀態之一時該位被硬件置位。 (狀態碼 0xF8 不使 SI 置位。 )當 SI 中斷被允許時,該位置 1 將導致 CPU 轉向 SMBus0 中斷服務程 序。該位不能被硬件自動清 0,必須用軟件清除。 位 2: AA:SMBus0 確認標志 該位定義在 SCL 線應答周期內返回的應答類型。 0:在應答周期內返回“非確認” (SDA線高電平) 。 1:在應答周期內返回“確認” (SDA線低電平) 。 位 1: FTE:SMBus0 空閉定時器使能位 0:無 SCL 高電平超時。 1:當 SCL 高電平時間超過由 SMB0CR 規定的極限值時發生超時。 位 0: TOE:SMBus0 超時使能位 0:無 SCL 低電平超時。 1:當 SCL 處于低電平的時間超過由定時器 3(如果被允許)定義的極限值時 發生超時。 2.SMB0CR:SMBus0 時鐘速率寄存器 R/W R/W R/W R/W R/W R/W R/W R/W 復位值 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xCF 位 7-0: SMB0CR.[7:0]:SMBus0 時鐘速率預設值 SMB0CR 時鐘速率寄存器用于控制主方式下串行時鐘 SCL 的頻率。存儲在 SMB0CR 寄存器中的 8位字預裝一個專用的 8位定時器。該定時器向上計數, 當計滿回到 0x00 時 SCL 改變邏輯狀態。 SMB0CR[7:0]的值應根據下面的方程設置,其中 SMB0CR 是 SMB0CR 寄存器 中的 8 位無符號數值。SYSCLK 是系統時鐘頻率(單位為 Hz) 。 SMB0CR<(288-0.85xSYSCLK)/1.125E6 SCL 信號的高電平和低電平時間由下式給出: TLOW=(256-SMB0CR)/SYSCLK THIGH=(258-SMB0CR)/SYSCLK+625NS 使用相同的 SMB0CR 值,總線空閑超時周期由下式給出。 TBFT=10X(256-SMB0CR)+1/SYSCLK (3)SMB0DAT:SMBus0 數據寄存器 R/W R/W R/W R/W R/W R/W R/W R/W 復位值 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC2 位 7-0: SMB0DAT:SMBus0 數據 SMB0DAT 寄存器保存要發送到 SMBus0 串行接口上的一個數據字節,或剛從 SMBus0 串行接口接收到的一個字節。一旦 SI 串行中斷標志(SMB0CN.3)被 置為邏輯 1,CPU 即可讀或寫該寄存器。當 SI 標志位不為 1 時,系統可能正 在移入/移出數據,此時 CPU不應訪問該寄存器。 (4)SMB0ADR:SMBus0 地址寄存器 復位值 SLV6 SLV5 SLV4 SLV3 SLV2 SLV1 SLV0 GC 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC3 位 7-1: SLV6-SLV0:SMBus0 從地址 這些位用于存放 7 位從地址,當器件工作在從發送器或從接收器方式時, SMBus0 將應答該地址。SLV6 是地址的最高位,對應從 SMBus0 收到的地址 字節的第一位。 位 0: GC:全局呼叫地址使能 該位用于使能全局呼叫地址(0x00)識別。 0:忽略全局呼叫地址。 1:識別全局呼叫地址。 (5) SMB0STA:SMBus 狀態寄存器 復位值 STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0 11111000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC1 位 7-3: STA7-STA3:SMBus0 狀態代碼 這些位含有 SMBus0 狀態代碼。共有 28 個可能的狀態碼,每個狀態碼對應一 個 SMBus 狀態。在 SI 標志(SMB0CN.3)置位時,SMB0STA 中的狀態碼有 效。 當 SI標志為邏輯 0時, SMB0STA 中的內容無定義。 任何時候向 SMB0STA 寄存器寫入將導致不確定的結果。 位 2-0: STA2-STA0:當 SI 標志位為邏輯 1 時,這三個 SMB0STA 最低位的讀出值總 是為邏輯 0。 下面是smbus0的狀態碼,用這個狀態碼去判斷中斷服務程序該做什么 下面是例程,由于小弟才能力有限,未免有過多錯誤,還請多多指教,這個程序是讀取pcf8563的秒時間,并把它顯示在s012864上面.(由于字數限制,接下篇)
接上篇c8051f020smbus總線應用
2008-05-04 22:45
#include sbit a0 =P2^0; sbit wr_rw=P2^4; sbit cs1=P2^1; sbit rd_EN=P2^3; sbit rst=P2^5; sbit bal=P3^0; //-----------------------------------------------// //---------define smbus0/i2c state constant------// //-----------------------------------------------// #define SMB_BUS_ERROR 0x60 //BUS error #define SMB_BUS_DSACK_R 0x28 //Data sent and recive ACK #define SMB_BUS_DSNACK_R 0x30 //Data sent and recive NACK #define SMB_BUS_STR 0x08 //Start condition sent and recive ACK #define SMB_BUS_STRR 0x10 //repeat start condition #define SMB_BUS_ADD_W_ACK 0x18 //address and write #define SMB_BUS_ADD_R_ACK 0x40 //address and reader #define SMB_BUS_NACK 0x30 //DATA sent reciver NACK #define SMB_BUS_ADD_W_NACK 0x20 //address sent and recive NACK #define SMB_BUS_ADD_R_NACK 0x48 //address sent and recive NACK #define SMB_BUS_DRACK_t 0x50 //Data recive and ACK sent #define SMB_BUS_DRNACK_t 0x58 //Data recive and NACK sent #define SMB_BUS_CMLOST 0X38 //can not get the bus free bit smb_busy; char OUT; char OUTADD; char IN; char watch; char count; char intdata; //------------------define pcf8563 address----------------------// #define PCF8563_READ 0xa3 //PCF8563 READ COMMAND #define PCF8563_WRITE 0xa2 //PCF8563 WRITE COMMAND #define PCF8563_CONTROLA 0X00 //Pcf8563 control reg1 #define PCF8563_CONTROLB 0X01 //pcf8563 control reg2 #define PCF8563_CLKOUT 0x0d //pcf8563 clkout reg #define PCF8563_TCON 0X0E //CONTENT CONTROL reg #define PCF8563_TCT 0x0f //TIMER value #define PCF8563_SEC 0X02 //SECOND CON #define PCF8563_MIN 0X03 //MIN con #define PCF8563_HOU 0x04 //HOU con #define PCF8563_DAY 0x05 //DAY con #define PCF8563_WEK 0X06 //WEK con #define PCF8563_MON 0x07 //MON CON #define PCF8563_YEAR 0X08 //YEAR con #define PCF8563_MINALR 0x09 //MIN alarming #define PCF8563_HOUALR 0X0A //HOUR alarming #define PCF8563_DAYALR 0X0B //DAY alarming #define PCF8563_WEKALR 0X0C //WEK alarming //--------------predeine time const----------// void SM_SEND(char address,char outpackage) { while (smb_busy); smb_busy=1; SMB0CN=0X44; OUTADD=address; OUT=outpackage; STA=1; } char SM_RECEIVE(char addr) { while (smb_busy); // 等待總線空閑 smb_busy = 1; //占用SMBus(設置為忙) SMB0CN = 0x44; // 允許SMBus,應答周期發ACK OUTADD=addr; STA = 1; // 啟動傳輸過程 while (smb_busy); // 等待傳輸結束 return IN; } void SMBUS_ISR(void) interrupt 7 { watch=SMB0STA; switch(watch) { case SMB_BUS_STR: SMB0DAT=OUTADD; STA=0; break; case SMB_BUS_ADD_W_ACK: SMB0DAT=OUT; break; case SMB_BUS_ADD_W_NACK: STO=1; STA=1; break; case SMB_BUS_DSACK_R: STO=1; smb_busy=0; break; case SMB_BUS_DSNACK_R: STO=1; STA=1; break; case SMB_BUS_CMLOST: STO=1; STA=1; break; case SMB_BUS_ADD_R_ACK: AA=0; break; case SMB_BUS_ADD_R_NACK: STA=1; break; case SMB_BUS_DRACK_t: STO=1; smb_busy=0; break; case SMB_BUS_DRNACK_t: IN=SMB0DAT; STO=1; smb_busy=0; break; default: STO=1; smb_busy=0; break; } SI=0; } void Delayl(void) { int x; for(x = 0;x < 5000;x) x++; } void delay() { unsigned char data i=5; while(i-->0); } void wdata80(unsigned char dat) { cs1=0; a0=1; //數據 wr_rw=0;//寫 rd_EN=1; delay(); P1=dat; delay(); rd_EN=0; } void w_com80(unsigned char x) { cs1=0; a0=0;//命令 wr_rw=0;//寫 rd_EN=1;//ENABLE delay(); P1=x; delay(); rd_EN=0; } void w_com(unsigned char x) { w_com80(x); } void display_clr(void)//P是圖片數據的首地址 { unsigned char seg; unsigned char page; for(page=0xb0;page<0xb9;page++) //寫頁地址共 8 頁 0xb0----0xb8 { w_com(page); w_com(0x10); //列地址,高低字節兩次寫入,從第 0 列開始 w_com(0x00); for(seg=0;seg<128;seg++)//寫 128 列 { cs1=0; a0=1; //數據 wr_rw=0;//寫 rd_EN=1; delay(); P1=0x00; delay(); rd_EN=0; } } } void display_map(unsigned char *p)//P是圖片數據的首地址 { unsigned char seg; unsigned char page; for(page=0xb0;page<0xb3;page++) //寫頁地址共 8 頁 0xb0----0xb8 { w_com(page); w_com(0x10); //列地址,高低字節兩次寫入,從第 0 列開始 w_com(0x00); for(seg=0;seg<10;seg++)//寫 128 列 { wdata80(*p++); } } } unsigned char code Bmp0[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 0 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:56:21 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0xE0,0x78,0x08,0x04,0x08,0xF0,0x00,0x00,0x00,0x00,0x1F,0x78,0x40,0x40, 0x60,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp1[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 1 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:50:59 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7F,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp2[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 2 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:51:30 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0x18,0x08,0x0C,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x4C,0x46, 0x41,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp3[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 3 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:52:05 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0x00,0x08,0x08,0x08,0xD8,0x20,0x00,0x00,0x00,0x00,0x40,0x40,0x41,0x41, 0x63,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp4[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 4 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:53:00 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0x00,0xC0,0x20,0x10,0xFC,0x00,0x00,0x00,0x00,0x0C,0x0F,0x0C,0x0C,0x0C, 0x7F,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp5[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 5 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:53:33 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0xC0,0xF0,0x88,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x41, 0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp6[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 6 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:54:18 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0xC0,0x60,0x10,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x3F,0x41,0x41,0x41, 0x63,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp7[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 7 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:54:57 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0x18,0x08,0x08,0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp8[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 8 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:55:21 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0x78,0x88,0x04,0x08,0xF8,0x20,0x00,0x00,0x00,0x00,0x7C,0x43,0x43,0x47, 0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp9[]= { /*------------------------------------------------------------------------------ ; 若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。 ; 源文件 / 文字 : 9 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點陣液晶字模,縱向取模,字節倒序/30字節 ; 數據轉換日期 : 2008-4-19 13:55:48 ------------------------------------------------------------------------------*/ //寬的像素數,高的像素數,寬的字節數,參數設置可選 0x00,0x00,0xF0,0x08,0x04,0x08,0x38,0xE0,0x00,0x00,0x00,0x00,0x03,0x42,0x64,0x32, 0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; void config (void) { //Local Variable Definitions //---------------------------------------------------------------- // Watchdog Timer Configuration // // WDTCN.[7:0]: WDT Control // Writing 0xA5 enables and reloads the WDT. // Writing 0xDE followed within 4 clocks by 0xAD disables the WDT // Writing 0xFF locks out disable feature. // // WDTCN.[2:0]: WDT timer interval bits // NOTE! When writing interval bits, bit 7 must be a 0. // // Bit 2 | Bit 1 | Bit 0 //------------------------ // 1 | 1 | 1 Timeout interval = 1048576 x Tsysclk // 1 | 1 | 0 Timeout interval = 262144 x Tsysclk // 1 | 0 | 1 Timeout interval = 65636 x Tsysclk // 1 | 0 | 0 Timeout interval = 16384 x Tsysclk // 0 | 1 | 1 Timeout interval = 4096 x Tsysclk // 0 | 1 | 0 Timeout interval = 1024 x Tsysclk // 0 | 0 | 1 Timeout interval = 256 x Tsysclk // 0 | 0 | 0 Timeout interval = 64 x Tsysclk // //------------------------ WDTCN = 0x07; // Watchdog Timer Control Register WDTCN = 0xDE; // Disable WDT WDTCN = 0xAD; WDTCN = 0xFF; // Disable WDT Lockout //---------------------------------------------------------------- // CROSSBAR REGISTER CONFIGURATION // // NOTE: The crossbar register should be configured before any // of the digital peripherals are enabled. The pinout of the // device is dependent on the crossbar configuration so caution // must be exercised when modifying the contents of the XBR0, // XBR1, and XBR2 registers. For detailed information on // Crossbar Decoder Configuration, refer to Application Note // AN001, "Configuring the Port I/O Crossbar Decoder". //---------------------------------------------------------------- // Configure the XBRn Registers XBR0 = 0x05; // XBAR0: Initial Reset Value XBR1 = 0x00; // XBAR1: Initial Reset Value XBR2 = 0xC0; // XBAR2: Initial Reset Value // Select Pin I/0 // NOTE: Some peripheral I/O pins can function as either inputs or // outputs, depending on the configuration of the peripheral. By default, // the configuration utility will configure these I/O pins as push-pull // outputs. // Port configuration (1 = Push Pull Output) P0MDOUT = 0x00; // Output configuration for P0 P1MDOUT = 0xff; // Output configuration for P1 P2MDOUT = 0xff; // Output configuration for P2 P3MDOUT = 0x03; // Output configuration for P3 P74OUT = 0xff; // Output configuration for P4-7 P1MDIN = 0xff; // Input configuration for P1 // View port pinout // The current Crossbar configuration results in the // following port pinout assignment: // Port 0 // P0.0 = unassigned (Open-Drain Output/Input) // P0.1 = unassigned (Open-Drain Output/Input) // P0.2 = unassigned (Open-Drain Output/Input) // P0.3 = unassigned (Open-Drain Output/Input) // P0.4 = unassigned (Open-Drain Output/Input) // P0.5 = unassigned (Open-Drain Output/Input) // P0.6 = unassigned (Open-Drain Output/Input) // P0.7 = unassigned (Open-Drain Output/Input) // Port 1 // P1.0 = unassigned (Open-Drain Output/Input)(Digital) // P1.1 = unassigned (Open-Drain Output/Input)(Digital) // P1.2 = unassigned (Open-Drain Output/Input)(Digital) // P1.3 = unassigned (Open-Drain Output/Input)(Digital) // P1.4 = unassigned (Open-Drain Output/Input)(Digital) // P1.5 = unassigned (Open-Drain Output/Input)(Digital) // P1.6 = unassigned (Open-Drain Output/Input)(Digital) // P1.7 = unassigned (Open-Drain Output/Input)(Digital) // Port 2 // P2.0 = unassigned (Open-Drain Output/Input) // P2.1 = unassigned (Open-Drain Output/Input) // P2.2 = unassigned (Open-Drain Output/Input) // P2.3 = unassigned (Open-Drain Output/Input) // P2.4 = unassigned (Open-Drain Output/Input) // P2.5 = unassigned (Open-Drain Output/Input) // P2.6 = unassigned (Open-Drain Output/Input) // P2.7 = unassigned (Open-Drain Output/Input) // Port 3 // P3.0 = unassigned (Open-Drain Output/Input) // P3.1 = unassigned (Open-Drain Output/Input) // P3.2 = unassigned (Open-Drain Output/Input) // P3.3 = unassigned (Open-Drain Output/Input) // P3.4 = unassigned (Open-Drain Output/Input) // P3.5 = unassigned (Open-Drain Output/Input) // P3.6 = unassigned (Open-Drain Output/Input) // P3.7 = unassigned (Open-Drain Output/Input) EMI0CF = 0x20; // External Memory Configuration Register //---------------------------------------------------------------- // Comparators Register Configuration // // Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 //------------------------------------------------------------------ // R/W | R | R/W | R/W | R/W | R/W | R/W | R/W //------------------------------------------------------------------ // Enable | Output | Rising | Falling| Positive | Negative // | State | Edge | Edge | Hysterisis | Hysterisis // | Flag | Int. | Int. | 00: Disable | 00: Disable // | | Flag | Flag | 01: 5mV | 01: 5mV // | | | | 10: 10mV | 10: 10mV // | | | | 11: 20mV | 11: 20mV // ---------------------------------------------------------------- CPT0CN = 0x00; // Comparator 0 Control Register CPT1CN = 0x00; // Comparator 1 Control Register //Comp1 marker //---------------------------------------------------------------- // Oscillator Configuration //---------------------------------------------------------------- OSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x07; // Internal Oscillator Control Register //---------------------------------------------------------------- // Reference Control Register Configuration //---------------------------------------------------------------- REF0CN = 0x00; // Reference Control Register //---------------------------------------------------------------- // ADC Configuration //---------------------------------------------------------------- AMX0CF = 0x60; // AMUX Configuration Register AMX0SL = 0x00; // AMUX Channel Select Register ADC0CF = 0xF8; // ADC Configuration Register ADC0CN = 0x00; // ADC Control Register ADC0LTH = 0x00; // ADC Less-Than High Byte Register ADC0LTL = 0x00; // ADC Less-Than Low Byte Register ADC0GTH = 0xFF; // ADC Greater-Than High Byte Register ADC0GTL = 0xFF; // ADC Greater-Than Low Byte Register AMX1SL = 0x00; // AMUX1 Channel Select Register ADC1CF = 0xF8; // ADC1 Configuration Register ADC1CN = 0x00; // ADC1 Control Register //---------------------------------------------------------------- // DAC Configuration //---------------------------------------------------------------- DAC0CN = 0x00; // DAC0 Control Register DAC0L = 0x00; // DAC0 Low Byte Register DAC0H = 0x00; // DAC0 High Byte Register DAC1CN = 0x00; // DAC1 Control Register DAC1L = 0x00; // DAC1 Low Byte Register DAC1H = 0x00; // DAC1 High Byte Register //---------------------------------------------------------------- // SPI Configuration //---------------------------------------------------------------- SPI0CN = 0x00; // SPI Control Register SPI0CFG = 0x00; // SPI Configuration Register SPI0CKR = 0x00; // SPI Clock Rate Register //---------------------------------------------------------------- // UART Configuration //---------------------------------------------------------------- SCON0 = 0x00; // Serial Port Control Register SADEN0 = 0x00; // Serial 0 Slave Address Enable SADDR0 = 0x00; // Serial 0 Slave Address Register PCON = 0x00; // Power Control Register SCON1 = 0x00; // Serial Port 1 Control Register SADEN1 = 0x00; // Serial 1 Slave Address Enable SADDR1 = 0x00; // Serial 1 Slave Address Register //---------------------------------------------------------------- // SMBus Configuration //---------------------------------------------------------------- SMB0CN = 0x40; // SMBus Control Register SMB0ADR = 0x00; // SMBus Address Register SMB0CR = 0xEC; // SMBus Clock Rate Register //---------------------------------------------------------------- // PCA Configuration //---------------------------------------------------------------- PCA0MD = 0x00; // PCA Mode Register PCA0CN = 0x00; // PCA Control Register PCA0H = 0x00; // PCA Counter/Timer High Byte PCA0L = 0x00; // PCA Counter/Timer Low Byte //Module 0 PCA0CPM0 = 0x00; // PCA Capture/Compare Register 0 PCA0CPL0 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH0 = 0x00; // PCA Counter/Timer High Byte //Module 1 PCA0CPM1 = 0x00; // PCA Capture/Compare Register 1 PCA0CPL1 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH1 = 0x00; // PCA Counter/Timer High Byte //Module 2 PCA0CPM2 = 0x00; // PCA Capture/Compare Register 2 PCA0CPL2 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH2 = 0x00; // PCA Counter/Timer High Byte //Module 3 PCA0CPM3 = 0x00; // PCA Capture/Compare Register 3 PCA0CPL3 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH3 = 0x00; // PCA Counter/Timer High Byte //Module 4 PCA0CPM4 = 0x00; // PCA Capture/Compare Register 4 PCA0CPL4 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH4 = 0x00; // PCA Counter/Timer High Byte //---------------------------------------------------------------- // Timer Configuration //---------------------------------------------------------------- CKCON = 0x00; // Clock Control Register TH0 = 0x00; // Timer 0 High Byte TL0 = 0x00; // Timer 0 Low Byte TH1 = 0x00; // Timer 1 High Byte TL1 = 0x00; // Timer 1 Low Byte TMOD = 0x00; // Timer Mode Register TCON = 0x00; // Timer Control Register RCAP2H = 0x00; // Timer 2 Capture Register High Byte RCAP2L = 0x00; // Timer 2 Capture Register Low Byte TH2 = 0x00; // Timer 2 High Byte TL2 = 0x00; // Timer 2 Low Byte T2CON = 0x00; // Timer 2 Control Register TMR3RLL = 0x00; // Timer 3 Reload Register Low Byte TMR3RLH = 0x00; // Timer 3 Reload Register High Byte TMR3H = 0x00; // Timer 3 High Byte TMR3L = 0x00; // Timer 3 Low Byte TMR3CN = 0x00; // Timer 3 Control Register RCAP4H = 0x00; // Timer 4 Capture Register High Byte RCAP4L = 0x00; // Timer 4 Capture Register Low Byte TH4 = 0x00; // Timer 4 High Byte TL4 = 0x00; // Timer 4 Low Byte T4CON = 0x00; // Timer 4 Control Register //---------------------------------------------------------------- // Reset Source Configuration // // Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 //------------------------------------------------------------------ // R | R/W | R/W | R/W | R | R | R/W | R //------------------------------------------------------------------ // JTAG |Convert | Comp.0 | S/W | WDT | Miss. | POR | HW // Reset |Start | Reset/ | Reset | Reset | Clock | Force | Pin // Flag |Reset/ | Enable | Force | Flag | Detect| & | Reset // |Enable | Flag | & | | Flag | Flag | Flag // |Flag | | Flag | | | | //------------------------------------------------------------------ // NOTE! : Comparator 0 must be enabled before it is enabled as a // reset source. // // NOTE! : External CNVSTR must be enalbed through the crossbar, and // the crossbar enabled prior to enabling CNVSTR as a reset source //------------------------------------------------------------------ RSTSRC = 0x00; // Reset Source Register //---------------------------------------------------------------- // Interrupt Configuration //---------------------------------------------------------------- IE = 0x80; //Interrupt Enable IP = 0x00; //Interrupt Priority EIE1 = 0x02; //Extended Interrupt Enable 1 EIE2 = 0x00; //Extended Interrupt Enable 2 EIP1 = 0x00; //Extended Interrupt Priority 1 EIP2 = 0x00; //Extended Interrupt Priority 2 // other initialization code here... } //End of config void init_pcf8563(void) { intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_CONTROLA); while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_CONTROLB); while (smb_busy); intdata=0x80; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_CLKOUT);//CLK輸出頻率32.768K while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_MINALR);//分報警無效 while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_HOUALR);//時報警無效 while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_DAYALR);//日報警無效 while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_WEKALR);//星期報警無效 } void main(void) { char IND; char CHG; config(); rst=0; delay(); rst=1; delay(); w_com80(0xaf); w_com80(0x40); w_com80(0xa0); w_com80(0xa6); w_com80(0xa4); w_com80(0xa2); w_com80(0xc8); w_com80(0x2f); w_com80(0x25); w_com80(0x81); w_com80(0x15); display_clr();小弟不知道為什么每次配置好so16824以后,每次都要全屏清空一下,不然會花屏; P3=0x02; smb_busy=0; while(1) { SM_SEND(PCF8563_WRITE,PCF8563_SEC); IND=SM_RECEIVE(PCF8563_READ); CHG=IND&0x0f; switch (CHG) { case 0x00: display_map(&Bmp0); break; case 0x01: display_map(&Bmp1); break; case 0x02: display_map(&Bmp2); break; case 0x03: display_map(&Bmp3); break; case 0x04: display_map(&Bmp4); break; case 0x05: display_map(&Bmp5); break; case 0x06: display_map(&Bmp6); break; case 0x07: display_map(&Bmp7); break; case 0x08: display_map(&Bmp8); break; case 0x09: display_map(&Bmp9); break; default: break; } } }
BTF320開發評估板
1
BTF320開發評估板使用說明書
Version: 1.0
目錄
一BT F320開發評估板功能簡介……………………2
二BT F320開發評估板范例
三Silicon Laboratories IDE安裝配置…………5
四BT F320開發評估板使用方法……………………6
五BT F320開發評估板原理圖………………………7
BTF320開發評估板
2
一.BT F320開發評估板功能簡介
1.產品簡介
BT F320評估板是新華龍電子有限公司針對
推出的一款開發,評估板.集成了C8051F320單片機的基本外圍電路和典型應用電路,開
發者可通過評估板上具有的各功能擴展接口及附帶光盤提供的完整的演示程序,迅速的掌握
C8051F320單片機的軟硬件設計(特別是USB通信的相關設計),達到縮短產品開發周期的
目的.
2.功能簡介:(可完成的實驗項目)
·USB通信(片上集成了USB控制器)·SMBUS,SPI接口
·AD轉換·UART通信
·FRAM讀寫(FM24系列)·可編程電壓比較器
·PCA(可編程計數器陣列)·PWM輸出
·2X2鍵盤掃描·2X16LCD驅動
3. C8051F320片上資源:
·16k FLASH·1280byte RAM
·USB2.0控制器·4個16位定時器/計數器
·內置溫度傳感器·SMBUS,增強型SPI接口
·UART串口·16位的可編程計數陣列(PCA)
·可編程片內電壓比較器
4.開發板組成
●BT F320開發評估板一塊
●交叉串口線一條
●9V直流電源一個
BTF320開發評估板
3
●附帶光盤一張
5.BT F320評估板的跳線說明
J1 I/O口
J2 USB接口
J3 ADC輸入接口(信號經由運放電路LM324)
J4經由LM324整理后的模擬信號與AD輸入引腳的連接跳線
J5 CP輸入引腳
J6電位器(R15)輸出與P1.7連接跳線
J7 1腳,1602LCD背光控制位2腳,P2.5 3腳,D3正極
J8 UART接口
J9外部VREF(+2.5V)
J10 1腳,P2.6 2腳,D4正極
J11 C2接口
二.BT F320開發評估板測試程序詳細說明
1,本公司提供的測試程序已經應用Silicon Laboratories IDE軟件編譯通過.IDE配置
參考"三.Silicon Laboratories IDE安裝配置"內容.
2,晶振的選擇:由于C8051F320片內集成有高精度的可編程內部振蕩器,附帶光盤中提供的
范例程序都采用內部晶振.但評估板上仍留有外部晶振電路,開發者可根據開發需要自行
選用.
3,測試程序說明
所有測試程序在附帶光盤的…BTF\BTF320\...目錄下,
(1)溫度測量程序(例程:adc_temp.c和lcd1602a.c)
摘要:本程序使用C8051F320芯片的片內溫度傳感器,實現對芯片表面溫度進行測量,
測量值通過LCD顯示且從UART發送至PC機.
(2)模擬量(電壓)的采樣(例程:ADC1.C和lcd1602a.c)
BTF320開發評估板
4
摘要:本程序主要實現對模擬量(電壓)的采樣,AD轉換,LCD顯示并通過UART發送
到PC機.實驗時短接以下跳線:J4.1—J4.2;J7.1—J7.2;J9.1—J9.2
注:LMV324只對兩個通道的信號進行調整,做ADC0應用實驗時一定要注意以下問題:
.在信號調理的輸入端J3-4腳(J3的第4腳)可以輸入+6/-6的電壓經過LMV324調
理后進行采樣,也就是該輸入通道能對調理后的+6/-6V的電壓信號進行采樣.
.在信號調整的輸入端J3-1(J3的第1腳)可以輸入4~20毫安的電流經過電壓跟隨
器輸入到芯片的AIN0.1腳進行采樣.(特別強調:該通道不能輸入+6/-6V的電壓,
雖然LMV324進行了信號的調整,但LMV324組成的電路僅是一個電壓跟隨器,在J11-1
腳輸入多大的電壓或電流都是直接加到芯片的ADC輸入引腳.如果用戶不按該原則做
實驗,而損壞芯片本公司概不負責.)
(3)比較器(例程:CP1.c)
功能:由CP的CP+,CP-的高低來控制紅色LED(D4)亮/滅(CP+>CP-則LED亮,相反滅).
可在中斷程序中設斷點觀察.
(4)LCD顯示(例程:lcd1602a.C)
摘要:本程序是LCD測試程序.用NLS595的并行輸出腳作為LCD的數據引腳.實驗時短接
以下跳線:J7.1—J7.2
功能:運行程序,顯示兩行字符"BT F320V1.0"和"www.xhl.com.cn"
(5)FRAM讀寫(例程: 24c04test.c)
摘要:本程序是I2C(SMBUS)讀寫程序,實現FM24C04A的讀寫操作.
(6)8位PWM(例程: pwm8.c)
摘要:PCA工作在8位脈寬調制器工作方式,在PWM引腳輸出一個占空比為00xfe的PWM
信號且重復輸出,可用示波器觀察占空比變化.
(7)鍵盤掃描(例程: key.c和lcd1602a.c)
摘要:這個程序掃描KEY1—KEY4.有按鍵按下后,返回相應按鍵的字符:'1','2',
'3','4',并在LCD上顯示出來.實驗時短接以下跳線:J7.1—J7.2
(8)USB測試
摘要:測試前先將J6短路環連好,把USB線接上.然后在IDE里裝載"
BTF320開發評估板
5
USBDEMO"中的項目文件,進行編譯,連接,下載并運行此程序.打
開USBtest.exe(該程序在IDE根目錄下)運行界面如圖3.
圖3
按下S2按鍵,第一個Button變亮,再按一下變暗.
按下S3按鍵,第二個Button變亮,再按一下變暗.
選LED1,板上D4燈閃爍,選LED2,板上D3燈閃爍.
用手撥動R15電位器,Pot指針隨之改變.
Temp指針顯示CPU內部溫度傳感器采樣值.
三.Silicon Laboratories IDE安裝配置
1.IDE安裝:自動運行附帶光盤,點擊"安裝Silabs IDE",按提示進行安裝即可.
2.CP210X驅動的安裝:僅在選用U_EC2或使用CP210X芯片時需要安裝此驅動程序.
自動運行附帶光盤,點擊"安裝CP210X驅動",按提示進行安裝即可
3.安裝結束,打開IDE集成開發環境,在新建或打開原有的項目后,點擊主菜單
"Options"選擇"ConnectionOptions.."選項(如圖2所示),進入圖3界面.
BTF320開發評估板
6
圖2
(1)若調試器使用U_EC3/U_EC5,選擇與圖3相同選項,點擊OK即可進行連接,程序
下載和在線調試.
(2)若調試器使用U_EC2,圖3中"Serial
Adapter"框選"RS232 Serial Adapter…."一項.
其中,"COMPORT"的選擇要參照"設備管理器"的端
口選項(圖4中紅色圓圈).已知紅色圓圈內容后,點
擊"COMPORT"復選框,選擇"Other COM"項,輸入
與"設備管理器"中相同的COM口值(如"3".注:
只輸入"3"),則"COMPORT"復選框的內容為"COM3".
點擊OK即可進行連接,程序下載和在線調試.
圖3
圖4
BTF320開發評估板
7
四BT F320評估開發板使用方法:
1.將調試器用10芯扁平電纜連接到評估板的C2口.
2.給評估板供電.接通電源的正確順序:首先連接好調試器和評估板,然后接通評估板電
源.不可以先提供評估板電源,再連接調試器.
3.打開IDE開發環境,選擇好調試口.使用調試器對C8051F320芯片編程和在線調試
評論
查看更多