




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)一 單燈閃爍控制1、 實(shí)驗(yàn)?zāi)康?)熟悉C51系列單片機(jī)的引腳定義和分布; 2)掌握使用單片機(jī)端口控制LED閃爍的方法3)掌握時序圖的概念,while循環(huán)的引入和延時函數(shù)的使用; 2、 實(shí)驗(yàn)設(shè)備1)寶貝車 1臺2)C51系列單片機(jī) 1臺3)導(dǎo)線 若干4)LED燈 2個5)電阻 2個3、實(shí)驗(yàn)內(nèi)容 1)了解C51單片機(jī)的輸入/輸出接口的主要作用 輸入/輸出(I/O)接口是單片機(jī)和外部設(shè)備之間信息交換和控制的橋梁。它主要有以下幾個作用: 1.實(shí)現(xiàn)和不同外部設(shè)備的速度匹配 不同的外設(shè)工作速度差別很大,而且一般來講外設(shè)的響應(yīng)速度遠(yuǎn)遠(yuǎn)小于CPU的運(yùn)算速度。所以接口電路就必須適應(yīng)CPU和外設(shè)的速度上的這個
2、矛盾。 2.改變數(shù)據(jù)傳送的方式 I/O數(shù)據(jù)有并行和串行兩種方式。 3.按照需要為CPU提供更多資源,如RAM和ROM 4.改變信號的性質(zhì)和電平 CPU和外設(shè)之間的信號有幾類:數(shù)據(jù)型(程序代碼和計(jì)算結(jié)果等)、狀態(tài)型(反映外設(shè)的工作狀態(tài),如啟動、忙、空閑等)和控制型(控制外設(shè)的工作狀態(tài),如外設(shè)的開和關(guān)、電機(jī)的轉(zhuǎn)動和停止、速度的控制等)。2)C51單片機(jī)接口 51系列單片機(jī)有4個8位的并行I/O口:P0、P1、P2和P3。既可作為普通的I/O口、也可用作特殊功能。3) 單燈閃爍控制電路的搭建與實(shí)現(xiàn)4、實(shí)驗(yàn)步驟 單燈閃爍控制 LED電路搭建 確保LED的短針腳(陰極、負(fù)極)通過電阻與P1_0相連 確保
3、LED的長針腳(陽極、正極)插入“VCC”接口程序例程:HighLowLed.c 建立項(xiàng)目HighLowLed,輸入并保存以下程序,查看運(yùn)行結(jié)果。(過程參考第一章)#include<BoeBot.h>#include<uart.h>int main(void) uart_Init();/初始化串口 printf("The LED connected to P1_0 is blinking!n"); while(1) P1_0=1; / P1_0輸出高電平 delay_nms(500); /延時500ms P1_0=0; / P1_0輸出低電平 del
4、ay_nms(500); /延時500ms 單燈閃爍控制頭文件:BoeBot.h 該頭文件中定義了兩個延時函數(shù):(1)delay_nms(unsigned int n); 毫秒級延時 (2)delay_nus(unsigned int n); 微秒級延時 unsigned int:無符號整型單燈閃爍控制 while語句 while語句是一種循環(huán)控制語句。 在實(shí)際問題中,常常需要進(jìn)行大量的重復(fù)處理,循環(huán)結(jié)構(gòu)可以使我們只寫很少的語句,而讓計(jì)算機(jī)反復(fù)執(zhí)行,從而完成大量類同的計(jì)算。 while語句是當(dāng)型循環(huán)控制語句,一般形式為: While(表達(dá)式) 語句; 語句部分稱為循環(huán)體,當(dāng)需要執(zhí)行多條語句時,
5、應(yīng)使用復(fù)合語句(使用“”)。 while語句的特點(diǎn)是:先判斷表達(dá)式值,后執(zhí)行,若條件不成立,則跳出循環(huán),執(zhí)行下面語句。 其它循環(huán)控制語句 do.while語句 for語句單燈閃爍控制時序圖反應(yīng)高、低電壓信號與時間的關(guān)系圖 5、 思考題 1)舉例說明閃爍電路的實(shí)際應(yīng)用? 2)分析實(shí)驗(yàn)過程中LED燒毀的原因?實(shí)驗(yàn)二 機(jī)器人伺服電機(jī)控制1、實(shí)驗(yàn)?zāi)康?1)掌握機(jī)器人伺服電機(jī)的控制方法 2)能夠獨(dú)立完成伺服電機(jī)控制電路的搭建 3)掌握串口通信的使用方法2、 實(shí)驗(yàn)設(shè)備 1)寶貝車 1臺2)C51系列單片機(jī) 1臺3)導(dǎo)線 若干4)電機(jī) 2個5)電阻 2個3、實(shí)驗(yàn)內(nèi)容介紹 1)伺服電機(jī)的安裝伺服電機(jī)實(shí)物圖伺服
6、電機(jī)與教學(xué)底板的連線原理圖和實(shí)際接線示意圖2)機(jī)器人伺服電機(jī)控制信號零點(diǎn)標(biāo)定信號使電機(jī)停止轉(zhuǎn)動 while(1) P1_0=1; /P1_0輸出高電平 delay_nus(1500); /延時1.5ms P1_0=0; /P1_0輸出低電平 delay_nus(20000); /延時20ms 機(jī)器人伺服電機(jī)控制信號 測試伺服電機(jī) while(1) P1_0=1; delay_nus(1300); P1_0=0; delay_nus(20000); 1.3 ms的控制脈沖序列使電機(jī)順時針全速旋轉(zhuǎn) while(1) P1_0=1; delay_nus(1700); P1_0=0; delay_nu
7、s(20000); 1.7 ms的連續(xù)脈沖序列使電機(jī)逆時針全速旋轉(zhuǎn)實(shí)現(xiàn)計(jì)數(shù)并控制循環(huán)次數(shù) 4、基本語句的學(xué)習(xí) for循環(huán)控制語句 在實(shí)際的機(jī)器人控制過程中,經(jīng)常要求機(jī)器人運(yùn)動一段給定的距離或者一段固定的時間。 for語句是循環(huán)控制結(jié)構(gòu)中使用最廣泛的一種循環(huán)控制語句,特別適合已知循環(huán)次數(shù)的情況。它的一般形式為: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句計(jì)數(shù)并控制循環(huán)次數(shù) 表達(dá)式1:給控制變量賦初值; 表達(dá)式2:循環(huán)控制條件; 表達(dá)式3:給控制變量增量或減量; 語句:循環(huán)體,當(dāng)有多條語句時,必須使用復(fù)合語句(“ ”)。 for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句 語句執(zhí)行過程: 首先計(jì)算表達(dá)
8、式1,然后計(jì)算表達(dá)式2,若表達(dá)式2為真,則執(zhí)行循環(huán)體;否則,退出for循環(huán),執(zhí)行for循環(huán)后面的語句。 如果執(zhí)行了循環(huán)體,則循環(huán)體每執(zhí)行一次,都計(jì)算表達(dá)式3,然后重新計(jì)算表達(dá)式2,依此循環(huán),直至表達(dá)式2的值為假,退出循環(huán)。計(jì)數(shù)并控制循環(huán)次數(shù) 使用for循環(huán)語句,控制電機(jī)運(yùn)行: for(counter=1;counter<=130;i+) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); 自增和自減“+”和“-” 運(yùn)算符“+”是操作數(shù)加1,而“-”是操作數(shù)減1,即: “x=x+1
9、;”等同于“x+”; “x=x-1;”等同于“x-;”計(jì)數(shù)并控制循環(huán)次數(shù)電機(jī)運(yùn)行時間:for(counter=1;counter<=130;i+) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); 執(zhí)行一次循環(huán)體,電機(jī)運(yùn)行時間: 1.7ms(左電機(jī),與P1_1相連) +1.3ms(右電機(jī),與P1_0相連) +20ms(延時時間) =23ms 總共運(yùn)行時間:130 X 0.023s = 3s計(jì)數(shù)并控制循環(huán)次數(shù) 例程:BothServosThreeSeconds.c for(cou
10、nter=1;counter<=130;counter+) P1_1=1;delay_nus(1700);P1_1=0; P1_0=1;delay_nus(1300);P1_0=0; delay_nms(20); 用以下兩個for循環(huán)語句代替HighLowLed.c中的while循環(huán)語句。 for(counter=1;counter<=130;counter+) P1_1=1;delay_nus(1300);P1_1=0; P1_0=1;delay_nus(1700); P1_0=0; delay_nms(20); 執(zhí)行程序,觀察機(jī)器人是否向一個方向運(yùn)行3秒鐘后又反射運(yùn)行3秒鐘。用
11、計(jì)算機(jī)控制機(jī)器人運(yùn)動 在第一章中你已經(jīng)知道C51單片機(jī)可以通過串口向計(jì)算機(jī)調(diào)試終端發(fā)送信息,該任務(wù)將使用串口由你從計(jì)算機(jī)向單片機(jī)發(fā)送數(shù)據(jù)來控制機(jī)器人的運(yùn)動。 scanf函數(shù) scanf函數(shù)稱為格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。它的一般形式為: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用與printf函數(shù)相同,但不能顯示非格式字符串,也就是不能顯示提示字符串,即要求以%開關(guān)。 地址表列中給出各變量的地址。地址是由地址運(yùn)算符“&”后跟變量名組成的。如&PulseNumber表示變量PulseNumber的地址,這個地址
12、是編譯系統(tǒng)在內(nèi)存中給變量分配的地址,用戶不需要關(guān)心具體地址是多少。例如: scanf(“%d”,&PulseNumber);將把用戶輸入的整數(shù)賦給變量PulseNumber用計(jì)算機(jī)控制機(jī)器人運(yùn)動5、 思考問題 1)如何使用for循環(huán)語句控制機(jī)器人的運(yùn)動;2) 如何通過串口輸入數(shù)據(jù)控制機(jī)器人的運(yùn)動;實(shí)驗(yàn)三 機(jī)器人巡航控制1、實(shí)驗(yàn)?zāi)康?1)實(shí)現(xiàn)對單片機(jī)編程使機(jī)器人做一些基本的巡航動作:向前,向后,左轉(zhuǎn),右轉(zhuǎn)和原地旋轉(zhuǎn) 2)獨(dú)立編寫程序使機(jī)器人由突然啟動或停止變?yōu)橹鸩郊铀倩驕p速運(yùn)動 3)獨(dú)立編寫一些執(zhí)行基本巡航動作的函數(shù),每一個函數(shù)都能夠被多次調(diào)用 2、實(shí)驗(yàn)設(shè)備 1)寶貝車 1臺 2)C51
13、系列單片機(jī) 1臺 3)導(dǎo)線 若干 4)電機(jī) 2個3、實(shí)驗(yàn)內(nèi)容 1)機(jī)器人方向定義 機(jī)器人及其前進(jìn)方向的定義如果按照左圖前進(jìn)方向的定義,機(jī)器人向前走時:從機(jī)器人的左邊看,它向前走時輪子是逆時針旋轉(zhuǎn)的;從右邊看另一個輪子則是順時針旋轉(zhuǎn)的。4、 實(shí)驗(yàn)程序基本巡航動作機(jī)器人向前巡航:RobotForwardThreeSeconds.c 基本巡航動作 其它巡航動作 將delay_nus函數(shù)的參數(shù)n以不同的值組合就可以使機(jī)器人以其它的方式運(yùn)行 向后行走 P1_1=1; delay_nus(1300); P1_1=0;/左輪順時針 P1_0=1; delay_nus(1700); P1_0=0;/右輪逆時針
14、 delay_nms(20); 原地左轉(zhuǎn) P1_1=1; delay_nus(1300); P1_1=0;/左輪順時針 P1_0=1; delay_nus(1300); P1_0=0;/右輪順時針 delay_nms(20); 原地右轉(zhuǎn) P1_1=1; delay_nus(1700); P1_1=0;/左輪逆時針 P1_0=1; delay_nus(1700); P1_0=0;/右輪逆時針 delay_nms(20);基本巡航動作 其它巡航動作以某一輪子為支點(diǎn)旋轉(zhuǎn) 從前面向左旋轉(zhuǎn) P1_1=1; delay_nus(1500); P1_1=0;/左輪靜止 P1_0=1; delay_nus(1
15、300); P1_0=0;/右輪順時針 delay_nms(20); 從前面向右旋轉(zhuǎn) P1_1=1; delay_nus(1700); P1_1=0;/左輪逆時針 P1_0=1; delay_nus(1500); P1_0=0;/右輪靜止 delay_nms(20); 從后面向左旋轉(zhuǎn) P1_1=1; delay_nus(1500); P1_1=0;/左輪靜止 P1_0=1; delay_nus(1700); P1_0=0;/右輪逆時針 delay_nms(20); 從后面向右旋轉(zhuǎn) P1_1=1; delay_nus(1300); P1_1=0;/左輪順時針 P1_0=1; delay_nus(
16、1500); P1_0=0;/右輪靜止 delay_nms(20);勻加速/減速運(yùn)動 現(xiàn)象:機(jī)器人每次啟動和停止時,動作太快,幾乎傾倒。 原因:運(yùn)動學(xué)物體從零加速到最大運(yùn)動速度時,時間越短,所需加速度就越大;牛頓定律加速度越大,物體所愛的慣性力就越大。 解決方法:采用勻加速/減速運(yùn)動,讓機(jī)器人速度漸漸增加/減小。 作用:機(jī)器人運(yùn)動更平穩(wěn),電機(jī)使用壽命更長。 for (pulseCount=10;pulseCount<=200;pulseCount=pulseCount+10) P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; dela
17、y_nus(1500-pulseCount); P1_0=0; delay_nms(20); for (pulseCount=200;pulseCount>=0;pulseCount=pulseCount-10) P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); 用函數(shù)調(diào)用簡化運(yùn)動程序 機(jī)器人向前、向左、向右、向后運(yùn)動ForwardLeftRightBackward.c #include<BoeBot.h> #includ
18、e<uart.h> int main(void) int counter; printf("Program Running!n"); for(counter=1;counter<=65;counter+)/前進(jìn) P1_1=1;delay_nus(1700);P1_1=0; P1_0=1;delay_nus(1300);P1_0=0; delay_nms(20); for(counter=1;counter<=26;counter+)/左轉(zhuǎn) P1_1=1;delay_nus(1300);P1_1=0; P1_0=1;delay_nus(1300);P1
19、_0=0; delay_nms(20); for(counter=1;counter<=26;counter+)/右轉(zhuǎn) P1_1=1;delay_nus(1700);P1_1=0; P1_0=1;delay_nus(1700);P1_0=0; delay_nms(20); for(counter=1;counter<=65;counter+)/后退 P1_1=1;delay_nus(1300);P1_1=0; P1_0=1;delay_nus(1700);P1_0=0; delay_nms(20); 用函數(shù)調(diào)用簡化運(yùn)動程序 void Forward(void) int i; for
20、(i=1;i<=65;i+) P1_1=1;delay_nus(1700);P1_1=0; P1_0=1;delay_nus(1300);P1_0=0; delay_nms(20); 函數(shù)void Forward(void) void Forward(int PulseCount,int Velocity) /0<Velocity<=200 int i; for(i=1;i<=PulseCount;i+) P1_1=1;delay_nus(1500+Velocity);P1_1=0; P1_0=1;delay_nus(1500-Velocity);P1_0=0; del
21、ay_nms(20); 用函數(shù)調(diào)用簡化運(yùn)動程序 函數(shù)void Left(int PulseCount,int Velocity) void Left(int PulseCount,int Velocity) int i; for(i=1;i<= PulseCount;i+) P1_1=1;delay_nus(1500-Velocity);P1_1=0; P1_0=1;delay_nus(1500-Velocity);P1_0=0; delay_nms(20); 函數(shù)void Right(int PulseCount,int Velocity) void Right(int PulseCo
22、unt,int Velocity) int i; for(i=1;i<= PulseCount;i+) P1_1=1;delay_nus(1500+Velocity);P1_1=0; P1_0=1;delay_nus(1500+Velocity);P1_0=0; delay_nms(20); 用函數(shù)調(diào)用簡化運(yùn)動程序 函數(shù)void Backward(int PulseCount,int Velocity) void Backward(int PulseCount,int Velocity) int i; for(i=1;i<= PulseCount;i+) P1_1=1;delay_
23、nus(1500-Velocity);P1_1=0; P1_0=1;delay_nus(1500+Velocity);P1_0=0; delay_nms(20); 主函數(shù)int main(void) int main(void) uart_Init(); printf("Program Running!n"); Forward(65,200); Left(26,200); Right(26,200); Backward(65,200); 用函數(shù)調(diào)用簡化運(yùn)動程序 從函數(shù)定義角度: 標(biāo)準(zhǔn)函數(shù) 用戶自定義函數(shù) 從有無返回值角度: 有返回值函數(shù) 無返回值函數(shù) 從主調(diào)函數(shù)與被調(diào)函數(shù)數(shù)
24、據(jù)傳送角度: 無參函數(shù) 有參函數(shù) int main(void) void Forward(int PulseCount,int Velocity) printf(“”)用函數(shù)調(diào)用簡化運(yùn)動程序 只用一個函數(shù)簡化程序 由于機(jī)器人由兩個輪子驅(qū)動,實(shí)際上兩個輪子的不同速度組合控制著機(jī)器人的運(yùn)動速度和方向,因此可以直接用兩個車輪的速度作為參數(shù),就可以將所有的機(jī)器人運(yùn)動用一個函數(shù)來實(shí)現(xiàn)。 Forward(65,200); Left(26,200); Right(26,200); Backward(65,200); void Move(int counter,int PC1_pulseWide,int PC
25、0_pulseWide) int i; for(i=1;i<=counter;i+) P1_1=1;delay_nus(PC1_pulseWide);P1_1=0; P1_0=1;delay_nus(PC0_pulseWide);P1_0=0; delay_nms(20); 用函數(shù)調(diào)用簡化運(yùn)動程序 例程:MovementsWithOneFuntion.c #include< BoeBot.h> #include<uart.h> void Move(int counter,int PC1_pulseWide,int PC0_pulseWide) int i; for
26、(i=1;i<=counter;i+) P1_1=1;delay_nus(PC1_pulseWide);P1_1=0; P1_0=1;delay_nus(PC0_pulseWide);P1_0=0; delay_nms(20); int main(void) uart_Init(); printf("Program Running!n"); Move(65,1700,1300); Move(26,1300,1300); Move(26,1700,1700); Move(65,1300,1700); 5、 思考題 說明機(jī)器人在運(yùn)動過程中的自轉(zhuǎn)是如何實(shí)現(xiàn)的?實(shí)驗(yàn)四 機(jī)器人
27、IR LED/探測電路1、實(shí)驗(yàn)?zāi)康?1)掌握如何使用IR LED/探測電路檢測距離(定時/計(jì)數(shù)器的使用) 2)學(xué)習(xí)如何使用定時器2、實(shí)驗(yàn)設(shè)備 1)寶貝車 1臺 2)C51系列單片機(jī) 1臺 3)導(dǎo)線 若干 4)電機(jī) 2個 5)傳感器2對3、實(shí)驗(yàn)內(nèi)容 用IR LED/探測電路檢測距離用紅外傳感器探測道路探測靈敏度與頻率關(guān)系4、實(shí)驗(yàn)程序說明定時/計(jì)數(shù)器 以前所用延時方法: 1.for( )函數(shù) 2._nop_( )函數(shù) 更精確延時: 定時/計(jì)數(shù)器 AT89S52的定時/計(jì)數(shù)器可以分為定時器模式和計(jì)數(shù)器模式。 這兩種模式?jīng)]有本質(zhì)上的區(qū)別,均使用二進(jìn)制的加一計(jì)數(shù):當(dāng)計(jì)數(shù)器的值計(jì)滿回零時能自動產(chǎn)生中斷的請
28、求,以此來實(shí)現(xiàn)定時或者計(jì)數(shù)功能。 它們的不同之處在于定時器使用單片機(jī)的時鐘來計(jì)數(shù),而計(jì)數(shù)器使用的是外部信號。定時/計(jì)數(shù)器 定時/計(jì)數(shù)器的控制,兩個特殊功能寄存器TCON和TMODTCON控制寄存器定時器控制寄存器,可進(jìn)行位操作,低四位與定時器無關(guān)。定時/計(jì)數(shù)器TMOD模式寄存器定時器模式寄存器,不能進(jìn)行位操作,只能通過字節(jié)傳送指令來設(shè)定各個狀態(tài)。定時/計(jì)數(shù)器TMOD模式寄存器每個定時/計(jì)數(shù)器都有一個16位的寄存器Tn(n=0或1)來控制計(jì)數(shù)長度,由高8位THn和低8位TLn組成并用來設(shè)初值。 共四種定時模式。定時/計(jì)數(shù)器 13位定時器模式(模式0) 定時器高字節(jié)(THx)與低字節(jié)(TLx)的低
29、5位共同構(gòu)成1個13位定時器。低字節(jié)高3位未使用。計(jì)數(shù)值隨時鐘脈沖增加,當(dāng)計(jì)數(shù)值從FFH溢出回到00H時,TFx被置1。16位定時器模式(模式1) 除工作在16位以外,與模式0沒有什么不同。定時/計(jì)數(shù)器8位自動重載模式(模式2) 低字節(jié)(TLx)作為1個8位定時器工作,高字節(jié)用于保存重載數(shù)。 當(dāng)計(jì)數(shù)值超過FFH回零時,不僅TFx被置1,同時THx載入TLx,定時器重新開始工作,如此循環(huán)。定時/計(jì)數(shù)器分立定時器模式(模式3)定時器1在該模式下不工作。定時/計(jì)數(shù)器定時器初值計(jì)算定時/計(jì)數(shù)值是在設(shè)置初值的基本上加法計(jì)數(shù)。設(shè)程序要運(yùn)行的數(shù)值為CC,初值為TC,計(jì)數(shù)最大值為2n,則:TC=2n-CC例如
30、:定時1ms要運(yùn)行的數(shù)值CC=1ms/1us=1000,在模式0下最大計(jì)數(shù)值2n=213=8192 則定時器初值TC=2n-CC=7192=0x1C18,即THx=0x1C,TLx=0x18定時/計(jì)數(shù)器 例程:TimeApplication.c #include <AT89X52.H> #include <stdio.h> void initial(void); /子函數(shù)聲明 void main(void) initial(); /調(diào)用定時/計(jì)數(shù)器初始化函數(shù) while(1); /等待中斷 /*=初始化定時/計(jì)數(shù)器函數(shù)=*/ void initial(void) IE=
31、0x82; /開總中斷EA,允許定時器0中斷ET0 TCON=0x00; /停止定時器,清除標(biāo)志 TMOD=0x02; /工作在定時器0的模式2中 TH0=0x38; /設(shè)置重載值 TL0=0x38; /設(shè)置定時器初值 TR0=1; /啟動定時器0 /中斷服務(wù)程序 void TIMER(void) interrupt 1 /中斷服務(wù)程序,1是定時器0的中斷號 P1_0=P1_0; /P1_0的值取反 定時/計(jì)數(shù)器 #include <AT89X52.H> #include <stdio.h> AT89X52.H對一些標(biāo)識符進(jìn)行了聲明,如P1_0、IE、TCON等 std
32、io.h對常用的一些IO函數(shù)進(jìn)行了聲明,如printf()等 頭文件uart.h 已包含了這些頭文件。 void initial(void); /子函數(shù)聲明 void main(void) initial(); /調(diào)用定時/計(jì)數(shù)器初始化函數(shù) while(1); /等待中斷 函數(shù)定義若在main之后,則在main之前應(yīng)加上該函數(shù)的聲明。定時/計(jì)數(shù)器 /*=初始化定時/計(jì)數(shù)器函數(shù)=*/ void initial(void) IE=0x82; TCON=0x00; TMOD=0x02; TH0=0x38; TL0=0x38; TR0=1; “/*”和“*/”必須成對使用,注釋在它們之間的內(nèi)容。 “/
33、”僅僅對它所在的一行起注釋作用。 TCON=0x00; 停止定時器,并清除了中斷標(biāo)志 TMOD=0x02; M1=0且M0=0,定時器0選擇模式2 TH0=0x38; TL0=0x38; 設(shè)置計(jì)數(shù)初值和重載值。 TR0=1; 啟動定時器0。定時/計(jì)數(shù)器 中斷 中斷即發(fā)生了某種情況(事件),使得CPU暫時中止當(dāng)前程序的執(zhí)行,轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序。 中斷驅(qū)使系統(tǒng)能夠在同一時間處理許多任務(wù)。中斷與子程序有些相似:CPU執(zhí)行另一個程序子程序然后返回主程序。 單片機(jī)AT89S52有5個中斷源:2個外部中斷源;2個定時器中斷;1個串口中斷。 每個中斷源可以單獨(dú)允許或禁止,通過修改可位尋址的專用寄存器IE
34、(允許中斷寄存器)實(shí)現(xiàn)定時/計(jì)數(shù)器IE(中斷使用)寄存器簡表IE=0x82; EA=1且ET0=1,打開了全局和定時器0的中斷 定時/計(jì)數(shù)器 中斷優(yōu)先級 AT89S52的中斷分為2級,高和低。 允許擁有高優(yōu)先級的中斷源中斷系統(tǒng)正在處理的低優(yōu)先級的中斷源。 中斷的優(yōu)先級由高到低依次為:外部中斷0,定時器0,外部中斷1,定時器1,串口中斷,定時器2中斷。定時/計(jì)數(shù)器 中斷函數(shù) 中斷函數(shù)是通過按規(guī)定語法格式定義的一個函數(shù),語法格式如下: 返回值 函數(shù)名(參數(shù))interrupt musing n m:中斷號。定時器0的中中斷號為1; n:寄存器組。在多中斷的情況下,使用該參數(shù)進(jìn)行任務(wù)切換。不用該參數(shù)
35、,則默認(rèn)使用寄存器組0,即n=0。 void TIMER(void) interrupt 1 P1_0=P1_0; /P1_0的值取反 測試掃描頻率探測靈敏度與頻率關(guān)系圖38500Hz靈敏度最高,越往兩邊,靈敏度越差頻率越低,探測距離越遠(yuǎn)測試掃描頻率例程:TestLeftFrequencySweep.c 5、 思考題 如何實(shí)現(xiàn)小車的跟蹤行駛?實(shí)驗(yàn)五、1、 實(shí)驗(yàn)?zāi)康?1.熟悉LCD顯示器的使用方法 2.獨(dú)立完成對LCD顯示器的控制2、實(shí)驗(yàn)內(nèi)容 1.LCD顯示器 2.編寫LCD模塊驅(qū)動程序 3.用LCD顯示機(jī)器人運(yùn)動狀態(tài) 3、 實(shí)驗(yàn)設(shè)備 1.認(rèn)識LCD顯示器 LCD(Liquid Crystal
36、Display)的應(yīng)用很廣泛:手表上的液晶顯示屏、電腦液晶顯示器、傳真機(jī)、復(fù)印件、娛樂器材玩具等。認(rèn)識LCD顯示器 字符型液晶顯示模塊(Liquid Crystal Display Module,LCM)是一種專門用于顯示字母、數(shù)字、符號等點(diǎn)陣式液晶顯示模塊。 每一個顯示的字符(或字母、數(shù)字等)是由5*7或5*11點(diǎn)陣組成。點(diǎn)陣字符位之間有一空點(diǎn)距的間隔起到了字符間距和行距的作用。 教材所使用的LCD顯示器(1602)可顯示兩行,每行由16個點(diǎn)陣字符組成,能顯示所有ASCII字符。LCD引腳4、實(shí)驗(yàn)電路編號符號說明1GND電源地2Vcc電源正極3Vo對比度調(diào)節(jié)(接地,對比度最高)4RS數(shù)據(jù)/命
37、令選擇5R/W讀寫選擇6E模塊使能端714D0D7雙向數(shù)據(jù)口15BLA背光源正極16BLK背光源地寫指令時,使RS為低電平;寫數(shù)據(jù)時,使RS為高電平R/W為高電平時,讀數(shù)據(jù);R/W為低電平時,寫數(shù)據(jù)寫數(shù)據(jù)時,E下降沿觸發(fā)模塊LCD指令說明顯示模式設(shè)置指令碼功能0x3800111000設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 0x2800101000設(shè)置16*2顯示,5*7點(diǎn)陣,4位數(shù)據(jù)接口 LCD指令說明顯示開/關(guān)及光標(biāo)設(shè)置如: 0x08:顯示關(guān)閉(D=0,C=0,B=0) 0x01:清屏 0x06:當(dāng)讀或?qū)懸粋€字符后地址指針加一,且光標(biāo)加一;屏幕不移動(N=0,S=0) 0x0c:開顯示,
38、不顯示光標(biāo)(D=1,C=0,B=0)LCD忙信號檢測讀LCD狀態(tài)時序: 輸入:RS=L,RW=H,E=H 輸出:DB0DB7=狀態(tài)字#define LCM_Data P0 /P0高四位與LCD相連#define Busy 0x80 /最高位用于檢測LCM狀態(tài)字中的Busy標(biāo)識,1禁止;0允許read(LCM_Data)0/1xxxxxxxBusy10000000&0/10000000void Read_Status_LCM(void) unsigned char read=0; LCM_RW = 1; LCM_RS = 0; LCM_E = 1; LCM_Data = 0xff; do
39、 read = LCM_Data; while(read & Busy); LCM_E = 0; /寫數(shù)據(jù)使能 LCD寫指令LCD寫指令時序: 輸入:RS=L,RW=L,E=下降沿脈沖,DB0DB7=指令碼 LCM_Data xxxxxxxx&0x0f00001111LCM_Data 0000xxxxWCLCMabcdefgh&0xf011110000LCM_Data |=abcd0000WCLCMabcdefgh<< 4efgh0000void Write_Command_LCM(unsigned char WCLCM,BuysC) /BuysC為0時忽略
40、忙檢測 if (BuysC) Read_Status_LCM(); /根據(jù)需要檢測忙 LCM_RS = 0; LCM_RW = 0; LCM_Data &= 0x0f; /清除高四位 LCM_Data |= WCLCM & 0xf0;/傳輸高四位 LCM_E = 1; LCM_E = 1; /延時 LCM_E = 0; WCLCM = WCLCM<<4; /傳輸?shù)退奈? LCM_Data &= 0x0f; LCM_Data |= WCLCM & 0xf0; LCM_E = 1; LCM_E = 1; LCM_E = 0; WCLCMefgh0000&
41、amp;0xf011110000LCM_Data |=efgh0000LCD寫數(shù)據(jù)LCD寫數(shù)據(jù)時序: 輸入:RS=H,RW=L,E=下降沿脈沖,DB0DB7=數(shù)據(jù) LCD初始化 初始化時序: 延時15msdelay_nms(15); 寫指令38H(不檢測忙信號)Write_Command_LCM(0x28,0); (或28H,表示4位數(shù)據(jù)接口,下同) 延時15msdelay_nms(15); 寫指令38H(不檢測忙信號)Write_Command_LCM(0x28,0); 延時15msdelay_nms(15); 寫指令38H(不檢測忙信號)Write_Command_LCM(0x28,0);
42、 (以后每次寫指令、讀/寫數(shù)據(jù)操作之前都均需檢測忙信號) 寫指令38H:顯示模式設(shè)置Write_Command_LCM(0x28,1); 寫指令08H:顯示關(guān)閉Write_Command_LCM(0x08,1); 寫指令01H:顯示清屏Write_Command_LCM(0x01,1); 寫指令06H:顯示光標(biāo)移動設(shè)置Write_Command_LCM(0x06,1); 寫指令0cH:顯示開及光標(biāo)設(shè)置Write_Command_LCM(0x0C,1); 設(shè)置光標(biāo)位置LCD內(nèi)部RAM地址映射圖 數(shù)據(jù)地址設(shè)置指令碼: 80H+地址碼(027H,4067)第一行(x=0):0x80+y第二行(x=1
43、):0x80+0x40+y=0xc0+yvoid Set_xy_LCM(unsigned char x, unsigned char y) unsigned char address; if( x = 0 ) address = 0x80+y; else address = 0xc0+y; Write_Command_LCM(address,1); 顯示字符串void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s) Set_xy_LCM(x,y); while(*s) LCM_Data = *s; Wr
44、ite_Data_LCM(*s); s+; Display_List_Char(0, 0, "");Display_List_Char(1, 0, "Robot-AT89S52"); 指針 在編程中定義的變量,系統(tǒng)為其分配相應(yīng)的內(nèi)存單元,有固定的地址。 指針表示變量的地址。 指針變量存放地址(即指針)的變量。 指針變量的定義: 類型說明符 *變量名; int *p1; /p1指向一個整型變量,p1可以存放整型變量的地址,值隨機(jī) char *p2; /p2指向一個字符型變量 定義了指針變量,才可以寫入對應(yīng)數(shù)據(jù)類型的變量的地址: int m=5; char c=t; p
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)莊基地出租合同范本
- 買賣物業(yè)用房合同范本
- 醫(yī)療行業(yè)會議服務(wù)合同范例
- 廚房滅火維保合同范本
- 合資購車經(jīng)營合同范本
- 吊車合伙經(jīng)營合同范本
- 含稅購貨合同范本
- 運(yùn)動俱樂部協(xié)議合同范本
- 蔬菜配送合同范本
- 入股餐廳合同范本
- 《抖音營銷教程》課件
- 2025屆山東核電校園招聘正式啟動筆試參考題庫附帶答案詳解
- 2025安徽蕪湖市運(yùn)達(dá)軌道交通建設(shè)運(yùn)營限公司招聘129人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年湖南科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025屆江蘇省無錫市江陰實(shí)驗(yàn)中學(xué)中考聯(lián)考?xì)v史試題含解析
- 2024年安徽省高校分類考試對口招生語文試卷真題(含答案)
- 2025年蘇州健雄職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 公路工程標(biāo)準(zhǔn)施工招標(biāo)文件(2018年版)
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蝕工程施工及驗(yàn)收規(guī)范
- (高清版)JTG 3370.1-2018 公路隧道設(shè)計(jì)規(guī)范 第一冊 土建工程
評論
0/150
提交評論