人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件_第1頁(yè)
人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件_第2頁(yè)
人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件_第3頁(yè)
人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件_第4頁(yè)
人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、5.4 人機(jī)接口電路設(shè)計(jì)及編程5.4 人機(jī)接口電路設(shè)計(jì)及編程5.4.1 鍵盤電路設(shè)計(jì)及編程5.4.1 鍵盤電路設(shè)計(jì)及編程1. 電路 鍵盤接口電路如圖5-12所示,板上擴(kuò)展了一個(gè)44行列式矩陣鍵盤接口。 該鍵盤采用中斷掃描方式進(jìn)行工作,行線選用PORTG47輸出,列線選用PORTF58為輸入。 行線接上拉電阻保持高電平,并通過“與”門將輸出信號(hào)與MCU的中斷EXINT0連接; 列線接上拉電阻保持高電平。1. 電路 鍵盤接口電路如圖5-12所示,板人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件2. 編程 (1) I/O口和中斷初始化 I/O引腳設(shè)置:rPDATE=0X60;rPCONF=0 x2A; 列線POR

2、TF58為輸入rPUPF=0 x0; 列線接上拉電阻rPDATG=0 x0; rPCONG=0 x55FF; 行線PORTG47輸出, PORTG0作為EXINT0連接rPUPG=0 x0; 行線接上拉電阻2. 編程 (1) I/O口和中斷初始化 中斷初始化 rINTCON=0 x5; / 非向量模式,IRQ 允許,FIQ 禁止 rINTMOD=0 x0; / 全部IRQ 模式 rINTMSK =(BIT_GLOBAL|BIT_EINT0); /EXINT0允許, 所有中斷屏蔽位允許 pISR_EINT0=(unsigned)keyboard_ISR; /指定中斷服務(wù)程序 中斷初始化 (2)

3、程序 將行線PORTG47輸出為低電平,當(dāng)有鍵盤按下時(shí),該行線被拉為低電平,使得EXINT0輸入也為低電平,MCU產(chǎn)生中斷。 中斷產(chǎn)生后通過對(duì)鍵盤的行和列進(jìn)行掃描的方法,可以計(jì)算出是哪個(gè)鍵按下,并跳到相應(yīng)的鍵盤處理程序中去。 (2) 程序void keyboard_ISR(void) char x,y,xrecord,yrecord,temp; rI_ISPC=BIT_EINT0; /clear pending_bit Delay(400); /delay 40ms if(rPDATF&0 x1E0)=0 x1E0) return 0; /no keyboard press,return vo

4、id keyboard_ISR(void) else x=1; y=1; xrecord=(rPDATF&0 x1E0)1); xrecord=xrecord4; while(xrecord!=0 x1)/judge row x=x+1; xrecord=xrecord1; else if(xrecord=0) rPDATG=0X0F;/ no ,return return 0; Delay(200); /delay 20ms rPDATG=0XEF; /input high if(xrecord=0)while(rPDATF&0 x1E0)=0 x1E0) rPDATG=rPDATG4)&0

5、 x0F; while(yrecord!=0 x1) / judge line y=y+1; yrecord=yrecord1; if(yrecord=0) rPDATG=0X0F; /no board press,return return 0; Delay(200); /deLed_Display(x+(y-1)*4-1); Uart_Printf(%3d,x+(y-1)*4-1); Delay(1200);/delay 40ms rPDATG=0X0F; Led_Display(x+(y-1)*4-1);5.4.2 LCD接口電路設(shè)計(jì)及編程5.4.2 LCD接口電路設(shè)計(jì)及編程1. LCD

6、接口信號(hào) EV44B0 II現(xiàn)配有160240的單色顯示屏,4比特單掃描。EV44B0 II將LCD控制信號(hào)線連接到JP6上,與LCD模塊相連,其原理如圖5-13所示。 在LCD模塊上,集成了LCD驅(qū)動(dòng)器和專門的電壓轉(zhuǎn)換電路,用以驅(qū)動(dòng)LCD屏幕和適配LCD工作電壓。LCD連接器的信號(hào)定義如表5-4所示。1. LCD接口信號(hào) EV44B0 II現(xiàn)人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件1. LCD接口信號(hào) EV44B0 II現(xiàn)配有160240的單色顯示屏,4比特單掃描。EV44B0 II將LCD控制信號(hào)線連接到JP6上,與LCD模塊相連,其原理如圖5-13所示。 在LCD模塊上,集成了LCD驅(qū)動(dòng)器和專門

7、的電壓轉(zhuǎn)換電路,用以驅(qū)動(dòng)LCD屏幕和適配LCD工作電壓。LCD連接器的信號(hào)定義如表5-4所示。1. LCD接口信號(hào) EV44B0 II現(xiàn)Pin SignalPin SignalPin SignalPin Signal1 VM6 VDD11 VD216 VD72 VRAME7 GND12 VD317 TSPX3 VLINE8 VD413 GND18 TSMX4 VCLK E9 VD014 VD519 TSPY5 GPB1010 VD115 VD620 TSMYPin SignalPin Sig2. 編程 顯示緩沖區(qū)與LCD象素對(duì)應(yīng)關(guān)系圖如圖5-14所示。2. 編程 顯示緩沖區(qū)與LCD象素對(duì)應(yīng)關(guān)系

8、圖人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 (1) LCD 初始化程序 通常采用S3C44B0X的PORTC口和PPORTD口作為L(zhǎng)CD驅(qū)動(dòng)接口,因此需要設(shè)置它們工作在第3功能狀態(tài),設(shè)置I/O口控制寄存器的語句如下: rPDATC=0 x8400; rPCONC=0 x5F5FFFFF; rPUPC=0 x33ff;/should be enabled rPCOND=0 xaaaa; rPUPD=0 xff; (1) LCD 初始化程序 LCD初始化程序如下:void Lcd_MonoInit(void)/160 x240 1bit/1pixel LCD#define MVAL_USED 0rLCDC

9、ON1=(0)|(15)|(MVAL_USED7) |(0 x38)|(0 x310)|(CLKVAL_MONO12);/disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=(LINEVAL)|(HOZVAL10)|(1021); /LINEBLANK=10 LCD初始化程序如下:rLCDSADDR1=(0 x022) 1); / monochrome, LCDBANK, LCDBASEUrLCDSADDR2=M5D(U32)frameBuffer1+(SCR_X SIZE*LCD_YSIZE/8)1)|(MVAL21)|(129);rLCDSAD

10、DR3= (LCD_XSIZE/16)|(SCR_X SIZE-LCD_XSIZE)/16)9);rLCDCON1=(1)|(15)|(MVAL_USED7)|(0 x38)| (0 x310)|(CLKVAL_MONO12);/enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk, rLCDSADDR1=(0 x027)|(U32)f(2) LCD 顯示程序 LCD 顯示程序如下:#define frameBuffer1 0 xc400000extern unsigned char *Buf;void displaylcd(void) unsigned int *pb

11、uffer,temp_data; int i; pbuffer =(U32*) frameBuffer1;(2) LCD 顯示程序 LCD 顯示程序如下: for(i = 0; i (4800/4) ;i+) temp_data = (Bufi*4+3 24) + (Bufi*4+2 16) + (Bufi*4+1 8) +(Bufi*4); pbufferi = temp_data; Delay(10); for(i = 0; i (4800/4) ;i(3) LCD 清屏程序 LCD 清屏程序如下:void clrscreen(void)int i,j;unsigned int *pbuf

12、fer;pbuffer =(U32*) frameBuffer1;for (i=0;i4800/4;i+) pbufferi =0;/(0 x0FFFFFFFF); (3) LCD 清屏程序 LCD 清屏程序如下:5.4.3 觸摸屏電路設(shè)計(jì)及編程1. 觸摸屏的工作原理 觸摸屏按其工作原理的不同分為表面聲波屏、電容屏、電阻屏和紅外屏幾種。 常見的又?jǐn)?shù)電阻觸摸屏。如圖5-15 所示,電阻觸摸屏的屏體部分是一塊與顯示器表面非常配合的多層復(fù)合薄膜,由一層玻璃或有機(jī)玻璃作為基層,表面涂有一層透明的導(dǎo)電層,上面再蓋有一層外表面硬化處理、光滑防刮的塑料層,它的內(nèi)表面也涂有一層透明導(dǎo)電層,在兩層導(dǎo)電層之間有許

13、多細(xì)小(小于千分之一英寸)的透明隔離點(diǎn)把它們隔開絕緣。 5.4.3 觸摸屏電路設(shè)計(jì)及編程1. 觸摸屏的工作原理人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 如圖5-16所示,當(dāng)手指或筆觸摸屏幕時(shí)(圖c),平常相互絕緣的兩層導(dǎo)電層就在觸摸點(diǎn)位置有了一個(gè)接觸,因其中一面導(dǎo)電層(頂層)接通X 軸方向的5V 均勻電壓場(chǎng)(圖a),使得檢測(cè)層(底層)的電壓由零變?yōu)榉橇?,控制器偵測(cè)到這個(gè)接通后,進(jìn)行A/D 轉(zhuǎn)換,并將得到的電壓值與5V 相比即可得觸摸點(diǎn)的X 軸坐標(biāo)為(原點(diǎn)在靠近接地點(diǎn)的那端): Xi=LxVi/V(即分壓原理)同理得出Y 軸的坐標(biāo),這就是所有電阻觸摸屏共同的最基本原理。 如圖5-16所示,當(dāng)手指或筆觸摸

14、屏幕時(shí)(圖人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件2.觸摸屏電路控制 觸摸屏的控制采用專用芯片,專門處理是否有筆或手指按下觸摸屏,并在按下時(shí)分別給兩組電極通電,然后將其對(duì)應(yīng)位置的摸擬電壓信號(hào)經(jīng)過A/D 轉(zhuǎn)換送回處理器 .2.觸摸屏電路控制 觸摸屏的控制采用專用芯 我們選取 GPG 口與 ADS7843 接口。共運(yùn)用了 PG2PG7 口共 6 條口線。你也可以選擇其它的 I/O 口,但注意不要與 I/O 口上已經(jīng)設(shè)定的功能(例如串口)相沖突。參考電路圖如下:按照下圖用導(dǎo)線將兩個(gè)模塊連接起來。如圖5-17所示。 我們選取 GPG 口與 ADS7843 接人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件3. 編程(1) P

15、CONG 寄存器配置 按照以上電路來設(shè)置,PG6和PG5輸入,PG4PG2輸出,PG7作為中斷EINT7且加內(nèi)部上拉電阻,初始化語句如下: rPCONG=0 x015f; rPUPG &=0 x80; 3. 編程(1) PCONG 寄存器配置(2) ADS7843 編程 ADS7843的控制字如表5-5所示,其中S為數(shù)據(jù)傳輸起始標(biāo)志位,該位必為。 A2A0進(jìn)行通道選擇。 MODE用來選擇A/D轉(zhuǎn)換的精度,1-選擇位,-選擇12位。 SER/DFR選擇參考電壓的輸入模式。 (2) ADS7843 編程人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 PD1和PD0選擇省電模式:00-為省電模式允許,在兩次A/D

16、轉(zhuǎn)換之間掉電,且中斷允許;01同00,只是不允許中斷;10保留;11禁止省電模式。 A0A2 用來進(jìn)行開關(guān)切換,如表5-6所示。 PD1和PD0選擇省電模式:00-為省SER/DFR1 時(shí),A0A2 輸入設(shè)置 SER/DFR1 時(shí),A0A2 輸入設(shè)置 我們采用固定參考電壓模式,因此 SER/DFR1。 程序中首先探測(cè) PENIRQ 是否為低電平,如果為高則認(rèn)為觸摸屏沒有接觸;如果探測(cè)到 PENIRQ 為低電平,則認(rèn)為有接觸。 利用軟件模擬 DIN、DOUT、DCLK上的 3 線串行傳輸?shù)臅r(shí)序,將讀取 X 坐標(biāo)數(shù)值或 Y 坐標(biāo)數(shù)值的控制字串行送入 ADS7843,并串行讀出坐標(biāo)值。 我們采用固定

17、參考電壓模式,因此 SER/ 檢測(cè) PENIRQ #define TOUCH_MSR_Y 0 x9c; /讀 Y 軸坐標(biāo)命令#define TOUCH_MSR_X 0 xdc; /讀 X 軸坐標(biāo)命令if(rPDATG&0 x80)=0) /PENIRQ 電平為低/TouchState.pressed=1;_State.Pressed=1; /說明已經(jīng)按下temp=TOUCH_MSR_X;_State.x=ReadTouch(temp);temp=TOUCH_MSR_Y;_State.y=ReadTouch(temp); 檢測(cè) PENIRQ #define TOUCH_MS 送控制字并讀取結(jié)果子

18、程序int ReadTouch(unsigned char command)unsigned char temp,i,ack,j,k;ack=0;/PG7-PENIRQ,PG6-BUSY,PG5CS,PG3-DCLK,PG2-DINrPDATG&=0 xe7;/cs 置低;dclk 置低temp=0 x80; 送控制字并讀取結(jié)果子程序int ReadTouch(ufor(i=0;i1;/移位for(i=0;i8;i+)/發(fā)送 1 個(gè)字節(jié) while(temp=(rPDATG&0 x40)=0); 等待 BUSY 變低 rPDATG&=0 xdf;/din 清零 /再 1 個(gè)時(shí)鐘以后開始接收數(shù)據(jù)

19、 rPDATG|=0 x08;/置高 dclk delay(2); rPDATG&=0 xf7;/清零 dclk delay(2); while(temp=(rPDATG&0 x40)=for(i=0;i7;i+)取得前 7 位坐標(biāo)數(shù)據(jù)(高位在前)rPDATG|=0 x08;/置高 dclkif(temp=rPDATG&0 x20)/取得 din 上的 1 位數(shù)據(jù)ack+=1;ack=ack1;delay(2);rPDATG&=0 xf7;/清零 dclkdelay(2);rPDATG|=0 x08;/置高 dclkfor(i=0;i7;i+)取得前 7 位坐標(biāo)數(shù)據(jù)(高if(temp=rPDA

20、TG&0 x20)/接收最后 1 位ack+=1;delay(2);rPDATG&=0 xf7;/清零 dclkrPDATG|=0 x10;/置高 csreturn ack;/返回接收結(jié)果if(temp=rPDATG&0 x20)/接收最后 4.觸摸屏與顯示器的配合 ADS7843 送回控制器的X 與Y 值僅是對(duì)當(dāng)前觸摸點(diǎn)的電壓值的A/D 轉(zhuǎn)換值,它不具有實(shí)用價(jià)值。 這個(gè)值的大小不但與觸摸屏的分辨率有關(guān),而且也與觸摸屏與LCD 貼合的情況有關(guān)。而且,LCD 分辨率與觸摸屏的分辨率一般來說是不一樣,坐標(biāo)也不一樣。 因此,如果想得到體現(xiàn)LCD 坐標(biāo)的觸摸屏位置,還需要在程序中進(jìn)行轉(zhuǎn)換。 4.觸摸屏

21、與顯示器的配合 ADS7843 假設(shè)LCD 分辨率是320240,坐標(biāo)原點(diǎn)在左上角;觸摸屏分辨率是900900,坐標(biāo)原點(diǎn)在左上角,則轉(zhuǎn)換公式如下: xLCD=320*(x-x2)/(x1-x2); yLCD=240*(y-y2)/(y1-y2); 假設(shè)LCD 分辨率是320240,坐標(biāo) 如果坐標(biāo)原點(diǎn)不一致,比如LCD 坐標(biāo)原點(diǎn)在右下角,而觸摸屏原點(diǎn)在左上角,則還可以進(jìn)行如下轉(zhuǎn)換: xLCD=320-320*(x-x2)/(x1-x2); yLCD=240-240*(y-y2)/(y1-y2); 最后得到的值,便可以盡可能得使LCD 坐標(biāo)與觸摸屏坐標(biāo)一致,這樣,更具有實(shí)際意義。 如果坐標(biāo)原點(diǎn)不一

22、致,比如LCD 坐標(biāo)原點(diǎn)在右下角,而5.4.4 8段數(shù)碼管電路設(shè)計(jì)及編程1.電路設(shè)計(jì) 系統(tǒng)使用了一個(gè)8段數(shù)碼LED,如圖2-18所示。該數(shù)碼管是共陽(yáng)極的,低電平信號(hào)使LED點(diǎn)亮。 CPU數(shù)據(jù)總線DATA(07)經(jīng)74LS573驅(qū)動(dòng)器對(duì)數(shù)碼管進(jìn)行驅(qū)動(dòng)。其片選信號(hào)由CPU的nGCS3信號(hào)選通,而8段的內(nèi)容則由CPU低8位數(shù)據(jù)線決定。 口地址為0 x6000000。 5.4.4 8段數(shù)碼管電路設(shè)計(jì)及編程1.電路設(shè)計(jì)人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件2. 編程8段數(shù)碼管顯示程序如下:void Led_Display(unsigned char data) unsigned char * ledbuffe

23、r = (unsigned char *) 0 x6000000 switch(data) case 0: *ledbuffer=0 x12; break; . case 0 xf: *ledbuffer=0 x68; break; 2. 編程8段數(shù)碼管顯示程序如下:5.5 串行接口電路設(shè)計(jì)及編程5.5 串行接口電路設(shè)計(jì)及編程5.5.1 串行電路接口 串行接口電路如圖5-19所示。系統(tǒng)提供兩個(gè)RS232標(biāo)準(zhǔn)串行接口(DB9),UART0/l可與PC或MODOM進(jìn)行串行通信。 PORTC1015分別作為nRTS1、nCTS1、TXD1、RXD1、nRTS0和nCTS0信號(hào),PE1和PE2作為TX

24、D0和RXD0信號(hào)。 兩個(gè)接口則采用兩片MAX2322C作為電平轉(zhuǎn)換器。5.5.1 串行電路接口 串行接口電路如人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 5.5.2 編程1. I/O接口配置初始化 對(duì)PORTC和PORTE初始化語句如下: rPCONC = 0 x0f000000|rPCONC; rPUPC = 0 x3000;/設(shè)置內(nèi)部上拉 rPCONE = (rPCONE&0 xfc3)|0 xeb; rPUPE = 0 x6;2. UART初始化 對(duì) UART 口進(jìn)行初始化設(shè)置程序如下: 5.5.2 編程1. I/O接口配置初始化static int UartNum=0;void myUart_

25、Init(int whichuart, int baud) /設(shè)置串口波特率等初始化工作。if(whichuart=0) UartNum=0; rUFCON0=0 x0; /不使用 FIFO rUMCON0=0 x0; /不使用自動(dòng)流控制 rULCON0=0 x3; /不采用紅外線傳輸模式,無奇偶校驗(yàn) 位,1 個(gè)停止位, /8個(gè)數(shù)據(jù)位static int UartNum=0; rUCON0=0 x245; /發(fā)送中斷為電平方式,接收中斷為 邊沿方式,禁止超時(shí) /中斷,允許產(chǎn)生錯(cuò)誤狀態(tài)中斷,禁止回 送模式,禁止中 /止信號(hào),傳輸模式為中斷請(qǐng)求模式,接 收模式也為中斷 /請(qǐng)求模式。 rUBRDIV

26、0=(int)(MCLK/16./baud + 0.5)-1); /根據(jù)波特率計(jì)算 UBRDIV0 的值 rUCON0=0 x245; else if(whichuart=1)UartNum=1;rUFCON1=0 x0;rUMCON1=0 x0;rULCON1=0 x3;rUCON1=0 x245;rUBRDIV1 = ( (int)(MCLK/16./baud + 0.5) -1 );else if(whichuart=1)3.字符發(fā)送程序#define WrUTXH0(ch)(*(volatile unsigned char*)0 xld00020)=(unsigned char)(ch

27、)#define WrUTXH0(ch)(*(volatile unsigned char*)0 xld04020)=(unsigned char)(ch)Void myUart_SendByte(char ch) if(UartNum=0) if(ch=“n”) while(!(rUTRSTAT0&0 x2); /等待,直到發(fā)送緩沖區(qū)為空 Delay(10); /超級(jí)中斷的響應(yīng)速度較慢 WrUTXH0(“r”); /發(fā)送回車符 while(!(rUTRSTAT0&0 x2); /等待,知道發(fā)送緩沖區(qū)為空 Delay(10); WrUTXH0(ch); /發(fā)送字符 3.字符發(fā)送程序 else

28、if(ch=“n”) while(!(rUTRSTAT1&0 x2); Delay(10); /因?yàn)槌?jí)終端響應(yīng)較慢 rUTXH1=“r”; While(!(rUTRSTAT1&0 x2); /等待THR空。 Delay(10); WrUTXH1(ch); else字符接受程序#define RdURXH0()(*(volatile unsigned char*)(0 xld00027)#define RdURXH1()(*(volatile unsigned char*)(0 xld04027)Char Uart_Getch(void) if(whichUart=0) /串口0 while(

29、!(rUTRSTAT0&0 x1); /讀出接收到的數(shù)據(jù)(一直到讀完) return RdURXH0(); /URXH0:UART0接收緩沖寄存器 else /串口1 while(!(rUTRSTAT1&0 x1); /Receive data ready return rURXH1; 字符接受程序5.6 C接口電路設(shè)計(jì)及編程5.6 C接口電路設(shè)計(jì)及編程5.6.1 EEPROM芯片介紹5.6.1 EEPROM芯片介紹 目前,通用存儲(chǔ)器芯片多為EEPTOM,其常用的協(xié)議主要有兩線串行連接協(xié)議(C)和三線串行連接協(xié)議。 帶C總線接口的EEPROM有許多型號(hào),其中AT24Cxx系列使用十分普遍,產(chǎn)品

30、包括AT2401/02/04/08/16等,其容量(字節(jié)數(shù)頁(yè))分別為1288/2568/5128/10248/20488,適用于25V的低電壓操作,具有低功耗和高可靠性等優(yōu)點(diǎn)。 目前,通用存儲(chǔ)器芯片多為EEPTOM,其常用的協(xié)議主 AT24系列存儲(chǔ)器芯片采用CMOS工藝制造,內(nèi)置有高壓泵,可在單電壓供電條件下工作。其標(biāo)準(zhǔn)封裝為8引腳DIP封裝形式,如圖5-20所示。 AT24系列存儲(chǔ)器芯片采用CMOS工藝人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 1. SCL 串行時(shí)鐘。遵循ISO/IEC7816同步協(xié)議;漏極開路,需接上拉電阻;在該引腳的上升沿,系統(tǒng)將數(shù)據(jù)輸入到每個(gè)EEPROM器件,在下降沿輸出。 2

31、. SDA 雙向串行數(shù)據(jù)線,漏極開路,需接上拉電阻,可與其它開路器件“線或”。 1. SCL3. A0、A1、A2 器件/頁(yè)面尋址地址輸入端。在AT24C01/02中,引腳被硬連接。其他AT24Cxx均可接尋址地址線。4. WP 讀/寫保護(hù)。接低電平時(shí)可對(duì)整片空間進(jìn)行讀/寫;接高電平時(shí)不能對(duì)受保護(hù)區(qū)進(jìn)行讀/寫。5. VCC/GND +5V的工作電壓。3. A0、A1、A25.6.2 EEPROM讀寫操作1. AT24C04結(jié)構(gòu)與應(yīng)用簡(jiǎn)述 AT24C04由輸入緩沖器和EEPROM陣列組成。 由于EEPROM的半導(dǎo)體工藝特性寫入時(shí)間為510 ms,如果從外部直接寫入EEPROM,則每寫一個(gè)字節(jié)都要

32、等候510ms,成批數(shù)據(jù)寫入時(shí)就要等候更長(zhǎng)時(shí)間。具有SRAM輸入緩沖器的EEPROM器件,其寫入操作變成對(duì)SRAM緩沖器的裝載。裝載完后啟動(dòng)一個(gè)自動(dòng)寫入邏輯將緩沖器中的全部數(shù)據(jù)一次寫入EEPROM陣5.6.2 EEPROM讀寫操作1. AT24C04 對(duì)緩沖器的輸人稱為頁(yè)寫,緩沖器的容量 稱為頁(yè)寫字節(jié)數(shù)。AT24C04的頁(yè)寫字節(jié)數(shù)為8,占用最低3位地址。當(dāng)寫入不超過頁(yè)寫字節(jié)數(shù)時(shí),對(duì)EEPROM器件的寫入操作與對(duì)SRAM的寫入操作相同;當(dāng)超過頁(yè)寫字節(jié)數(shù)時(shí),應(yīng)等候510 ms后再啟動(dòng)一次寫操作。 由于EEPROM器件緩沖區(qū)容量較小(只占據(jù)最低3位),且不具備溢出進(jìn)位檢測(cè)功能,所以,從非零地址寫入8

33、個(gè)字節(jié)數(shù)或從零地址寫入超過8個(gè)字節(jié)數(shù)會(huì)形成地址翻卷,導(dǎo)致寫入出錯(cuò)。 對(duì)緩沖器的輸人稱為頁(yè)寫,緩沖器的容量 2. 設(shè)備地址(DADDR) AT24C04xx的器件地址是1010。2. 設(shè)備地址(DADDR)3. AT24Cxx的數(shù)據(jù)操作格式 在IIC總線中,對(duì)AT24C04內(nèi)部存儲(chǔ)單元讀寫,除了要給出器件的設(shè)備地址(DADDR)外,還須指定讀寫的頁(yè)面地址(PADDR)。兩者組成操作地址(OPADDR)如下: 1010 A2 A1 R/W (“”為無效) 系統(tǒng)中引腳A2A1A0為000,因此,系統(tǒng)可尋址AT24C04全部頁(yè)面,共4K位。按照AT24C04器件手冊(cè)讀寫地址(ADDR1010 A2 A

34、1R/W)中的數(shù)據(jù)操作格式如下:3. AT24Cxx的數(shù)據(jù)操作格式(1) 寫入操作格式 任意寫一個(gè)字節(jié)到地址ADDR_W,其時(shí)序圖如圖5-21所示,寫入操作格式為: START_C OPADDR_W ACK ADDR_W ACK data ACK STOP_C(1) 寫入操作格式人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 從地址ADDR_W起連續(xù)寫人n個(gè)字節(jié)(同一頁(yè)面),其時(shí)序圖如圖5-22所示,寫人格式為: START_C OPADDR_W ACK ADDR_W ACK data1 ACK data2 ACK.datan ACK STOP_C 從地址ADDR_W起連續(xù)寫人n個(gè)字節(jié)(同人機(jī)接口電路設(shè)計(jì)方

35、案及編程學(xué)課件(2) 讀出操作格式 從任意地址ADDR_R讀一個(gè)字節(jié)的時(shí)序圖如圖5-23所示,讀出操作格式為: START_C OPADDR_W ACK ADDR_R ACK OPADDR_R ACK data STOP_C(2) 讀出操作格式人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 從地址ADDR_R起連續(xù)讀出n個(gè)字節(jié)(同一頁(yè)面),其時(shí)序圖如圖5-24所示,讀出操作格式為: START_C OPADDR_R ACK data1 ACK data2 ACK . datan ACK STOP_C 從地址ADDR_R起連續(xù)讀出n個(gè)字節(jié)(同人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件 在讀任意地址操作中,除了發(fā)送讀地址

36、外,還要發(fā)送頁(yè)面地址(PADDR); 因此,在連續(xù)讀出72個(gè)字節(jié)操作前,要進(jìn)行1個(gè)字節(jié)PADDR寫入操作,然后重新啟動(dòng)讀操作。 注意,讀操作完成后沒有ACK。 在讀任意地址操作中,除了發(fā)送讀地址外,還5.6.3 編程1. I/O 端口 IIC 功能設(shè)置 我們采用PF0口和PF1口工作在第2功能模式下,分別作為 IIC總線的SCL和SDA與24LC04B相連。 因此,需要設(shè)置PF0和PF1工作在第2功能模式下。采用以下語句: rPCONF |= 0 xa; /PF0:IICSCL, PF1:IICSDA rPUPF |= 0 x3; /pull-up disable5.6.3 編程1. I/O

37、端口 IIC 功能設(shè)置2. IIC中斷使能 由于是采用中斷的方式了解每個(gè)字節(jié)的傳輸是否成功。 因此需要定義中斷處理程序入口,并且使能中斷。采用以下語句實(shí)現(xiàn): pISR_IIC= (unsigned)IIC_Int; /將 IIC 中斷處理程序指針指向 IIC_Int rINTMSK= (BIT_GLOBAL|BIT_IIC); /使能中斷2. IIC中斷使能3. 初始化 IIC 接口 對(duì) IICCON 進(jìn)行設(shè)置: rIICCON = (17) | (06 ) | (15) | (0 xf ); /使能 ACK的產(chǎn)生, IICCLK=MCLK/16, 使能發(fā)送/接收中斷,清除 pending 位

38、以便響應(yīng) /中斷,Tx clock(64MHz/16)/(15+1) = 250KHz3. 初始化 IIC 接口4. 向24LC04B中寫入數(shù)據(jù)子程序 #define IICBUFSIZE 0 x20 U8 _iicDataIICBUFSIZE; /寫數(shù)據(jù)緩存 volatile int _iicDataCount; /數(shù)據(jù)長(zhǎng)度 volatile int _iicStatus; volatile int _iicMode; int _iicPt;4. 向24LC04B中寫入數(shù)據(jù)子程序 void Wr24LCxx(U32 slvAddr,U32 addr,U8 data) _iicMode=WRD

39、ATA; /寫數(shù)據(jù)模式 _iicPt=0; _iicData0=(U8)addr; /字節(jié)寫入模式,數(shù)據(jù)格式 參考教材內(nèi)容 _iicData1=data; _iicDataCount=2; rIICDS=0 xa0; /控制字節(jié) rIICSTAT=0 xf0; /主設(shè)備發(fā)送模式,產(chǎn)生起 始條件,使能發(fā)送/接收 while(_iicDataCount != -1); _iicMode=POLLACK; void Wr24LCxx(U32 slvAddr,U32 while(1) rIICDS=slvAddr; _iicStatus=0 x100; rIICSTAT=0 xf0; /MasTx,S

40、tart rIICCON=0 xaf; /resumes IIC operation. while(_iicStatus=0 x100); if(!(_iicStatus&0 x1) break; / 成功接收到 ACK rIICSTAT=0 xd0; /產(chǎn)生停止條件 rIICCON=0 xaf;/釋放 IIC 操作 Delay(1); /等待,直到停止條件起作用,寫入成功 while(1)5. 從24LC04B讀出數(shù)據(jù)子程序void Rd24LCxx(U32 slvAddr,U32 addr,U8 *data)_iicMode=SETRDADDR;_iicPt=0;_iicData0=(U8

41、)addr;_iicDataCount=1;rIICDS=slvAddr;rIICSTAT=0 xf0;/MasTx,Start5. 從24LC04B讀出數(shù)據(jù)子程序while(_iicDataCount != -1);_iicMode=RDDATA;_iicPt=0;_iicDataCount=1;rIICDS=slvAddr;rIICSTAT=0 xb0; /MasRx,StartrIICCON=0 xaf; /resumes IIC operation.while(_iicDataCount != -1);*data=_iicData1;while(_iicDataCount != -1)

42、;6. IIC中斷處理子程序void _irq IIC_Int (void)U32 iicSt, i ;rI_ISPC=BIT_IIC; /清除 pending 位iicSt=rIICSTAT; /讀入 IIC 總線單前狀態(tài),以 便進(jìn)行各種錯(cuò)誤處理if(iicSt&0 x8) / when bus arbitration is failed.if(iicSt&0 x4) / when a slave address is matched with IICADDif(iicSt&0 x2) / when a slave address is 0000000bif(iicSt&0 x1) / wh

43、en ACK isnt received6. IIC中斷處理子程序switch(_iicMode) /根據(jù)當(dāng)前操作模式進(jìn)行相應(yīng)處理case POLLACK: /等待 ACK 模式_iicStatus=iicSt; /讀入 IICSTAT,第 0 位表示是否 接收到 ACKbreak;case RDDATA: /讀數(shù)據(jù)模式if(_iicDataCount -)=0) /只要讀取 1 字節(jié)數(shù)據(jù)_iicData_iicPt+=rIICDS;rIICSTAT=0 x90; /停止主設(shè)備讀取模式rIICCON=0 xaf; /釋放 IIC 操作Delay(1); /等待直到停止條件起作用break;sw

44、itch(_iicMode) /根據(jù)當(dāng)前操作模式 _iicData_iicPt+=rIICDS; /未讀完所有數(shù)據(jù)最后一個(gè)字節(jié)不能產(chǎn)生 ACKif(_iicDataCount)=0) /如果讀完了所有數(shù)據(jù)(最后一個(gè)字節(jié))rIICCON=0 x2f; / 產(chǎn)生 NOACK.釋放 IIC 操作elserIICCON=0 xaf; / 產(chǎn)生 ACK 釋放 IIC 操作break;case WRDATA: /寫數(shù)據(jù)模式if(_iicDataCount-)=0) /如果數(shù)據(jù)寫完rIICSTAT=0 xd0; /停止主設(shè)備發(fā)送傳輸rIICCON=0 xaf; /恢復(fù) IIC 操作Delay(1); /等待

45、,直到停止條件起效break; _iicData_iicPt+=rIICDS;rIICDS=_iicData_iicPt+; /_iicData0 has dummy.for(i=0;i10;i+); /for setup time until rising edge of IICSCLrIICCON=0 xaf;/釋放 IIC 總線操作break;case SETRDADDR:/設(shè)置讀地址模式/Uart_Printf(S%d,_iicDataCount);rIICDS=_iicData_iicPt+; if(_iicDataCount-)=0)break; /IIC operation is

46、 stopped because of IICCON4rIICDS=_iicData_iicPt+for(i=0;i10;i+); /for setup time until rising edge of IICSCLrIICCON=0 xaf;/釋放 IIC 總線操作break;default:break;if(_iicDataCount-)=0)5.7 其他接口電路設(shè)計(jì)及編程5.7 其他接口電路設(shè)計(jì)及編程5.7.1 定時(shí)器編程 讓定時(shí)器0的 TOUT0引腳輸出頻率為16K,占空比為 30的 PWM 脈沖調(diào)制波形;定時(shí)約0.5秒后產(chǎn)生定時(shí)中斷。5.7.1 定時(shí)器編程 讓定時(shí)器01. 定時(shí)器初

47、始化(1) I/O 口設(shè)置 采用以下語句對(duì) PE 口的工作方式進(jìn)行設(shè)置,使之工作在定時(shí)器輸出狀態(tài): rPCONE=0 xaaa8; /Tout0/1/2/3/4, RxD0, TxD0 rPUPE |=0 xf8;(2) 定時(shí)器時(shí)鐘源頻率設(shè)置 通過以下語句來設(shè)置定時(shí)器的時(shí)鐘源:rTCFG0=0 x1010101; / 預(yù)分頻值為 1rTCFG1=0 x01; / 分割比例=1/4經(jīng)過設(shè)置后,定時(shí)器時(shí)鐘源頻率 = (MCLK/1)/41. 定時(shí)器初始化(3) 設(shè)置輸出波形頻率 通過以下語句來設(shè)置輸出波形的頻率: rTCNTB0=1000; 經(jīng)過設(shè)置,輸出 PWM 波形的頻率為 MCLK/4000

48、; 由于系統(tǒng)采用的 MCLK64M,因此,PWM 波形頻率為 16K。(4) 設(shè)置占空比 通過以下語句來設(shè)置輸出波形的占空比: rTCMPB0=300; 針對(duì)實(shí)驗(yàn)要求:300/100030(3) 設(shè)置輸出波形頻率(5) 設(shè)置定時(shí)器控制寄存器、啟動(dòng)定時(shí)器 rTCON=0 xaaaa0a; /自動(dòng)重載模式,關(guān)閉反轉(zhuǎn)功能,手動(dòng)更 新,關(guān)閉死區(qū)rTCON=0 x999909; /啟動(dòng) PWM 操作 定時(shí)器啟動(dòng)后,可以采用示波器觀察 TOUT0輸出波形,是否滿足要求。(5) 設(shè)置定時(shí)器控制寄存器、啟動(dòng)定時(shí)器2. 定時(shí)器中斷主程序 參考程序如下:volatile int variable0;void Te

49、st_TimerInt(void) rINTMSK=(BIT_GLOBAL|BIT_TIMER0) pISR_TIMER0=(int)Timer0Done; /修改中斷處理函數(shù)的指針 rTCFG0=0 x00f; /dead zone=0, pre0=0 xf /設(shè)定時(shí)鐘源頻率 rTCFG1=0 x04; /all interrupt, mux0=1/32 rTCNTB0=0 xffff; /(1/(64MHz/15/32)*0 xffff=0.49s2. 定時(shí)器中斷主程序rTCON=0 x02;/手動(dòng)更新 timer0 的設(shè)置rTCON=0 x01;/T0=one shot,啟動(dòng)定時(shí)器whi

50、le(variable0=0);/等待中斷發(fā)生rTCON=0 x0;/停止定時(shí)器rINTMSK=BIT_GLOBAL; /關(guān)閉中斷rTCON=0 x02;3. 定時(shí)中斷服務(wù)程序void _irq Timer0Done(void)rI_ISPC=BIT_TIMER0;/清中斷 pending 位variable0+; /更新變量3. 定時(shí)中斷服務(wù)程序5.7.2 實(shí)時(shí)日歷時(shí)鐘RTC1. 電路 如圖5-25為 32.768KHZ 晶振的電路連接示例:5.7.2 實(shí)時(shí)日歷時(shí)鐘RTC1. 電路人機(jī)接口電路設(shè)計(jì)方案及編程學(xué)課件2. 編程(1) 實(shí)時(shí)時(shí)鐘初始化初始化示例程序如下:#define TESTYE

51、AR 0 x99#define TESTMONTH 0 x12#define TESTDAY 0 x31#define TESTDATE 0 x06 /星期五#define TESTHOUR 0 x23#define TESTMIN 0 x59#define TESTSEC 0 x302. 編程void Rtc_Init(void)rRTCCON = 0 x01; /讀寫使能, 1/32768, Normal(merge), No resetrBCDYEAR = TESTYEAR;rBCDMON = TESTMONTH;rBCDDAY = TESTDAY; / SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7void Rtc_Init(void) rBCDDATE = TESTDATE;rBCDHOUR = TESTHOUR;rBCDMIN = TESTMIN;rBCDSEC = TESTSEC;rRTCCON = 0 x00; /讀寫禁止 以上程序?qū)刂萍拇嫫鬟M(jìn)行了設(shè)置,并更新了 RTC 日期時(shí)間寄存器,從此刻

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論