實驗報告:智能小車系統設計與實現
一、背景介紹
本實驗旨在設計并實現一個基于STC89C52單片機控制的智能小車系統。該系統通過超聲波傳感器進行避障,通過紅外接收器實現遠程控制,同時具備循跡功能。整個系統的核心是單片機,它通過對各種傳感器和執行器的控制,實現智能小車的多種功能。
二、硬件介紹
- STC89C52單片機:主控芯片,負責處理所有傳感器數據及控制信號。
- 紅外接收器:接收遙控器的信號,實現遠程控制。
- 超聲波傳感器:用于檢測前方障礙物的距離,進行避障處理。
- 電機及驅動模塊:控制小車的運動,包括前進、后退、左轉、右轉等。
- LCD1602顯示屏:用于顯示當前小車的狀態信息,如距離、按鍵值等。
- 蜂鳴器:提供聲音提示。
三、器件連接
- 紅外接收器連接到單片機的P3^3引腳。
- 超聲波傳感器的Trig和Echo分別連接到P10和P11引腳。
- 電機驅動連接到單片機的P30、P31、P32、P36、P34、P35引腳。
- LCD1602顯示屏連接到單片機的P0端口。
- 蜂鳴器連接到P2^4引腳。
四、設計原理
1. 紅外接收與解碼
紅外接收器接收遙控器發出的信號,通過外部中斷1(INT1)進行處理,記錄脈沖時間并存儲在IR_receive_data
數組中。定時器1以256us的周期記錄脈沖寬度,通過分析脈沖寬度確定接收的數據位值。解碼后,將按鍵值存儲在IR_receive_code
中。
2. 超聲波測距
超聲波傳感器通過發送Trig信號觸發測距,Echo信號返回高電平時間用于計算距離。距離計算公式為:
[ \text{距離} = \frac{\text{高電平時間} \times 1.7}{100} ]
3. 電機控制
電機通過H橋電路進行驅動,控制信號分別連接到P3端口,實現前進、后退、左轉、右轉及停止功能。
4. LCD1602顯示
LCD1602顯示屏用于顯示當前小車狀態信息,如距離、按鍵值等。通過LCD1602_init
初始化后,通過LCD1602_Print
函數進行顯示操作。
5. 蜂鳴器提示
蜂鳴器通過PWM控制發出聲音提示,主要用于操作確認。
五、電路原理
電路設計包括電源模塊、傳感器模塊、執行器模塊及顯示模塊。每個模塊與單片機連接,并通過單片機的I/O口進行數據采集與控制。
六、程序原理
程序包括初始化、主循環及各功能模塊的實現。
1. 初始化
包括定時器、外部中斷、LCD1602顯示屏及各傳感器的初始化。
void Init_Timer0() {TMOD &= 0xf0;TMOD |= 0x01; // 設T0為方式1TH0 = 0;TL0 = 0; // 定時器0初始化裝載0ET0 = 1; // 允許T0中斷EA = 1; // 開啟總中斷
}void IR_receive_init() {IR_receive_time = 0;IR_receive_flag = 0;IR_receive_bit = 0;IR_receive_OK = 0;IR_receive_end = 0;TMOD |= 0x20; // 設置定時器1為8位自動重裝計數TH1 = 0x00;TL1 = 0x00; // 設置定時時間為256usET1 = 1; // 定時器1中斷打開EA = 1; // 總中斷打開TR1 = 1; // 啟動定時器1
}
2. 主循環
主循環主要負責超聲波測距、紅外信號處理及執行相應的控制操作。
void main(void) {// 初始化LCD1602LCD1602_init();LCD1602_Print(0, 0, "KEY:");LCD1602_Print(0, 1, "Distance:");IR_receive_init(); // 紅外解碼設置程序int1init(); // 外部中斷設置Init_Timer0();while (1) {delay_ms(50);// 測量超聲波距離并顯示TR0 = 0;TH0 = 0;TL0 = 0;Trig = 1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();Trig = 0;while (!Echo);TR0 = 1;while (Echo);TR0 = 0;distance = Conut();// 顯示距離count = 0;disp[count++] = distance % 1000 / 100 + '0';disp[count++] = distance % 100 / 10 + '0';disp[count++] = distance % 10 / 1 + '0';disp[count++] = 'c'; disp[count++] = 'm';disp[count++] = 0;LCD1602_Print(9, 1, disp);// 按鍵處理if (IR_receive_OK) {IR_receive_OK = 0;IR_code(); // 紅外數據解碼if (IR_receive_end) {IR_receive_end = 0;IR_check(IR_receive_code[2]); // 紅外按鍵值處理程序if (KEY == 1) {AUTOMODE = !AUTOMODE; // 自動模式開關} else if (KEY == 2) {forward(); // 前進} else if (KEY == 5) {left(); // 左轉} else if (KEY == 6) {stop(); // 停止} else if (KEY == 7) {right(); // 右轉} else if (KEY == 10) {backward(); // 后退}beep(); // 蜂鳴器提示IR_receive_init(); // 重新初始化紅外接收int1init();}}// 自動模式下的避障與循跡if (AUTOMODE) {Avoid(); // 避障tracking(); // 循跡}}
}
七、實驗結果
通過上述設計與實現,小車能夠實現紅外遙控、超聲波避障及自動循跡功能。實驗過程中,通過LCD1602實時顯示距離及按鍵狀態,方便調試與觀察。
八、結論
本實驗成功實現了基于STC89C52單片機的智能小車系統,具備紅外遙控、超聲波避障及自動循跡等功能。通過合理的硬件連接與程序設計,小車能夠穩定運行,實現預期功能。進一步優化可以考慮提高傳感器精度及增加更多智能功能。
資料
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2