單片機與PS2鼠標程序滾輪識別顯示3D坐標_第1頁
單片機與PS2鼠標程序滾輪識別顯示3D坐標_第2頁
單片機與PS2鼠標程序滾輪識別顯示3D坐標_第3頁
單片機與PS2鼠標程序滾輪識別顯示3D坐標_第4頁
單片機與PS2鼠標程序滾輪識別顯示3D坐標_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機與PS2鼠標滾輪識別顯示3D坐標簡介:PS2鼠標,具有滾輪識別,LCD1602顯示3D坐標,有LED指示燈,等等其實發(fā)現(xiàn)學(xué)起來也很簡單。由于在網(wǎng)上找不到51單片機可以識別鼠標帶滾輪的完整可用程序, 也就是3D, X,Y, Z;軸功能的程序,筆者花了很長時間嘗試,終于整出來了,特拿出來與所有單片機菜鳥 分享。第一步:PS/2接口和協(xié)議簡介1 PS/2接口和協(xié)議1.1接口的物理特性PS/2接口用于許多現(xiàn)代的鼠標和鍵盤,由IBM最初開發(fā)和使用?物理上的PS/2接口有兩種類型的連接器:5腳的DIN和6腳的mini-DIN ?圖1就是兩種連接器的引腳定義?使用中,主機提供+5V電源給鼠標,鼠標的地

2、連接到主機電源地上?勺舟的DIN樺的 mni-DIN5SI的DINQ1時 frHCLOCIO(DATAZ鰲據(jù)(DATA)未實現(xiàn).SBah-,電ar地(曲a6薦的 nuni-DIN)4逼猱地WKDJ%a+&v(vcc)5F 電 M*&VVCC)時鐘(CLOCK)6未實規(guī)、保留圖1 K/2健口連接黔弓腳定義1.2接口協(xié)議原理PS/2鼠標接口采用一種雙向同步串行協(xié)議?即每在時鐘線上發(fā)一個脈沖,就在數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)?在相互傳輸中,主機擁有總線控制權(quán),即它可以在任何時候抑制鼠標的發(fā)送?方法是把時鐘線一直拉低鼠標就不能產(chǎn)生時鐘信號和發(fā)送數(shù)據(jù)?在兩個方向的傳輸中,時鐘信號都是由鼠標產(chǎn)生,即主機不產(chǎn)生通信

3、時鐘信號?如果主機要發(fā)送數(shù)據(jù),它必須控制鼠標產(chǎn)生時鐘信號?方法如下:主機首先下拉時鐘線至少100卩s抑制通信,然后再下拉數(shù)據(jù)線,最后釋放時鐘線?通過這一時序控制鼠標產(chǎn)生時鐘信號?當鼠標檢測到這個時序狀態(tài),會在10ms內(nèi)產(chǎn)生時鐘信號?如圖3中A時序段?主機和鼠標之間,傳輸數(shù)據(jù)幀的時序如圖2?圖3所示?2.2數(shù)據(jù)包結(jié)構(gòu)在主機程序中,利用每個數(shù)據(jù)位的時鐘脈沖觸發(fā)中斷 ,在中斷例程中實現(xiàn)數(shù)據(jù)位的判斷 和接收?在實驗過程中,通過合適的編程,能夠正確控制并接收鼠標數(shù)據(jù) ?但該方案有一點不足,由于每個 CLOCK都要產(chǎn)生一次中斷,中斷頻繁,需要耗用大量的主機資源 ?LrLrLruLrLrLn_rm_rLj數(shù)

4、據(jù)位O 起fe位停止位 蠱位 數(shù)據(jù)&召X義 數(shù)據(jù)位4DC數(shù)據(jù)位3 數(shù)據(jù)位2匿2亂標到宅機的傳輸時序+ f:)* 苛甘LrLTL_nLTLJLn_JTJT_rL_h_J_停止儻 校驗諒 %位 7 ft據(jù)位灼- ASEK4 據(jù)儻3 ft據(jù)位2 起治位 據(jù)糊3主拭劇軾標的傳輸時庫2 PS/2鼠標的工作模式和協(xié)議數(shù)據(jù)包格式2.1 PS/2鼠標的四種工作模式PS/2鼠標的四種工作模式是:Reset模式,當鼠標上電或主機發(fā)復(fù)位命令 OxFF給它時進入這種模 式;Stream模式鼠標的默認模式,當鼠標上電或復(fù)位完成后 ,自動進入此模式,鼠標基本上以此模式工 作;Remote模式,只有在主機發(fā)送了模式設(shè)置命令

5、OxFO后,鼠標才進入這種模式;Wrap模式,這種模式只用于測試鼠標與主機連接是否正確?PS/2鼠標在工作過程中,會及時把它的狀態(tài)數(shù)據(jù)發(fā)送給主機?發(fā)送的數(shù)據(jù)包格式如表1所示?表1亂標發(fā)送的毀據(jù)凱格式Bit?Bii6BitSBit 4Bit 3BillMiBitOBytlY oYrfl owX ovrrflofwYbiitNt為h*哼!i l :Middle HtnRi創(chuàng)亦Left Ht jiByf赧X MmrnfeRnl;Bytr4Z MovmirntBytel中的BitO ?Bit1 ?Bit2分別表示左?右?中鍵的狀態(tài),狀態(tài)值0表示釋放,1表示按下?Byte2和Byte3分別表示X軸和丫軸

6、方向的移動計量值,是二進制補碼值?Byte4的低四位表示滾輪的移動計量值,也是二進制補碼值,高四位作為擴展符號位 ?這種數(shù)據(jù)包由帶滾輪的三鍵三維鼠標產(chǎn)生?若是不帶滾輪的三鍵鼠標,產(chǎn)生的數(shù)據(jù)包沒有 Byte4其余的相同?第二步:11.3 PS/2鼠標原理目前最常見的鼠標有 PS/2鼠標和USB鼠標。本章介紹 PS/2鼠標。PS/2鼠標有4種工作模式, 具體如下:(1) 復(fù)位模式。當上電后或接收到復(fù)位命令FF后鼠標即處于此模式。鼠標進行自檢和初始化,再向主機發(fā)送 OxFA,0xAA和0x00, 些參數(shù)將恢復(fù)到默認值,即采樣率為100sample/s非自動流速、流模式、分辨率為 4計數(shù)/mm、禁止狀

7、態(tài)。(2)流模式。如果有按鍵或滾輪動作,即向系統(tǒng)發(fā)送信息,最大發(fā)送速率就是可編程的采樣率。(3) 遙控模式。只有主機發(fā)送了模式設(shè)置指令0xF0后,鼠標才進入這種模式。(4)這種模式只用于檢測鼠標與主機是否連接正確,在該模式下鼠標收到什么就返回什么,除 非收到退出卷繞指令 0xEC或復(fù)位指令0xFF。流模式是默認模式。大多數(shù)應(yīng)用系統(tǒng)使用流模式,鼠標的任何動作都會報告給主機。也可以使用 遙控模式,主機使用0xEB命令請求數(shù)據(jù),鼠標進行應(yīng)答。標準的PS/2協(xié)議數(shù)據(jù)格式為3字節(jié),如表11-4所示。鼠標的按鍵和滾動信息都采用這種格式匯 報給主機。表11-4標準的PS/2協(xié)議數(shù)據(jù)格式Y(jié)OverflowXO

8、verflowYSig nXSig n1Middl e Butto nRightButto nLeft Butto nX moveme ntY moveme nt標準鼠標指支持左右移動和三個鼠標鍵。微軟智能鼠標支持滾輪。當主機向鼠標發(fā)送魔幻序列0xF30xC8 0xF3 0x64 0xF3 0x50后,鼠標進入滾輪模式。 此時讀取鼠標ID返回0x03。此后通信過程使用如表11-5所示的4字節(jié)協(xié)議。表11-5字節(jié)的PS/2協(xié)議數(shù)據(jù)格式Y(jié)OverfloXOverfloY SigX Sig1MiddleRight ButtoLeft ButtowwnnButto nnnX moveme ntY mo

9、veme ntZH moveme ntZL moveme nt其中ZH和ZL都采用二進制補碼表示,范圍為-87。此外,鼠標還有只能IE鼠標和臺風(fēng)(Typhoon )鼠標,通信協(xié)議與上述還有不同。目前最常見的 鼠標就是這兩種。主機和鼠標之間的通信命令有很多。主機向鼠標發(fā)出的每一個字節(jié)和命令鼠標都必須采用OxFA應(yīng)答,但是重傳命令 OxFE除外。如果鼠標接收的命令或數(shù)據(jù)是錯誤的,鼠標發(fā)送OxFE表示NACK ,如果下一個字節(jié)重復(fù)錯誤,鼠標使用 0xFC表示連續(xù)錯誤。OxDO表示讀擴展ID,可最長達256字節(jié)。0xD10xDF是提供商特定命令,如0xD1是Logitech PS/2+命令。0xE1表

10、示讀取第二個 ID。0xE2 表示 IBM TrackPoint 。0xE6表示設(shè)置鼠標比例為原始比例1:1, 即卩X movement和Y movement都以原始值發(fā)送。0xE7表示設(shè)置鼠標比例為原始比例2:1,即如果X movement或Y movement大于等于6,則乘以2后發(fā)送;如果小于 6,貝U 0, 1, 2, 3, 4, 5分別被放大到0, 1 , 1 , 3, 6, 9。0xEA表示設(shè)置鼠標到流模式。OxEB表示讀取鼠標數(shù)據(jù),即讀取一個3字節(jié)或4字節(jié)的包。0xEC清除卷繞模式。0xEE表示設(shè)置鼠標到卷繞模式。OxFO表示設(shè)置鼠標到遙控模式。0xF2表示讀取鼠標ID。0xF3

11、表示設(shè)置鼠標采樣率。0xF4表示設(shè)置鼠標使能。0xF5表示設(shè)置鼠標停止。0xF6表示設(shè)置鼠標到默認值。OxFE表示請求重新發(fā)送。OxFF表示復(fù)位。鼠標還有一些其他的更加復(fù)雜的命令,讀者可參考有關(guān)文獻。第三步:XXXX.C部分*#in clude#in cludemouse.h#i ncludeLCD1602_4.h#in cludeDELAY52.hsbit beep=P3A7;void mai n()LCD1602nit();初始化液晶1602CLEARSCREEN;/ 清屏lnit_m ouse();delayms(500);num(0,2,mouse_byte);/x 坐標值 delay

12、ms(500);host_to_mouse(0xf3);num (0,2,mouse_byte);nu m(0,10,1);delayms(500);delay10us(1); host_to_mouse(0xc8);num (0,2,mouse_byte); num(0,10,2);delayms(500);delay10us(1); host_to_mouse(0xf3);num (0,2,mouse_byte); num(0,10,3);delayms(500);host_to_mouse(0x64);num (0,2,mouse_byte); num(0,10,4);delayms(5

13、00);host_to_mouse(0xf3);num (0,2,mouse_byte);num(0,10,5);delayms(500);host_to_mouse(0x50);num (0,2,mouse_byte); num(0,10,6);delayms(50);delay10us(1); host_to_mouse(0xf2);num (0,2,mouse_byte);num(0,10,7);delayms(50);if(mouse_byte=0x03)LCD1602_write_stri ng(0,0,OK);delayms(500);elseLCD1602_write_stri

14、ng(O,O,DE); delayms(500);delayms(500);while(1) led=1;CLEARSCREEN;/ 清屏LCD1602_write_stri ng(O,O,x:);num(0,2,move_x);/x 坐標值LCD1602_write_stri ng(0,8,y:); num(0,10,move_y);/y 坐標值LCD1602_write_stri ng(1,8,z:); num(1,10,move_z);/y 坐標值 if(mouse_data0&0x01)/ 如果點下左鍵 beep=0;LCD1602_write_stri ng(1,0,left);el

15、se if(mouse_data0&0x02)/ 如果點下右鍵beep=O; LCD1602_write_stri ng(1,0,right);else if(mouse_data0&0x04)/ 如果點下中鍵 beep=0;LCD1602_write_stri ng(1,0,middle);elsebeep=1; LCD1602_write_stri ng(1,0, nothi ng);delayms(50);*Xxx H文件部分 *#ifndef MOUSE_H #defi ne MOUSE_H #in cludeDELAY52.h #includeLCD1602 4.h #defi ne

16、 delay10 _n op_() ;_n op_() ;_n op_();_nop_() ;_n op_() ;_n op_();_ nop_();_nop_() ;_n op_() ;_n op_();#defi ne delay100 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10; sbit mouse_SDA=P3A4;/數(shù)據(jù)線P3_5計數(shù)器0輸入端口 sbit mouse_CLK=P3A3;時鐘線P3_3 外部中斷1輸入端口 sbit led=P3A6;bit pp=0;

17、bit ACK=0;uchar recv=0;uchar bdata mouse_byte; / 接收字節(jié)bdata- 可尋址的片內(nèi) RAMsbit mouse_byte_bit0=mouse_byteA0;/mouse_byte 第 0 位 sbit mouse_byte_bit1=mouse_byteA1;/mouse_byte 第 1 位 sbit mouse_byte_bit2=mouse_byteA2;/mouse_byte 第 2 位 sbit mouse_byte_bit3=mouse_byteA3;/mouse_byte 第 3 位 sbit mouse_byte_bit4=m

18、ouse_byteA4;/mouse_byte 第 4 位 sbit mouse_byte_bit5=mouse_byteA5;/mouse_byte 第 5 位 sbit mouse_byte_bit6=mouse_byteA6;/mouse_byte 第 6 位 sbit mouse_byte_bit7=mouse_byteA7;/mouse_byte 第 7 位uchar bdata mouse_fuction;/ 功能信息字節(jié)uchar mouse_buffer11;接收位數(shù)據(jù)緩沖區(qū)uchar mouse_buffer_bit=0;/mouse_buffermouse_buffer_b

19、ituchar mouse_data4;/接收鼠標數(shù)據(jù)緩沖區(qū),分別存放:功能信息字節(jié),x位移量,y位移量uchar mouse_data_bit=0;/mouse_datamouse_data_bituint move_x=10000; 存放橫坐標uint move_y=10000; 存放縱坐標uchar move_z=0;void Ini t_mouse(void)/ TCON=OxOO; /中斷觸發(fā)方式0EA=1;/開放中斷EX1=1;允許外部中斷1/ ET0=0x01;/允許全局中斷,允許設(shè)定時器/計數(shù)器0溢出中斷 開定時器中斷0PX1=1;/設(shè)置中斷優(yōu)先級設(shè)外部中斷1為最高優(yōu)先級別/*

20、發(fā)送數(shù)據(jù)*void host_to_mouse(uchar cmd)uchar i;EX仁 0;mouse_CLK=0;delay100;delay100;ACC=cmd;pp=P; /獲得奇偶校驗位mouse_SDA=0;mouse_CLK=1;for(i=0;i=1;while(mouse_CLK=0);while(mouse_CLK=1);mouse_SDA=pp; /發(fā)送奇偶校驗位while(mouse_CLK=0);while(mouse_CLK=1);mouse_SDA=1;while(mouse_CLK=0);while(mouse_CLK=1);ACK=mouse_SDA; /

21、 接收應(yīng)答位while(mouse_CLK=0);EX仁 1;/*奇校檢*/uchar Checkout(void)ACC=mouse_byte;if(P=mouse_buffer9)return 1;elsereturn 0;/*數(shù)據(jù)分析及處理*/void data_a nalyse(void)將收到的11位信號中截取8位數(shù)據(jù)放進mouse_bytemouse_byte_bit0=mouse_buffer1;mouse_byte_bit1=mouse_buffer2;mouse_byte_bit2=mouse_buffer3;mouse_byte_bit3=mouse_buffer4;mou

22、se_byte_bit4=mouse_buffer5;mouse_byte_bit5=mouse_buffer6;mouse_byte_bit6=mouse_buffer7;mouse_byte_bit7=mouse_buffer8;if(Checkout()如果校驗正確if(mouse_data_bit4) mouse_datamouse_data_bit+=mouse_byte;if(mouse_data_bit=4)mouse_data_bit=0;if(mouse_data0&0x10) 如果X sign bit為 1,表示鼠標向左移 move_x-=(256-mouse_data1)

23、;/x 坐標減elsemove_x+=mouse_data1;/x 坐標力口if(mouse_data0&0 x20)move_y-=(256-mouse_data2);/y 坐標減elsemove_y+=mouse_data2;/y 坐標力口if(mouse_data3&0x08)move_z-=(16-(mouse_data3&OxOf);elsemouse_data3=mouse_data3&OxOf; move_z+=mouse_data3; /Z 坐標力口/*外部中斷1*/void ReceiveData(void)in terrupt 2 led=0;if(mouse_buffer

24、_bit#in cludeDELAY52.h#defi ne LCD1602_DATA P0#defi ne CLEARSCREEN LCD1602_write_cmd(0x01)sbit LCD1602_RS=P2A5;sbit LCD1602_RW=P2A6;sbit LCD1602_EN=P2A7;/*void LCD1602nit(void);void LCD1602_write_cmd(uchar comma nd);void LCD1602_write_data(uchar temp);void LCD1602_set_xy(uchar x, uchar y);/液晶初始化/寫命令

25、/寫數(shù)據(jù)/設(shè)置坐標void LCD1602_write_char(uchar x,uchar y,uchar dat);/寫一個字符到第 x 行 y 列void LCD1602_write_string(uchar x,uchar y,uchar *s); 寫字符串到第 x 行 y 列 void LCD1602_Read_BF(void);void num(uchar x,uchar y,uint n);在第x行第y列顯示整型數(shù)字 n/*/讀忙信號void LCD1602_I nit(void)LCD1602_write_cmd(0x28);LCD1602_write_cmd(0x28);LC

26、D1602_write_cmd(0x28);設(shè)置4位數(shù)據(jù)傳輸模式LCD1602_write_cmd(0x0C);LCD1602_write_cmd(0x80);CLEARSCREEN;void LCD1602_Read_BF(void)LCD1602_RW=1;RW 1LCD1602_RS=0;/RS 0LCD1602_EN=1;EN 1 Read BFLCD1602_DATA=LCD1602_DATA&OxOF|OxfO;while(LCD1602_DATA&0x80);LCD1602_EN=0;LCDvoid LCD_en_write(void)EN端產(chǎn)生一個高電平脈沖,寫LCD1602_

27、EN=1;_nop_();LCD1602_EN=0;*void LCD1602_write_cmd(uchar comma nd)LCD1602_Read_BF();LCD1602_RS=0;/RS 0LCD1602_RW=0;RW 0LCD1602_DATA&=0x0F;LCD1602_DATA=comma nd&OxfO | LCD1602_DATA&0 x0f;LCD_e n_write();comma nd=comma nd4;LCD1602_DATA&=0x0F;LCD1602_DATA=comma nd&OxfO | LCD1602_DATA&0 x0f;LCD_e n_write

28、();*void LCD1602_write_data(uchar dat)LCD1602_Read_BF();LCD1602_RS=1;/RS 1LCD1602_RW=0; RW 0LCD1602_DATA &=0x0F;LCD1602_DATA=dat&0xf0 | LCD1602_DA TA&0x0f;LCD_e n_write();dat=dat4;LCD1602_DATA &=0x0F;LCD1602_DATA=dat&0xf0 | LCD1602_DA TA&0x0f;LCD_e n_write();*void LCD1602_set_xy(uchar x,uchar y)ucha

29、r address;y&=OxOf;if(!x)address=0x80+y;elseaddress=0xc0+y;LCD1602_write_cmd(address);*void LCD1602_write_char(uchar x,uchar y,uchar dat)LCD1602_set_xy(x,y);LCD1602_write_data(dat);*void LCD1602_write_stri ng(uchar x,uchar y,uchar *s)LCD1602_set_xy(x,y);while(*s)LCD1602_write_data(*s);s+;void num (uc

30、har x,uchar y,uint n)uchar i,le ngth,a6=0,0,0,0,0,0;uint nx=n;if(n=0)LCD1602_write_char(x,y,0);return; for(i=0;i=1)le ngth+;n x/=10;nx=n;for(;le ngthO;le ngth-)ale ngth-1=nx%10+48;n x/=10;LCD1602_write_stri ng(x,y,a);#en dif/*XXX.H文件部分 *#ifndef DELAY52_H#defi ne DELAY52_H#defi ne uchar un sig ned ch

31、ar#defi ne uint un sig ned int#in clude /起始值 delayus(1)=27us,間隔 9.9us void delay10us(ui nt t)while(t-);void delayms( uint t)uint i;uchar j; for(i=0;it;i+) for(j=0;j1ST:分為二牛$位計數(shù)黯3-中斷允訐寄存器IEIE寄存器詳細內(nèi)容在上一節(jié)已講述其中2定時器計數(shù)器有關(guān)的位如幵EJp斷允訐總控制位ETO【ETD 定時器計數(shù)器中斷允訐控制位ITO (ET1) =0禁止定時計數(shù)中斷,ITO (ET1) =1允訐定時計數(shù)中斷.如C31單片機的

32、定時鬍計數(shù)器共有四種工作方式,T7而就一一介鋁.定時器/計數(shù)器的工作方式1 定時器/計數(shù)器的工作方式0(1) 電路邏輯結(jié)構(gòu)當圖6-7中的計數(shù)器=13位(TH的8位與TL低5位)即得方式0的邏輯電路圖。(2) 工作方式0的特點 兩個定時器/計數(shù)器TO、T1均可在方式0下工作; 是13位的計數(shù)結(jié)構(gòu),其計數(shù)器由TH全部8位和TL的低5位構(gòu)成(高3位不用); 當產(chǎn)生計數(shù)溢出時,由硬件自動給計數(shù)溢出標志位TF0(TF1 )置1,由軟件給TH,TL重新置計數(shù)初值。應(yīng)說明的是,方式0采用13位計數(shù)器是為了與早期的產(chǎn)品兼容,計數(shù)初值的高8位和低5位的確定比較麻煩,所以在實際應(yīng)用中常由16位的方式1取代。2 定

33、時器/計數(shù)器的工作方式1(1) 電路邏輯結(jié)構(gòu)方式1是16位計數(shù)結(jié)構(gòu)的工作方式,計數(shù)器由 TH全部8位和TL全部8位構(gòu)成。其 邏輯電路如圖6-11所示。(2) 工作方式1的特點 兩個定時器/計數(shù)器均可在方式1下工作; 是16位的計數(shù)結(jié)構(gòu),其計數(shù)器由TH的全部8位和TL的全部8位構(gòu)成; 當產(chǎn)生計數(shù)溢出時,由硬件自動給計數(shù)溢出標志位TFO(TF1 )置1,由軟件給TH,TL重新置計數(shù)初值。(3) 計數(shù)/定時的范圍在方式1下,當為計數(shù)工作方式時,由于是 16位的計數(shù)結(jié)構(gòu),所以計數(shù)范圍是: 165536。當為定時工作時,其定時時間 =(216-計數(shù)初值)X機器周期,例如:設(shè)單片 機的晶振頻率f=12MH

34、z則機器周期為1卩s,從而定時范圍:1卩s65536卩s。因為80C51單片機的定時計數(shù)器是可編程的。因此,在利用定時 /計數(shù)器進行定時計 數(shù)之前,先要通過軟件對他進行初始化,初始化一般應(yīng)進行如下工作: 設(shè)置工作方式,即設(shè)置 TMO中的各位GATE C/T、M1M0 計算加1計數(shù)器的計數(shù)初值COUN,并將計數(shù)初值COUNT送入TH TL中。計數(shù)方式:計數(shù)值=2n - COUNT,計數(shù)初值:COUNT= 2n-計數(shù)值。定時方式:定時時間=(2n - COUNTX機器周期,計數(shù)初值COUNT = 2n -定時時間/機器周期。其中n=13、16、& 8分別對應(yīng)方式 0、1、2、3。 啟動計數(shù)器工作,

35、即將TR置1。 T0、T1開中斷例6-5 T0工作于:定時方式1,定時時間T=2ms系統(tǒng)主頻fosc=8MHz,允許中斷, 對T0進行初始化編程。解:由于,T0工作于定時方式,T0工作方式1。因此,-1 =0, GATE=0 M1M0=01T1 不用,故 TMOD=0000 0001=01。系統(tǒng)主頻fosc=8M時,時鐘周期T=1/8卩s,機器周期=12T=12/8=1.5卩s。加 1 計器初值 COUNT =21& 2000/1.5 =10000H 535H=FACBH初始化程序如下:MOV SP , #50HMOV TMOJD#01HMOV TH0 #0FAHMOV TLQ #0CBHSE

36、TB TR0SETB ET0SETB EA例6-6定時計器T0工作于計數(shù)方式,計數(shù)值=1,使用方式1,允許中斷,初始化編 程。解:由于,T0工作于計數(shù)方式,T0工作方式1。因此,-I =1,GATE=0 T0工作方式 1,M1M0=0。T1 不用,故 TMOD=0000 0101=05H計數(shù)器初值 COUNT=2W1 = 1111 1111 1111 111仁FF FFH#05HMOVTMOD;設(shè)置T(0工作計數(shù)方式1。#0FFH賦初值FFHMOVTH0;加1計數(shù)器高8位TH0#0FFH賦初值FFHMOVTL0;加1計數(shù)器高8位TL0TR0開關(guān)SETB;打開T0啟動ET0SETB;T0開中斷E

37、ASETB;CPU開中斷3.定時器/計數(shù)器的工作方式2工作方式0和工作方式1的最大特點是產(chǎn)生計數(shù)溢出后,需要由軟件重新給計數(shù)器 賦初值.這樣不但影響定時精度,而且也給程序設(shè)計帶來不便。方式2在計數(shù)溢出后自動重裝計數(shù)器初值。其邏輯結(jié)構(gòu)如下。(1)邏輯結(jié)構(gòu)如圖6-8所示(2)工作方式2的特點 兩個定時器/計數(shù)器均可在方式2下工作; 把計數(shù)器分成兩部分TH和TL,在開始計數(shù)(定時)時,把計數(shù)初值賦給 TL的同 時,也賦給TH,在TL發(fā)生計數(shù)溢出后,而是通過硬件自動把 TH中的內(nèi)容重新賦給TL。 是8位的計數(shù)結(jié)構(gòu)TH暫存器(用來暫時存放計數(shù)初值)。 TL:計數(shù)器。團巧電定時討遞器方式2(3)計數(shù)/定時

38、的范圍由于是8位的計數(shù)結(jié)構(gòu),所以,計數(shù)范圍為 1256,定時時間=(28-計數(shù)初值)機器周期。例6-7 T0工作于定時方式2,定時時間T=500卩s,系統(tǒng)主頻fosc=6 MHz。進行初 始化編程。解:由于,T0工作于定時方式,T0工作方式2。因此,-1 =0, GATE=0 M1M0=10T1 不用,故 TM0D=00000010=02H系統(tǒng)主頻fosc=6M時,時鐘周期T=1/6卩s,機器周期=12T=12/6=2卩s。COUNT =28-500/2 =256 250=06MOV SP , #50HMOV TMOJD#02HMOV TH0 #06HMOV TLQ #06HSETB TR0S

39、ETB ET0SETB EA例6-8設(shè)單片機頻率為6MHz使用定時器0以方式2產(chǎn)生周期為200ys的連續(xù)等 寬正方波脈沖,并由P1.0輸出,以查詢方式來完成。 計算計數(shù)初值要產(chǎn)生200ys的連續(xù)等寬正方波脈沖,只需在P1.0端以100us為周期交替輸出高 低電平即可實現(xiàn),從而定時時間為 100y s。f=6MHz則機器周期為2y s,100= (256-COUN) 2求得:計數(shù)初值COUNT=206=CEH這樣,把CEH裝入TL0的同時,也裝入 TH0中暫存,即:(TH0 = (TL0) =CEH 確定TMO寄存器的內(nèi)容根據(jù)TMOI各位的含義,不難得出(TMOD=02H= 程序KSOVTMOD

40、, -02H:對定時器i耙始化KfOVTL0)血EH;設(shè)置計數(shù)衲值MOVIH0,-0CEH;暫存討數(shù)初值KKIVIE, 0H;漿止申斷SETBIK0;啟動走時器0工作LOOP:JECTF&)LP也:PLOOPLP :CPLPLOLOOP由于工作方式2具有自動裝載功能,因此計數(shù)初值只需設(shè)置一次,以后就不再需要 軟件重置。這是方式2與方式0、1的本質(zhì)區(qū)別。4 定時器/計數(shù)器的工作方式3在前面的三種工作方式中,兩個定時器/計數(shù)器的設(shè)置和使用是完全相同的。但是在 工作方式3下,兩個定時器/計數(shù)器的設(shè)置和使用卻不盡相同,下面分別介紹。(1)在工作方式3下的定時器/計數(shù)器0在工作方式3下,定時器/計數(shù)器0

41、被拆成兩個獨立的8位計數(shù)器TL0和TH0其中 TL0既可以計數(shù)使用,又可以定時使用,定時器 /計數(shù)器0的控制位和引腳信號全歸它使 用。其功能和操作方式0或方式1完全相同。而且邏輯電路結(jié)構(gòu)也極其類似,如圖6-9所示。與TL0的情況不同,對于定時器/計數(shù)器0的另一半TH0則只能作為簡單的定時 器使用。而且由于定時器/計數(shù)器0的控制位已被TL0獨占,因此只好借用定時器/計數(shù) 器1的控制位TR1和TF1。即以計數(shù)溢出去置位TF1,而定時的啟動和停止則受TR1的狀 態(tài)控制。由于TL0既能作定時器使用也能作計數(shù)器使用,而TH0只能作定時器使用卻不能作計數(shù)器使用,因此在工作方式 3下,定時器/計數(shù)器0可以構(gòu)

42、成二個定時器或一個定 時器一個計數(shù)器。嗇出標志TFO啟動開關(guān)TUI加1計數(shù)器謚岀標志6-9定時計數(shù)器方式了的TU結(jié)構(gòu)(2)工作方式3下的定時器/計數(shù)器1如果定時器/計數(shù)器0已工作在工作方式3,則定時器/計數(shù)器1只能工作在方式0、 方式1或方式2下,它的運行控制位TR1及計數(shù)溢出標志位TF1已被定時器/計數(shù)器0借 用,如圖6-10所示。SS-103 的Tl 箱樹在這種情況下,定時器/計數(shù)器1通常是作為串行口的波特率發(fā)生器使用,以確定串行通信的速率。因為已沒有計數(shù)溢出標志位TF1可供使用,因此只能把計數(shù)溢出直接送給串行口。當作為波特率發(fā)生器使用時,只需設(shè)置好工作方式,便可自動運行。如要停 止工作,

43、只需送入一個把它設(shè)置為方式 3的方式控制字就可以了。因為定時器/計數(shù)器1 不能在方式3下使用,如果硬把它設(shè)置為方式 3,就停止工作。定時器/計數(shù)器的應(yīng)用舉例例6-9設(shè)單片機的晶振頻率f=6MHz使用定時器1以方式1產(chǎn)生周期為500s的 等寬正方波脈沖,并由P1.0輸出,以中斷方式完成。 計算計數(shù)初值250= (216-COUN) X 2,求得計數(shù)器初值:(TH1) =FFH ( TL1) =83H 確定TMO寄存器的內(nèi)容 程序IM0D. -10H:對定時黑1初贈化XfOVTH1 -CFFH:設(shè)置計數(shù)初值XiovTLB fS3HSETSEA;中斯總址許SETHET1;允許定吋器1中斷SETBTRI;啟動走時器1的工作SJMF3:等待中斷定時器1向CPU申請中斷時,CPU是轉(zhuǎn)到001BH去響應(yīng)中斷,而001BH開始的8個單元放不下中斷服務(wù)程序,所以在 001BH處安排一條LJMP INT_T1。DTT T1 MO*WC?LRETITHU #OFFH

溫馨提示

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

評論

0/150

提交評論