php做網站用html做嗎百度網站名稱
作者:Whappy
時間:2024.9.20
總結一下!基礎實驗到這兒里就圓滿結束,歷經25天,將51單片機學完并親自手敲代碼近5000行,在手敲代碼過程中,明顯感覺的看和敲,明顯就是不同的感覺,創(chuàng)作不易,在原有的代碼上加上自己的想法并加以實現(xiàn)!接下向STM32發(fā)起進攻,開始學習!
介紹:
硬件電路
針對于上圖兩個PNP的三極管主要用來調制的,是因為自然界中有很多紅外光,我們想要得到我們需要的的紅外光,就要進行調制,通過一個38hz的頻率進行調制,因為自然界的紅外光不可能以38hz的頻率跳動,后期通過濾波器將我們需要的波形提取來就可以了!
? ? ? ? 還有紅外接收頭,OUT引腳接收的脈沖特別快,需要我們及時處理,所以,我們采取51單片機的外部中斷來對這個脈沖進行處理!
發(fā)送和接收裝置
通過上述解釋:這個高電平和低電平不是我們平常說的一個周期內的高電平,而是一個周期中高低低電平所持續(xù)的時間,同樣,低電平也是,看上圖!
NEC編碼
示波器采集的按鍵波形變化,還是地址碼+地址反碼+命令字+命令字反碼
實物外觀
可以看出要控制器所對應的鍵碼值!
51單片機的外部中斷
這個外部中斷,也是我們常用的一種處理手段,外部中斷也比較簡單,只需要打開相關寄存器,配置一下外部中斷服務函數(shù)即可!如下代碼
void INT0_Init(void) //打開外部中斷相關的的寄存器(寄存器可單獨配置)
{IT0 = 1; //配置位低電平觸發(fā)模式IE0 = 0; //中斷標志位EX0 = 1; //外部中斷0使能EA = 1; //中斷總使能PX0 = 1; //中斷最高優(yōu)先級
}/*
//外部中斷0 服務函數(shù)
void Int0_Routine() interrupt 0
{Number++;
}
*///注:配置完成之后就可以在主函數(shù)中初始化了,在主函數(shù)下面加上我們的中斷服務函數(shù),即可觸發(fā)中斷
實驗一:紅外遙控實驗(其余代碼參考往期實驗)
這個程序是使用紅外遙控器控制數(shù)值的顯示,并在LCD1602上輸出。主要功能是通過紅外接收數(shù)據(jù),顯示遙控器的地址碼、命令碼,并且根據(jù)接收到的命令對變量 Num
進行增減。
主要流程:
-
LCD 初始化:
LCD_Init()
初始化 LCD1602 顯示屏。- 在第一行顯示 "ADDR CMD NUM" 作為標題。
- 在第二行初始化顯示地址碼、命令碼和變量
Num
的值。
-
紅外接收初始化:
IR_Init()
初始化紅外接收功能,準備接收遙控器信號。
-
循環(huán)處理紅外信號:
IR_GetDataFlag()
和IR_GetRepeatFlag()
判斷是否接收到數(shù)據(jù)幀或連發(fā)幀。- 如果接收到信號:
- 調用
IR_GetAddress()
獲取遙控器地址碼并顯示在LCD上。 - 調用
IR_GetCommand()
獲取遙控器命令碼并顯示在LCD上。
- 調用
-
處理命令:
- 如果接收到的命令碼是
IR_VOL_MINUS
(對應遙控器的音量減鍵),變量Num
自減。 - 如果接收到的命令碼是
IR_VOL_ADD
(對應遙控器的音量加鍵),變量Num
自增。
- 如果接收到的命令碼是
-
顯示數(shù)值:
- 更新LCD,顯示變量
Num
的值。
- 更新LCD,顯示變量
通過遙控器上的音量加減鍵,用戶可以控制數(shù)值 Num
的增減,并實時在LCD上看到變化。
main.c
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"unsigned char Num;
unsigned char Address;
unsigned char Command;void main()
{LCD_Init();LCD_ShowString(1,1,"ADDR CMD NUM");LCD_ShowString(2,1,"00 00 000");IR_Init();while(1){if(IR_GetDataFlag() || IR_GetRepeatFlag()) //如果收到數(shù)據(jù)幀或者收到連發(fā)幀{Address=IR_GetAddress(); //獲取遙控器地址碼Command=IR_GetCommand(); //獲取遙控器命令碼LCD_ShowHexNum(2,1,Address,2); //顯示遙控器地址碼LCD_ShowHexNum(2,7,Command,2); //顯示遙控器命令碼if(Command==IR_VOL_MINUS) //如果遙控器VOL-按鍵按下{Num--; //Num自減}if(Command==IR_VOL_ADD) //如果遙控器VOL+按鍵按下{Num++; //Num自增}LCD_ShowNum(2,12,Num,3); //顯示Num}}
}
Timer0.c
#include <REGX52.H>// 定時器0初始化函數(shù),設置定時器0為模式1(16位定時器模式),每1毫秒計時一次,工作在11.0592MHz晶振下
void Timer0_Init()
{TMOD &= 0xF0; // 清除定時器0的模式位(低4位),保留高4位(定時器1的設置)TMOD |= 0x01; // 設置定時器0為模式1(16位定時器)TL0 = 0; // 設置定時器0低8位初值為0TH0 = 0; // 設置定時器0高8位初值為0TF0 = 0; // 清除定時器0的溢出標志位(TF0)TR0 = 0; // 關閉定時器0的計時
}// 設置定時器0計數(shù)器值
void Timer0_SetCounter(unsigned int Value)
{TH0 = Value / 256; // 將高8位寫入TH0寄存器TL0 = Value % 256; // 將低8位寫入TL0寄存器
}// 獲取定時器0當前的計數(shù)值
unsigned int Timer0_GetCounter(void)
{return (TH0 << 8) | TL0; // 將TH0和TL0的值組合成16位數(shù)并返回
}// 啟動或停止定時器0的計時功能
// 參數(shù):Flag為1時啟動定時器,Flag為0時停止定時器
void Timer0_Run(unsigned char Flag)
{TR0 = Flag; // 根據(jù)Flag設置TR0位,1表示啟動定時器0,0表示停止定時器0
}
注釋說明:
- Timer0_Init():初始化定時器0為模式1(16位定時器模式),并設置初值。此模式下,定時器從
TH0|TL0
組合的16位計數(shù)器開始計數(shù),直到溢出。 - Timer0_SetCounter():根據(jù)傳入的
Value
值,設置定時器的當前計數(shù)值。 - Timer0_GetCounter():獲取當前定時器的計數(shù)值(16位數(shù)),將高8位和低8位組合返回。
- Timer0_Run():啟動或停止定時器的計時功能,通過
Flag
參數(shù)來控制。
INT0.c
#include <REGX52.H>// 外部中斷0初始化函數(shù)
void INT0_Init(void)
{IT0 = 1; // 設置外部中斷0為下降沿觸發(fā)模式(1為下降沿觸發(fā),0為低電平觸發(fā))IE0 = 0; // 清除外部中斷0的中斷標志位EX0 = 1; // 使能外部中斷0EA = 1; // 全局中斷使能PX0 = 1; // 設置外部中斷0為高優(yōu)先級(1為高優(yōu)先級,0為低優(yōu)先級)
}/*
// 外部中斷0的中斷服務函數(shù)
void Int0_Routine() interrupt 0
{Number++; // 每次觸發(fā)外部中斷0時,將變量 Number 自增
}
- INT0_Init():初始化外部中斷0,將其配置為下降沿觸發(fā),并使能相關中斷。通過設置中斷優(yōu)先級位來設置其為高優(yōu)先級中斷。
IT0 = 1
:配置外部中斷0為下降沿觸發(fā)。IE0 = 0
:清除中斷標志位,確保沒有待處理的中斷。EX0 = 1
:使能外部中斷0。EA = 1
:開啟全局中斷,使單片機響應中斷。PX0 = 1
:設置外部中斷0為高優(yōu)先級。
- Int0_Routine():這是外部中斷0的中斷服務函數(shù),執(zhí)行中斷時該函數(shù)會被調用。在該例子中,每次外部中斷觸發(fā)時,變量
Number
會自增。
注:中斷服務函數(shù) Int0_Routine()
被注釋掉,可以根據(jù)需要進行啟用。
IR.c? (核心代碼:主要處理紅外遙控接收和發(fā)送數(shù)據(jù))
#include <REGX52.H>
#include "Timer0.h"
#include "INT0.h"unsigned int IR_Time; // 用于記錄紅外信號的時間間隔
unsigned char IR_State; // 用于記錄紅外接收狀態(tài)機的狀態(tài)
unsigned char IR_Data[4]; // 用于存儲接收到的紅外數(shù)據(jù)信息
unsigned char IR_pData; // 用于記錄當前接收數(shù)據(jù)的位索引unsigned char IR_DataFlag; // 用于標記是否接收到數(shù)據(jù)幀
unsigned char IR_RepeatFlag; // 用于標記是否接收到連發(fā)信號
unsigned char IR_Address; // 存儲接收到的紅外遙控器地址
unsigned char IR_Command; // 存儲接收到的紅外遙控器命令// 紅外遙控初始化函數(shù)
void IR_Init(void)
{INT0_Init(); // 初始化外部中斷0,用于捕獲紅外接收信號的下降沿Timer0_Init(); // 初始化定時器0,用于計時
}// 獲取數(shù)據(jù)幀標志位的函數(shù)
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag) // 如果收到數(shù)據(jù)幀標志置位{IR_DataFlag = 0; // 清除數(shù)據(jù)幀標志return 1; // 返回1表示已接收到數(shù)據(jù)幀}return 0; // 否則返回0
}// 獲取連發(fā)信號標志位的函數(shù)
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag) // 如果收到連發(fā)信號標志置位{IR_RepeatFlag = 0; // 清除連發(fā)信號標志return 1; // 返回1表示已接收到連發(fā)信號}return 0; // 否則返回0
}// 獲取接收到的紅外遙控地址
unsigned char IR_GetAddress(void)
{return IR_Address;
}// 獲取接收到的紅外遙控命令
unsigned char IR_GetCommand(void)
{return IR_Command;
}// 外部中斷0服務函數(shù),處理紅外接收的信號
void Int0_Routine() interrupt 0
{// 狀態(tài)0:空閑狀態(tài),檢測到信號開始,重置計時器if(IR_State == 0) {Timer0_SetCounter(0); // 將定時器計數(shù)器清零Timer0_Run(1); // 啟動定時器IR_State = 1; // 設置狀態(tài)為1,等待信號}// 狀態(tài)1:等待Start信號或Repeat信號else if(IR_State == 1) {IR_Time = Timer0_GetCounter(); // 獲取上次中斷到此次中斷的時間Timer0_SetCounter(0); // 計時器清零準備下一次測量// 檢測到Start信號if(IR_Time > (12442-500) && IR_Time < (12442+500)){IR_State = 2; // 轉換到狀態(tài)2,準備接收數(shù)據(jù)}// 檢測到Repeat信號else if(IR_Time > (10368-500) && IR_Time < (10368+500)){IR_RepeatFlag = 1; // 置連發(fā)信號標志Timer0_Run(0); // 停止定時器IR_State = 0; // 返回空閑狀態(tài)}else{IR_State = 1; // 未收到有效信號,保持狀態(tài)1}}// 狀態(tài)2:接收數(shù)據(jù)else if(IR_State == 2) {IR_Time = Timer0_GetCounter(); // 獲取時間間隔Timer0_SetCounter(0); // 計時器清零// 判斷是邏輯0還是邏輯1if(IR_Time > (1032-500) && IR_Time < (1032+500)){IR_Data[IR_pData/8] &= ~(0x01 << (IR_pData % 8)); // 寫入邏輯0IR_pData++; // 數(shù)據(jù)位索引加1}else if(IR_Time > (2074-500) && IR_Time < (2074+500)){IR_Data[IR_pData/8] |= (0x01 << (IR_pData % 8)); // 寫入邏輯1IR_pData++; // 數(shù)據(jù)位索引加1}else{IR_pData = 0; // 出現(xiàn)錯誤,數(shù)據(jù)位清零,返回狀態(tài)1IR_State = 1;}// 如果接收到完整的32位數(shù)據(jù)if(IR_pData >= 32){IR_pData = 0;// 檢查數(shù)據(jù)的有效性if((IR_Data[0] == ~IR_Data[1]) && (IR_Data[2] == ~IR_Data[3])){IR_Address = IR_Data[0]; // 提取地址碼IR_Command = IR_Data[2]; // 提取命令碼IR_DataFlag = 1; // 置數(shù)據(jù)幀標志位}Timer0_Run(0); // 停止定時器IR_State = 0; // 返回空閑狀態(tài)}}
}
代碼思路
-
初始化部分:
-
調用
IR_Init()
函數(shù)來初始化外部中斷0和定時器0,確保紅外接收能夠計時和響應信號的變化。
-
-
狀態(tài)機控制:
-
通過
IR_State
進行狀態(tài)管理。程序根據(jù)中斷觸發(fā)的時間判斷信號類型(啟動信號、連發(fā)信號或數(shù)據(jù))。 -
根據(jù)不同狀態(tài),程序分別執(zhí)行啟動計時、判斷信號類型、接收并解碼紅外數(shù)據(jù)的操作。
-
-
數(shù)據(jù)接收和處理:
-
紅外信號的編碼通過時間間隔來區(qū)分邏輯0和邏輯1。程序根據(jù)紅外信號的時間長短判斷數(shù)據(jù)位,最終解碼成地址和命令。
-
采用位操作將紅外信號按位存入
IR_Data
數(shù)組,并在接收到完整32位數(shù)據(jù)后校驗數(shù)據(jù)的有效性(利用地址和命令碼的互補關系)。
-
-
標志位與狀態(tài)管理:
-
使用
IR_DataFlag
和IR_RepeatFlag
來標記是否接收到完整數(shù)據(jù)幀或連發(fā)信號。 -
外部模塊可以通過
IR_GetDataFlag()
等函數(shù)獲取這些標志位,并作出相應的處理。
-
函數(shù)調用關系
-
IR_Init()
初始化中斷和定時器。 -
Int0_Routine()
是外部中斷服務函數(shù),負責處理紅外信號,狀態(tài)機在這個函數(shù)中運行。 -
IR_GetDataFlag()
和IR_GetRepeatFlag()
函數(shù)提供了對外的接口,用于其他模塊判斷紅外遙控信號狀態(tài)。 -
IR_GetAddress()
和IR_GetCommand()
函數(shù)用于獲取解碼后的紅外遙控地址和命令。
目的和好處
-
狀態(tài)機的設計:通過
IR_State
實現(xiàn)多階段處理紅外信號(如空閑、判斷信號、數(shù)據(jù)接收),結構清晰,便于調試與擴展。 -
標志位管理:通過
IR_DataFlag
和IR_RepeatFlag
等標志位,模塊化地提供狀態(tài)信息,便于其他模塊獲取數(shù)據(jù)而不直接干擾中斷邏輯。 -
位操作與定時器結合:通過定時器捕獲時間差,結合位操作解碼數(shù)據(jù),使得紅外信號的處理精確而高效。
思想方法
-
模塊化設計:將不同功能(如定時器、外部中斷、信號解碼)分離為不同的函數(shù),方便維護和擴展。
-
狀態(tài)機模型:通過有限狀態(tài)機的方式處理信號,能夠清晰管理不同階段的任務,避免邏輯混亂。
-
時間敏感的處理:通過定時器精確測量時間,結合中斷機制,高效地接收和處理紅外信號。
實驗二:紅外遙控控制電機調速實驗(其余代碼往期實驗)
目的是通過紅外遙控器來控制電機的轉速,并通過數(shù)碼管顯示當前速度值。具體功能如下:
-
紅外遙控輸入:
-
程序接收紅外遙控器的命令碼,根據(jù)不同的按鍵(如
IR_0
,IR_1
,IR_2
,IR_3
)來設置不同的電機速度。
-
-
電機速度控制:
-
程序根據(jù)遙控器的命令,通過
Motor_SetSpeed()
函數(shù)來調整電機的實際轉速。設定的速度分為4個級別:停止、50%、75%、100%。
-
-
數(shù)碼管顯示:
-
使用數(shù)碼管
Nixie()
來顯示當前的速度狀態(tài),將當前的速度級別(0、1、2、3)顯示在數(shù)碼管上。
-
總體思想
-
模塊化設計:
-
程序分為幾個獨立模塊,如
Motor_Init()
初始化電機,IR_Init()
初始化紅外接收,Motor_SetSpeed()
設置電機轉速,Nixie()
用于顯示當前速度值。這樣的設計便于調試和擴展。
-
-
紅外控制:
-
利用紅外接收模塊,通過接收遙控器發(fā)送的命令碼,改變電機的速度。程序通過不斷檢查是否有數(shù)據(jù)幀到來,一旦收到有效數(shù)據(jù),就解析命令碼并做出響應。
-
-
狀態(tài)機思想:
-
代碼使用簡單的狀態(tài)判斷(速度級別為0到3),根據(jù)不同的命令調整電機的運行狀態(tài),并通過顯示屏實時反饋當前狀態(tài)。這種邏輯使得代碼結構清晰,處理不同輸入時能夠快速響應。
-
-
解耦合和靈活性:
-
將電機控制和遙控器輸入解耦合,遙控器只需發(fā)出簡單的命令,電機部分負責實現(xiàn)速度控制。通過簡單擴展,系統(tǒng)可以支持更多的命令和功能,例如控制電機的方向或其他附加功能。
-
這樣做的好處
-
可擴展性:功能可以方便地擴展,比如增加更多速度級別或其他控制命令,代碼結構簡單易懂,模塊化設計便于維護。
-
用戶友好:通過遙控器方便地控制電機運行,數(shù)碼管實時顯示當前狀態(tài),用戶能直觀地知道電機運行情況。
-
高效運行:通過紅外信號觸發(fā)的狀態(tài)機結構,使得程序在低資源消耗下響應快速。
main.c
void main()
{Motor_Init(); // 電機初始化IR_Init(); // 紅外遙控初始化while(1) // 主循環(huán){if(IR_GetDataFlag()) // 如果接收到紅外遙控的有效數(shù)據(jù)幀{Command = IR_GetCommand(); // 獲取遙控器發(fā)來的命令碼// 根據(jù)不同的遙控命令碼設置速度值if(Command == IR_0) { Speed = 0; } // 命令碼為 0,速度設為 0if(Command == IR_1) { Speed = 1; } // 命令碼為 1,速度設為 1if(Command == IR_2) { Speed = 2; } // 命令碼為 2,速度設為 2if(Command == IR_3) { Speed = 3; } // 命令碼為 3,速度設為 3// 根據(jù)速度值調整電機的實際轉速if(Speed == 0) { Motor_SetSpeed(0); } // 速度0,電機停止if(Speed == 1) { Motor_SetSpeed(50); } // 速度1,電機以50%的功率運行if(Speed == 2) { Motor_SetSpeed(75); } // 速度2,電機以75%的功率運行if(Speed == 3) { Motor_SetSpeed(100); } // 速度3,電機以100%的功率運行}Nixie(1, Speed); // 數(shù)碼管顯示當前速度值}
}
IR.c(同上)
INT0.c(同上)
Timer0.c(同上)
Timer1.c
#include <REGX52.H>// 定時器1初始化函數(shù),用于配置定時器1,產生一個100微秒的定時中斷。
/**
* @brief 定時器初始化(51單片機軟件內置配置的定時器)
* @param 無
* @retval 無
*/
void Timer1_Init() //100微秒@11.0592MHz
{TMOD &= 0x0F; // 清除定時器1的模式位,保持定時器0的模式不變TMOD |= 0x10; // 設置定時器1為模式1,即16位定時模式TL0 = 0xA4; // 設置定時器1的低位初值為0xA4TH0 = 0xFF; // 設置定時器1的高位初值為0xFFTF0 = 0; // 清除定時器1的溢出標志位TR0 = 1; // 啟動定時器1// 啟用定時器中斷ET0 = 1; // 打開定時器1中斷EA = 1; // 打開總中斷PT0 = 0; // 設置定時器1中斷優(yōu)先級為低優(yōu)先級
}/* 定時器中斷函數(shù)模板 */
/*
void Timer0_Rountine(void) interrupt 3
{static unsigned int T0Count; // 用于記錄定時器0的計數(shù)TL0 = 0x66; // 設置定時初值TH0 = 0xFC; // 設置定時初值T0Count++; // 每次中斷發(fā)生時自增1if(T0Count >= 1000) // 1000次中斷(即1秒)后執(zhí)行翻轉P2_0口{T0Count = 0;P2_0 = ~P2_0; // 反轉P2_0引腳的輸出電平,達到控制外部設備的效果}
}
*/
Motor.c
#include <REGX52.H>
#include "Timer1.h"sbit Motor = P1^0; // 將 P1 口的第0位定義為 Motor 引腳,用于控制電機的開關unsigned char Counter, Compare; // Counter 用于計時,Compare 用于占空比比較/*** @brief 電機初始化函數(shù),初始化定時器1* @param 無* @retval 無*/
void Motor_Init()
{Timer1_Init(); // 調用定時器1初始化函數(shù),開始計時
}/*** @brief 設置電機轉速* @param Speed 速度參數(shù),范圍為0-100,用于調節(jié)電機的占空比* @retval 無*/
void Motor_SetSpeed(unsigned char Speed)
{Compare = Speed; // 將傳入的速度值賦給 Compare,作為占空比參考值
}/*** @brief 定時器1中斷服務函數(shù)* 使用定時器實現(xiàn) PWM 調速功能* @param 無* @retval 無*/
void Timer1_Rountine(void) interrupt 3 // 定時器1中斷函數(shù)
{TL0 = 0xA4; // 設置定時器初值,確保每次中斷后保持相同的定時時間TH0 = 0xFF; // 設置定時器高位初值Counter++; // 每次中斷時,計時器 Counter 自增1Counter %= 100; // 將 Counter 限制在 0 到 99 的范圍內,形成 100 個周期(模擬 PWM 占空比)// 比較 Counter 和 Compare 的值,用于控制占空比if(Counter < Compare){Motor = 1; // 如果 Counter 小于 Compare,電機引腳輸出高電平,電機通電工作}else{Motor = 0; // 如果 Counter 大于或等于 Compare,電機引腳輸出低電平,電機停止工作}
}
代碼說明
-
Motor_Init()
:-
初始化電機控制模塊,內部調用了
Timer1_Init()
函數(shù),啟動定時器1以實現(xiàn)電機的速度控制。
-
-
Motor_SetSpeed()
:-
該函數(shù)用于設置電機的轉速。傳入的
Speed
參數(shù)(范圍0-100)表示電機速度的占空比,控制電機開啟的時間占整個周期的比例。
-
-
Timer1_Rountine()
:-
定時器1的中斷服務函數(shù),用于實現(xiàn)電機的PWM(脈寬調制)控制。
-
定時器每觸發(fā)一次中斷,
Counter
自增并與設定的占空比Compare
進行比較:-
如果
Counter
小于Compare
,電機引腳輸出高電平(電機運行)。 -
如果
Counter
大于或等于Compare
,電機引腳輸出低電平(電機停止)。
-
-
通過這種方式,程序控制了電機開啟與關閉的比例,從而調整電機的轉速。
-
總體思想
通過定時器中斷實現(xiàn) PWM 控制,以調節(jié)電機的工作狀態(tài)。Counter
循環(huán)自增形成一個周期,并根據(jù)占空比 Compare
控制電機的開關,從而實現(xiàn)電機的轉速控制。
最后總結
通過C語言編程控制51單片機的幾種常見功能,包括紅外遙控解碼、電機轉速控制、定時器中斷和外部中斷等。這些功能的核心思想是利用單片機的定時器、中斷機制和外設來實現(xiàn)對外部設備的控制和數(shù)據(jù)采集。以下是關鍵點的總結:
-
紅外遙控解碼:
-
通過外部中斷
INT0
捕獲紅外信號的下降沿,用定時器測量信號脈沖寬度,從而解碼出遙控器的地址和命令。 -
利用狀態(tài)機進行紅外信號的解析,包括起始信號、數(shù)據(jù)位解碼和重復信號處理。
-
解碼后的命令可以用于控制電機或其他設備的操作。
-
-
定時器的使用:
-
定時器用于生成精準的時間延遲、控制設備(如電機)、或周期性執(zhí)行任務。
-
在定時器中斷服務函數(shù)中,計時器
Counter
和占空比Compare
的比較決定了電機的開關狀態(tài),從而實現(xiàn) PWM 調速。
-
-
PWM 控制電機:
-
通過定時器中斷產生的PWM信號控制電機的轉速。利用占空比來控制電機工作時間的比例,從而調整電機的轉速。
-
電機控制分為初始化、設置速度和根據(jù)設定的速度輸出對應的PWM信號,形成靈活的調速機制。
-
-
外部中斷:
-
外部中斷用于響應外部事件,例如紅外遙控信號的輸入。中斷服務函數(shù)快速響應并執(zhí)行特定任務,確保即使主程序忙碌也能處理緊急事件。
-
-
思想方法:
-
模塊化設計:通過封裝函數(shù)實現(xiàn)功能模塊的獨立性,如紅外解碼、定時器配置、電機控制等。這種設計思路使代碼具有良好的擴展性和維護性。
-
狀態(tài)機:紅外解碼使用狀態(tài)機方法,根據(jù)接收信號的不同狀態(tài)(如空閑、等待、解碼等)做出相應的處理,確保程序運行穩(wěn)定。
-
中斷優(yōu)先機制:中斷機制保證了單片機可以及時響應重要事件,如定時器溢出或外部信號輸入,而不會影響主程序的執(zhí)行。
-
優(yōu)點和好處:
-
實時性強:中斷機制保證了高優(yōu)先級任務(如定時和外部輸入)的及時響應,不會因為主程序的延遲而錯失事件。
-
精確控制:利用定時器實現(xiàn)精準的時間控制,結合PWM調制實現(xiàn)了對電機速度的精確調節(jié)。
-
模塊化和可擴展性:各個功能模塊相互獨立,便于后期擴展新功能或修改現(xiàn)有功能。
通過這些機制和設計,代碼能夠高效地管理外部設備和信號輸入,實現(xiàn)自動化控制和調節(jié)功能。