基于I2C總線的銀行排隊系統(tǒng)接口設計
本文以銀行現有排隊系統(tǒng)為實例,提出了IIC總線的單片機排隊系統(tǒng)接口設計,通過對系統(tǒng)的仿真模擬試驗,不僅簡化設計電路,減小電路板面積,節(jié)省常規(guī)設計中的元器件,減少使用各項費用,而且系統(tǒng)能耗、消噪、可靠性等性能得到提高,在MCS-51系列單片機不帶IIC總線接口組成的數據測控和智能儀表儀器中,可以通過IIC總線增加系統(tǒng)的接口器件種類,降低系統(tǒng)成本,提高應用系統(tǒng)性能[1-3]。
1 IIC總線
IIC總線(Inter Integrate Circuit Bus)是一種雙向二線制總線,由串行時鐘線(SCL)與串行數據線(SDA)構成,通過兩根線連接不同的具有IIC總線的器件,在不同的器件間傳送數據,數據傳輸速率在高速模式最高可達3.4 Mb/s,既簡化了電路設計又提高了硬件使用效率,使IIC總線在嵌入式系統(tǒng)串行傳輸設計中得到廣泛應用,目前主要用于中央控制中心、音頻集成電路及視頻等數字控制系統(tǒng)。
1.1 IIC總線時序
(1)啟動及停止
總線不忙時,時鐘線和數據線保持為高電平。啟動條件(S)是時鐘線在高電平而數據線為下降沿時,停止條件(P)是時鐘線處于高電平而數據線為上升沿時,IIC總線啟動停止條件如圖1所示。
(2) 數據傳送
一個數據位的傳送需要一個時鐘脈沖,每1 B后加1個標志位,由傳送器產生的標志位為高電平時,主設備會產生1個附加的標志位時鐘脈沖。數據線SDA上信息只有時鐘脈沖為高電平時應該保持數據穩(wěn)定,否則數據線SDA上的數據會變?yōu)榭刂菩盘?,如圖2所示。
(3) IIC 總線協議
IIC總線進行數據傳遞前,應先標明接收的設備地址。當IIC總線啟動后,一起傳送這個地址與第1個被傳送字節(jié)。
本系統(tǒng)中PCF8563 芯片作為一個從傳送器或從接收器,SCL信號線只是輸入線,SDA數據線為1條雙向的信號線。
1.2 芯片PCF8563概述
PCF8563是經典低功耗實時時鐘/日歷芯片[4],具有IIC總線接口技術,總線最大傳輸速度可達400 kb/s,每次寫讀數據后,內部包含的字地址寄存器就會自動遞增,具有功耗低、精度高等特點。PCF8563 具有定時器功能、多種報警功能、中斷輸出功能及時鐘輸出功能,可以完成多種定時服務,還可為單片機系統(tǒng)實現看門狗技術,其內部的振蕩電路、時鐘電路、低電壓1.0 V檢測電路及IIC兩線制總線通訊方式,同時解決了2000年問題,不但使外圍電路及其簡潔,而且也增加了芯片的可靠,可廣泛應用于水表、電表、移動電話、便攜儀器、傳真機、電池電源等產品領域中。
2 系統(tǒng)設計
2.1 系統(tǒng)需求分析
銀行服務大廳設有8個業(yè)務服務窗口,服務窗口屬性分為五類服務業(yè)務進行描述,可以進行個人理財業(yè)務、對公業(yè)務、VIP銀行卡業(yè)務、個人存取款儲蓄和代收手機費、水電費等混合業(yè)務。
排隊系統(tǒng)性能要求:服務大廳入口處擺放排隊機,供儲戶按時間順序索取排隊編號,打印編號;服務窗口內人員可以通過按鈕實現叫號;叫號后在屏幕上顯示編號并通過揚聲器連續(xù)兩次播放編號信息;工作人員通過后臺可以進行排隊系統(tǒng)的相關(功能、模式、菜單等)設置。
2.2 系統(tǒng)硬件設計
單片機排隊系統(tǒng)由銀行柜臺操作模塊、存儲器模塊、柜臺叫號模塊、液晶顯示模塊、儲戶操作模塊組成,系統(tǒng)結構如圖3所示。系統(tǒng)中IIC電路用于參數存儲器(E2PROM)和實時精確時鐘等接口的應用[2]。
實時精確時鐘使用較低功耗的CMOS實時日歷/時鐘芯片,通過分頻器(用于提供源時鐘給實時時鐘RTC)、定時器、可編程時鐘輸出、掉電檢測器、報警器和IIC總線接口,來具體設置系統(tǒng)必需的精準時鐘信號。所有的數據和地址通過IIC總線接口串行傳輸,每次寫讀數據后,字地址寄存器就會自動遞增[5]。
參數存儲器(E2PROM)[6]使用較低功耗的CMOS串行IIC電路,通過片內存儲空間,記錄柜臺操作和儲戶排隊等信息。其操作控制完全遵循IIC協議。
3 系統(tǒng)總線軟件模擬的實現方法
排隊系統(tǒng)原理圖如圖4所示,由P3.4、P3.3模擬串行總線的SDA端及SCL輸出端,構成模擬的IIC串行總線系統(tǒng)??偩€功能的實現除了簡單硬件連接,大部分功能通過軟件模擬來實現,下面給出部分總線常用子程序,這些子程序通用性較好,基本適用于大部分IIC總線接口的芯片[2-3]。
3.1 總線啟動、停止函數
void IIC_Start(void)
{
IIC_SCL=1;
IIC_Delay();
IIC_SDA=1;
IIC_Delay();
IIC_SDA=0;
IIC_Delay();
IIC_SCL=0;
IIC_Delay();
}
void IIC_Stop(void)
{
IIC_SDA=0;
IIC_Delay();
IIC_SCL=1;
IIC_Delay();
IIC_SDA=1;
IIC_Delay();
IIC_SCL=1;
IIC_Delay();
}
3.2 從IIC器件指定位置讀若干字節(jié)
bit RetBit;
unsigned char i;
IIC_Start(); /*啟動總線*/
RetBit=IIC_Write_Byte(Device_Addr);
/*發(fā)送器件從地址*/ if(RetBit==0)
return(0);
RetBit=IIC_Write_Byte(Mem_Addr);
/*發(fā)送器件子地址*/ if(RetBit==0)
return(0);
IIC_Stop(); /*結束總線*/ IIC_Start(); /*重新啟動總線*/
RetBit=IIC_Write_Byte(Device_Addr+1);
if(RetBit==0)
return(0);
for(i=0;i<Num-1;i++)
{
*DataPointer=IIC_Read_Byte(); /*接收數據*/
IIC_Ack(0); /*發(fā)送應答位*/
DataPointer++;
}
*DataPointer=IIC_Read_Byte(); /*接收數據*/
IIC_Ack(1);
IIC_Stop(); /*結束總線*/
return(1);
3.3 向IIC發(fā)送1字節(jié)函數
bit Ack_Flag;
unsigned char i;
for(i=0;i<8;i++) /*要傳送的數據長度為8位*/
{
IIC_SDA=(bit)((Data<<i)&0x80);
/*依次判斷待發(fā)送位高低*/
IIC_Delay();
IIC_SCL=1;
/*置時鐘線為高,通知E2PROM開始接收數據位*/
IIC_Delay();
IIC_SCL=0;
IIC_Delay();
}
IIC_SDA=1;
/*8位數據發(fā)送完后釋放數據線,準備接收應答位*/
IIC_Delay();
IIC_SCL=1;
IIC_Delay();
if(IIC_SDA)
Ack_Flag=0; /* E2PROM無應答*/ else
Ack_Flag=1; /*數據成功發(fā)送*/
IIC_SCL=0;
IIC_Delay();
return(Ack_Flag); /*返回E2PROM應答標志*/
3.4 系統(tǒng)仿真
經過軟件分析后,即可利用keil c集成開發(fā)環(huán)境uVision2對用C語言編寫的程序進行編譯、調試,通過JTAG口將編譯好的程序燒寫到單片機中,完成所需排隊功能。系統(tǒng)經過仿真測試,得到銀行入口處擺放排隊機供儲戶索取排隊編號,打印編號;銀行柜臺內工作人員通過按鈕可以實現叫號;叫號后在大屏幕顯示上顯示并通過喇叭播放叫號信息;銀行工作人員可以通過后臺進行系統(tǒng)的相關設置。