學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序滾輪識別顯示3D坐標(biāo)_第1頁
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序滾輪識別顯示3D坐標(biāo)_第2頁
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序滾輪識別顯示3D坐標(biāo)_第3頁
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序滾輪識別顯示3D坐標(biāo)_第4頁
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序滾輪識別顯示3D坐標(biāo)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、的地連接到主機(jī)電源地上1.2 接口協(xié)議原理 PS/2鼠標(biāo)接口采用一種雙向同步串行協(xié)議即每在時鐘線上發(fā)一個脈沖,就在數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)在相互傳輸中,主機(jī)擁有總線控制權(quán),即它可以在任何時候抑制鼠標(biāo)的發(fā)送方法是把時鐘線一直拉低,鼠標(biāo)就不能產(chǎn)生時鐘信號和發(fā)送數(shù)據(jù)在兩個方向的傳輸中,時鐘信號都是由鼠標(biāo)產(chǎn)生,即主機(jī)不產(chǎn)生通信時鐘信號 如果主機(jī)要發(fā)送數(shù)據(jù),它必須控制鼠標(biāo)產(chǎn)生時鐘信號方法如下:主機(jī)首先下拉時鐘線至少100s抑制通信,然后再下拉數(shù)據(jù)線,最后釋放時鐘線通過這一時序控制鼠標(biāo)產(chǎn)生時鐘信號當(dāng)鼠標(biāo)檢測到這個時序狀態(tài),會在10ms內(nèi)產(chǎn)生時鐘信號如圖3中 A 時序段主機(jī)和鼠標(biāo)之間,傳輸數(shù)據(jù)幀的時序如圖2圖3

3、所示2.2 數(shù)據(jù)包結(jié)構(gòu)在主機(jī)程序中,利用每個數(shù)據(jù)位的時鐘脈沖觸發(fā)中斷,在中斷例程中實(shí)現(xiàn)數(shù)據(jù)位的判斷和接收在實(shí)驗(yàn)過程中,通過合適的編程,能夠正確控制并接收鼠標(biāo)數(shù)據(jù)但該方案有一點(diǎn)不足,由于每個CLOCK都要產(chǎn)生一次中斷,中斷頻繁,需要耗用大量的主機(jī)資源2 PS/2鼠標(biāo)的工作模式和協(xié)議數(shù)據(jù)包格式2.1 PS/2鼠標(biāo)的四種工作模式 PS/2鼠標(biāo)的四種工作模式是:Reset模式,當(dāng)鼠標(biāo)上電或主機(jī)發(fā)復(fù)位命令 0xFF給它時進(jìn)入這種模式;Stream模式鼠標(biāo)的默認(rèn)模式,當(dāng)鼠標(biāo)上電或復(fù)位完成后,自動進(jìn)入此模式,鼠標(biāo)基本上以此模式工作;Remote模式,只有在主機(jī)發(fā)送了模式設(shè)置命令 0xF0后,鼠標(biāo)才進(jìn)入這種模

4、式;Wrap模式,這種模式只用于測試鼠標(biāo)與主機(jī)連接是否正確 PS/2鼠標(biāo)在工作過程中,會及時把它的狀態(tài)數(shù)據(jù)發(fā)送給主機(jī)發(fā)送的數(shù)據(jù)包格式如表1所示Byte1中的Bit0Bit1Bit2分別表示左右中鍵的狀態(tài),狀態(tài)值0表示釋放,1表示按下Byte2和Byte3分別表示X軸和Y軸方向的移動計(jì)量值,是二進(jìn)制補(bǔ)碼值Byte4的低四位表示滾輪的移動計(jì)量值,也是二進(jìn)制補(bǔ)碼值,高四位作為擴(kuò)展符號位這種數(shù)據(jù)包由帶滾輪的三鍵三維鼠標(biāo)產(chǎn)生若是不帶滾輪的三鍵鼠標(biāo),產(chǎn)生的數(shù)據(jù)包沒有Byte4 其余的相同第二步:11.3 PS/2鼠標(biāo)原理目前最常見的鼠標(biāo)有PS/2鼠標(biāo)和USB鼠標(biāo)。本章介紹PS/2鼠標(biāo)。PS/2鼠標(biāo)有4種工

5、作模式,具體如下:(1)復(fù)位模式。當(dāng)上電后或接收到復(fù)位命令FF后鼠標(biāo)即處于此模式。鼠標(biāo)進(jìn)行自檢和初始化,再向主機(jī)發(fā)送0xFA,0xAA和0x00,一些參數(shù)將恢復(fù)到默認(rèn)值,即采樣率為100sample/s非自動流速、流模式、分辨率為4計(jì)數(shù)/mm、禁止?fàn)顟B(tài)。(2)流模式。如果有按鍵或滾輪動作,即向系統(tǒng)發(fā)送信息,最大發(fā)送速率就是可編程的采樣率。(3)遙控模式。只有主機(jī)發(fā)送了模式設(shè)置指令0xF0后,鼠標(biāo)才進(jìn)入這種模式。(4)這種模式只用于檢測鼠標(biāo)與主機(jī)是否連接正確,在該模式下鼠標(biāo)收到什么就返回什么,除非收到退出卷繞指令0xEC或復(fù)位指令0xFF。流模式是默認(rèn)模式。大多數(shù)應(yīng)用系統(tǒng)使用流模式,鼠標(biāo)的任何動

6、作都會報告給主機(jī)。也可以使用遙控模式,主機(jī)使用0xEB命令請求數(shù)據(jù),鼠標(biāo)進(jìn)行應(yīng)答。標(biāo)準(zhǔn)的PS/2協(xié)議數(shù)據(jù)格式為3字節(jié),如表11-4所示。鼠標(biāo)的按鍵和滾動信息都采用這種格式匯報給主機(jī)。表11-4 標(biāo)準(zhǔn)的PS/2協(xié)議數(shù)據(jù)格式Y(jié)OverflowXOverflowYSignXSign1MiddleButtonRightButtonLeftButtonX movementY movement標(biāo)準(zhǔn)鼠標(biāo)指支持左右移動和三個鼠標(biāo)鍵。微軟智能鼠標(biāo)支持滾輪。當(dāng)主機(jī)向鼠標(biāo)發(fā)送魔幻序列0xF3 0xC8 0xF3 0x64 0xF3 0x50后,鼠標(biāo)進(jìn)入滾輪模式。此時讀取鼠標(biāo)ID返回0x03。此后通信過程使用如表11

7、-5所示的4字節(jié)協(xié)議。表11-5 字節(jié)的PS/2協(xié)議數(shù)據(jù)格式Y(jié)OverflowXOverflowYSignXSign1MiddleButtonRightButtonLeftButtonX movementY movementZH movementZL movement其中ZH和ZL都采用二進(jìn)制補(bǔ)碼表示,范圍為-87。此外,鼠標(biāo)還有只能IE鼠標(biāo)和臺風(fēng)(Typhoon)鼠標(biāo),通信協(xié)議與上述還有不同。目前最常見的鼠標(biāo)就是這兩種。主機(jī)和鼠標(biāo)之間的通信命令有很多。主機(jī)向鼠標(biāo)發(fā)出的每一個字節(jié)和命令鼠標(biāo)都必須采用0xFA應(yīng)答,但是重傳命令0xFE除外。如果鼠標(biāo)接收的命令或數(shù)據(jù)是錯誤的,鼠標(biāo)發(fā)送0xFE表示N

8、ACK,如果下一個字節(jié)重復(fù)錯誤,鼠標(biāo)使用0xFC表示連續(xù)錯誤。0xD0表示讀擴(kuò)展ID,可最長達(dá)256字節(jié)。0xD10xDF是提供商特定命令,如0xD1是Logitech PS/2+命令。0xE1表示讀取第二個ID。0xE2表示IBM TrackPoint。0xE6表示設(shè)置鼠標(biāo)比例為原始比例1:1,即X movement和Y movement都以原始值發(fā)送。0xE7表示設(shè)置鼠標(biāo)比例為原始比例2:1,即如果X movement或Y movement大于等于6,則乘以2后發(fā)送;如果小于6,則0,1,2,3,4,5分別被放大到0,1,1,3,6,9。0xEA表示設(shè)置鼠標(biāo)到流模式。0xEB表示讀取鼠標(biāo)數(shù)

9、據(jù),即讀取一個3字節(jié)或4字節(jié)的包。0xEC清除卷繞模式。0xEE表示設(shè)置鼠標(biāo)到卷繞模式。0xF0表示設(shè)置鼠標(biāo)到遙控模式。0xF2表示讀取鼠標(biāo)ID。0xF3表示設(shè)置鼠標(biāo)采樣率。0xF4表示設(shè)置鼠標(biāo)使能。0xF5表示設(shè)置鼠標(biāo)停止。0xF6表示設(shè)置鼠標(biāo)到默認(rèn)值。0xFE表示請求重新發(fā)送。0xFF表示復(fù)位。鼠標(biāo)還有一些其他的更加復(fù)雜的命令,讀者可參考有關(guān)文獻(xiàn)。第三步:/* XXXX.C部分*/#include#includemouse.h#includeLCD1602_4.h#includeDELAY52.hsbit beep=P37;void main()LCD1602_Init();/初始化液晶1

10、602CLEARSCREEN;/清屏Init_mouse();delayms(500); num(0,2,mouse_byte);/x坐標(biāo)值 delayms(500); host_to_mouse(0xf3);num(0,2,mouse_byte);num(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

11、(500);host_to_mouse(0x64);num(0,2,mouse_byte);num(0,10,4);delayms(500);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) LC

12、D1602_write_string(0,0,OK);delayms(500); elseLCD1602_write_string(0,0,DE);delayms(500);delayms(500);while(1)led=1;CLEARSCREEN;/清屏LCD1602_write_string(0,0,x:);num(0,2,move_x);/x坐標(biāo)值LCD1602_write_string(0,8,y:);num(0,10,move_y);/y坐標(biāo)值 LCD1602_write_string(1,8,z:); num(1,10,move_z);/y坐標(biāo)值if(mouse_data0&0x

13、01)/如果點(diǎn)下左鍵beep=0;LCD1602_write_string(1,0,left);else if(mouse_data0&0x02)/如果點(diǎn)下右鍵beep=0;LCD1602_write_string(1,0,right);else if(mouse_data0&0x04)/如果點(diǎn)下中鍵beep=0;LCD1602_write_string(1,0,middle);elsebeep=1;LCD1602_write_string(1,0,nothing); delayms(50);/*XXX.H文件部分*/#ifndef MOUSE_H#define MOUSE_H#include

14、DELAY52.h#includeLCD1602_4.h#define delay10 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); #define delay100 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10;sbit mouse_SDA=P34;/數(shù)據(jù)線P3_5計(jì)數(shù)器0輸入端口sbit mouse_CLK=P33;/時鐘線P3_3 外部中斷1輸入端口sbit l

15、ed=P36;bit pp=0; bit ACK=0; uchar recv=0; uchar bdata mouse_byte; /接收字節(jié) bdata-可尋址的片內(nèi)RAMsbit mouse_byte_bit0=mouse_byte0;/mouse_byte第0位sbit mouse_byte_bit1=mouse_byte1;/mouse_byte第1位sbit mouse_byte_bit2=mouse_byte2;/mouse_byte第2位sbit mouse_byte_bit3=mouse_byte3;/mouse_byte第3位sbit mouse_byte_bit4=mous

16、e_byte4;/mouse_byte第4位sbit mouse_byte_bit5=mouse_byte5;/mouse_byte第5位sbit mouse_byte_bit6=mouse_byte6;/mouse_byte第6位sbit mouse_byte_bit7=mouse_byte7;/mouse_byte第7位uchar bdata mouse_fuction;/功能信息字節(jié) uchar mouse_buffer11;/接收位數(shù)據(jù)緩沖區(qū)uchar mouse_buffer_bit=0;/mouse_buffermouse_buffer_bituchar mouse_data4;/

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

18、t_to_mouse(uchar cmd) uchar i; EX1=0; mouse_CLK=0; delay100; delay100; ACC=cmd; pp=P; /獲得奇偶校驗(yàn)位 mouse_SDA=0; mouse_CLK=1; for(i=0;i=1; while(mouse_CLK=0); while(mouse_CLK=1); mouse_SDA=pp; /發(fā)送奇偶校驗(yàn)位 while(mouse_CLK=0); while(mouse_CLK=1); mouse_SDA=1; while(mouse_CLK=0); while(mouse_CLK=1); ACK=mouse_

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

20、buffer4;mouse_byte_bit4=mouse_buffer5;mouse_byte_bit5=mouse_buffer6;mouse_byte_bit6=mouse_buffer7;mouse_byte_bit7=mouse_buffer8;if(Checkout()/如果校驗(yàn)正確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,表示鼠標(biāo)向左移move_x-=(256-m

21、ouse_data1);/x坐標(biāo)減elsemove_x+=mouse_data1;/x坐標(biāo)加if(mouse_data0&0x20)move_y-=(256-mouse_data2);/y坐標(biāo)減elsemove_y+=mouse_data2;/y坐標(biāo)加if(mouse_data3&0x08) move_z-=(16-(mouse_data3&0x0f);else mouse_data3=mouse_data3&0x0f; move_z+=mouse_data3; /Z坐標(biāo)加 /* 外部中斷1*/void ReceiveData(void) interrupt 2led=0;if(mouse_b

22、uffer_bit=10) while(mouse_CLK=0);/等待設(shè)備拉高時鐘線mouse_buffermouse_buffer_bit+=mouse_SDA;/接收數(shù)據(jù)if(mouse_buffer_bit=10)data_analyse();/數(shù)據(jù)分析及處理mouse_buffer_bit=0; #endif/*XXX.H文件部分*/#ifndefLCD1602_4_H#define LCD1602_4_H#include #includeDELAY52.h#define LCD1602_DATA P0#define CLEARSCREEN LCD1602_write_cmd(0x0

23、1)sbit LCD1602_RS=P25;sbit LCD1602_RW=P26; sbit LCD1602_EN=P27;/*void LCD1602_Init(void);/液晶初始化void LCD1602_write_cmd(uchar command);/寫命令void LCD1602_write_data(uchar temp);/寫數(shù)據(jù)void LCD1602_set_xy(uchar x, uchar y);/設(shè)置坐標(biāo)void LCD1602_write_char(uchar x,uchar y,uchar dat);/寫一個字符到第x行y列void LCD1602_writ

24、e_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_Init(void) LCD1602_write_cmd(0x28);LCD1602_write_cmd(0x28);LCD1602_write_cmd(0x28);/設(shè)置4位數(shù)據(jù)傳輸模式LCD1602_write_cmd(0x0C);LCD1602_write_cmd(0x80); CLEARSCREEN;voi

25、d LCD1602_Read_BF(void)LCD1602_RW=1;/RW 1LCD1602_RS=0;/RS 0LCD1602_EN=1;/EN 1Read BF LCD1602_DATA=LCD1602_DATA&0x0F|0xf0;while(LCD1602_DATA&0x80);LCD1602_EN=0;void LCD_en_write(void) /EN端產(chǎn)生一個高電平脈沖,寫LCD LCD1602_EN=1;_nop_(); LCD1602_EN=0; /*void LCD1602_write_cmd(uchar command)LCD1602_Read_BF();LCD16

26、02_RS=0; /RS 0 LCD1602_RW=0;/RW 0 LCD1602_DATA&=0x0F;LCD1602_DATA=command&0xf0 | LCD1602_DATA&0x0f;LCD_en_write();command=command4; LCD1602_DATA&=0x0F;LCD1602_DATA=command&0xf0 | LCD1602_DATA&0x0f;LCD_en_write();/*void LCD1602_write_data(uchar dat)LCD1602_Read_BF();LCD1602_RS=1; /RS 1 LCD1602_RW=0;

27、/RW 0 LCD1602_DATA &=0x0F;LCD1602_DATA=dat&0xf0 | LCD1602_DATA&0x0f;LCD_en_write();dat=dat4;LCD1602_DATA &=0x0F;LCD1602_DATA=dat&0xf0 | LCD1602_DATA&0x0f;LCD_en_write();/*void LCD1602_set_xy(uchar x,uchar y)uchar address;y&=0x0f;if(!x)address=0x80+y;else address=0xc0+y;LCD1602_write_cmd(address); /*

28、void LCD1602_write_char(uchar x,uchar y,uchar dat)LCD1602_set_xy(x,y); LCD1602_write_data(dat);/*void LCD1602_write_string(uchar x,uchar y,uchar *s)LCD1602_set_xy(x,y); while(*s) LCD1602_write_data(*s); s+;void num(uchar x,uchar y,uint n)uchar i,length,a6=0,0,0,0,0,0;uint nx=n;if(n=0)LCD1602_write_c

29、har(x,y,0);return;for(i=0;i=1)length+;nx/=10;nx=n;for(;length0;length-)alength-1=nx%10+48;nx/=10;LCD1602_write_string(x,y,a);#endif/*XXX.H文件部分*/#ifndef DELAY52_H#define DELAY52_H#define uchar unsigned char#define uint unsigned int#include/起始值delayus(1)=27us,間隔9.9usvoid delay10us(uint t)while(t-);voi

30、d delayms(uint t)uint i;uchar j;for(i=0;it;i+)for(j=0;j125;j+);#endif整個程序完!先按上面接口連接,然后即可編譯下載,測試然后在修改成自己的代碼。6.3.3 定時計(jì)數(shù)器的控制寄存器定時器/計(jì)數(shù)器的工作方式 1定時器/計(jì)數(shù)器的工作方式0(1)電路邏輯結(jié)構(gòu)當(dāng)圖6-7中的計(jì)數(shù)器=13位(TH的8位與TL低5位)即得方式0的邏輯電路圖。(2)工作方式0的特點(diǎn)兩個定時器/計(jì)數(shù)器T0、T1均可在方式0下工作;是13位的計(jì)數(shù)結(jié)構(gòu),其計(jì)數(shù)器由TH全部8位和TL的低5位構(gòu)成(高3位不用);當(dāng)產(chǎn)生計(jì)數(shù)溢出時,由硬件自動給計(jì)數(shù)溢出標(biāo)志位TF0(TF

31、1)置1,由軟件給TH,TL重新置計(jì)數(shù)初值。應(yīng)說明的是,方式0采用13位計(jì)數(shù)器是為了與早期的產(chǎn)品兼容,計(jì)數(shù)初值的高8位和低5位的確定比較麻煩,所以在實(shí)際應(yīng)用中常由16位的方式1取代。2定時器/計(jì)數(shù)器的工作方式1(1)電路邏輯結(jié)構(gòu)方式1是16位計(jì)數(shù)結(jié)構(gòu)的工作方式,計(jì)數(shù)器由TH全部8位和TL全部8位構(gòu)成。其邏輯電路如圖6-11所示。(2)工作方式1的特點(diǎn)兩個定時器/計(jì)數(shù)器均可在方式1下工作;是16位的計(jì)數(shù)結(jié)構(gòu),其計(jì)數(shù)器由TH的全部8位和TL的全部8位構(gòu)成;當(dāng)產(chǎn)生計(jì)數(shù)溢出時,由硬件自動給計(jì)數(shù)溢出標(biāo)志位TF0(TF1)置1,由軟件給TH,TL重新置計(jì)數(shù)初值。(3)計(jì)數(shù)/定時的范圍在方式1下,當(dāng)為計(jì)數(shù)工

32、作方式時,由于是16位的計(jì)數(shù)結(jié)構(gòu),所以計(jì)數(shù)范圍是:165536。當(dāng)為定時工作時,其定時時間=(216-計(jì)數(shù)初值)機(jī)器周期,例如:設(shè)單片機(jī)的晶振頻率f=12MHz,則機(jī)器周期為1s,從而定時范圍:1s65536s。因?yàn)?0C51單片機(jī)的定時計(jì)數(shù)器是可編程的。因此,在利用定時/計(jì)數(shù)器進(jìn)行定時計(jì)數(shù)之前,先要通過軟件對他進(jìn)行初始化,初始化一般應(yīng)進(jìn)行如下工作:設(shè)置工作方式,即設(shè)置TMOD中的各位GATE、C/T、M1M0。計(jì)算加1計(jì)數(shù)器的計(jì)數(shù)初值COUNT,并將計(jì)數(shù)初值COUNT 送入TH、TL中。計(jì)數(shù)方式:計(jì)數(shù)值 = 2n COUNT ,計(jì)數(shù)初值:COUNT= 2n 計(jì)數(shù)值。定時方式:定時時間 =(2

33、n COUNT)機(jī)器周期,計(jì)數(shù)初值COUNT = 2n 定時時間/機(jī)器周期。其中n=13、16、8、8分別對應(yīng)方式0、1、2 、3。啟動計(jì)數(shù)器工作,即將TR置1。T0、T1開中斷例6-5 T0工作于:定時方式1,定時時間T=2ms,系統(tǒng)主頻fosc=8MHz,允許中斷,對T0進(jìn)行初始化編程。解:由于,T0工作于定時方式,T0工作方式1。因此, =0,GATE=0,M1M0=01。T1不用,故TMOD=0000 0001=01H。系統(tǒng)主頻fosc=8M時,時鐘周期T=1/8s,機(jī)器周期=12T=12/8=1.5s。加1計(jì)器初值COUNT =216 2000/1.5 =10000H535H=FAC

34、BH,初始化程序如下: MOV SP ,#50H MOV TMOD,#01H MOV TH0,#0FAH MOV TL0,#0CBH SETB TR0 SETB ET0 SETB EA例6-6 定時計(jì)器T0工作于計(jì)數(shù)方式,計(jì)數(shù)值=1,使用方式1,允許中斷,初始化編程。解:由于,T0工作于計(jì)數(shù)方式,T0工作方式1。因此, =1,GATE=0, T0工作方式1,M1M0=01。T1不用,故TMOD=0000 0101=05H計(jì)數(shù)器初值COUNT=2161 = 1111 1111 1111 1111=FF FFH MOV TMOD,#05H ;設(shè)置T0工作計(jì)數(shù)方式1。 MOV TH0,#0FFH ;

35、加1 計(jì)數(shù)器高8位TH0賦初值FFH MOV TL0,#0FFH ;加1 計(jì)數(shù)器高8位TL0賦初值FFH SETB TR0 ;打開T0啟動開關(guān) SETB ET0 ;T0開中斷 SETB EA ;CPU開中斷3定時器/計(jì)數(shù)器的工作方式2工作方式0和工作方式1的最大特點(diǎn)是產(chǎn)生計(jì)數(shù)溢出后,需要由軟件重新給計(jì)數(shù)器賦初值.這樣不但影響定時精度,而且也給程序設(shè)計(jì)帶來不便。方式2在計(jì)數(shù)溢出后自動重裝計(jì)數(shù)器初值。其邏輯結(jié)構(gòu)如下。(1)邏輯結(jié)構(gòu)如圖6-8所示(2)工作方式2的特點(diǎn) 兩個定時器/計(jì)數(shù)器均可在方式2下工作; 把計(jì)數(shù)器分成兩部分TH和TL,在開始計(jì)數(shù)(定時)時,把計(jì)數(shù)初值賦給TL的同時,也賦給TH,在

36、TL發(fā)生計(jì)數(shù)溢出后,而是通過硬件自動把TH中的內(nèi)容重新賦給TL。 是8位的計(jì)數(shù)結(jié)構(gòu)TH:暫存器(用來暫時存放計(jì)數(shù)初值)。TL:計(jì)數(shù)器。(3)計(jì)數(shù)/定時的范圍由于是8位的計(jì)數(shù)結(jié)構(gòu),所以,計(jì)數(shù)范圍為1256,定時時間=(28-計(jì)數(shù)初值)機(jī)器周期。例6-7 T0工作于定時方式2,定時時間T=500s ,系統(tǒng)主頻fosc=6 MHz 。進(jìn)行初始化編程。解:由于,T0工作于定時方式,T0工作方式2。因此, =0,GATE=0,M1M0=10。T1不用,故TMOD=00000010=02H系統(tǒng)主頻fosc=6M時,時鐘周期T=1/6s,機(jī)器周期=12T=12/6=2s。 COUNT =28-500/2 =

37、256250=06 MOV SP , #50H MOV TMOD,#02H MOV TH0,#06H MOV TL0,#06H SETB TR0 SETB ET0 SETB EA例6-8 設(shè)單片機(jī)頻率為6MHz,使用定時器0以方式2產(chǎn)生周期為200s的連續(xù)等寬正方波脈沖,并由P1.0輸出,以查詢方式來完成。 計(jì)算計(jì)數(shù)初值要產(chǎn)生200s的連續(xù)等寬正方波脈沖,只需在P1.0端以100s為周期交替輸出高低電平即可實(shí)現(xiàn),從而定時時間為100s。f=6MHz、則機(jī)器周期為2s,100=(256-COUNT)2求得:計(jì)數(shù)初值COUNT=206=CEH。這樣,把CEH裝入TL0的同時,也裝入TH0中暫存,即

38、:(TH0)=(TL0)=CEH 確定TMOD寄存器的內(nèi)容根據(jù)TMOD各位的含義,不難得出(TMOD)=02H。 程序由于工作方式2具有自動裝載功能,因此計(jì)數(shù)初值只需設(shè)置一次,以后就不再需要軟件重置。這是方式2與方式0、1的本質(zhì)區(qū)別。4定時器/計(jì)數(shù)器的工作方式3在前面的三種工作方式中,兩個定時器/計(jì)數(shù)器的設(shè)置和使用是完全相同的。但是在工作方式3下,兩個定時器/計(jì)數(shù)器的設(shè)置和使用卻不盡相同,下面分別介紹。(1)在工作方式3下的定時器/計(jì)數(shù)器0在工作方式3下,定時器/計(jì)數(shù)器0被拆成兩個獨(dú)立的8位計(jì)數(shù)器TL0和TH0。其中TL0既可以計(jì)數(shù)使用,又可以定時使用,定時器/計(jì)數(shù)器0的控制位和引腳信號全歸它使用。其功能和操作方式0或方式1完全相同。而且邏輯電路結(jié)構(gòu)也極其類似,如圖

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論