中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

php做網站用html做嗎百度網站名稱

php做網站用html做嗎,百度網站名稱,市場部做網站工作職責,在哪里可以查公司注冊信息作者:Whappy 時間:2024.9.20 總結一下!基礎實驗到這兒里就圓滿結束,歷經25天,將51單片機學完并親自手敲代碼近5000行,在手敲代碼過程中,明顯感覺的看和敲,明顯就是不同的感覺&…

作者: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 進行增減。

主要流程:

  1. LCD 初始化:

    • LCD_Init() 初始化 LCD1602 顯示屏。
    • 在第一行顯示 "ADDR CMD NUM" 作為標題。
    • 在第二行初始化顯示地址碼、命令碼和變量 Num 的值。
  2. 紅外接收初始化:

    • IR_Init() 初始化紅外接收功能,準備接收遙控器信號。
  3. 循環(huán)處理紅外信號:

    • IR_GetDataFlag()IR_GetRepeatFlag() 判斷是否接收到數(shù)據(jù)幀或連發(fā)幀。
    • 如果接收到信號:
      • 調用 IR_GetAddress() 獲取遙控器地址碼并顯示在LCD上。
      • 調用 IR_GetCommand() 獲取遙控器命令碼并顯示在LCD上。
  4. 處理命令:

    • 如果接收到的命令碼是 IR_VOL_MINUS(對應遙控器的音量減鍵),變量 Num 自減。
    • 如果接收到的命令碼是 IR_VOL_ADD(對應遙控器的音量加鍵),變量 Num 自增。
  5. 顯示數(shù)值:

    • 更新LCD,顯示變量 Num 的值。

通過遙控器上的音量加減鍵,用戶可以控制數(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)}}
}

代碼思路

  1. 初始化部分

    • 調用 IR_Init() 函數(shù)來初始化外部中斷0和定時器0,確保紅外接收能夠計時和響應信號的變化。

  2. 狀態(tài)機控制

    • 通過 IR_State 進行狀態(tài)管理。程序根據(jù)中斷觸發(fā)的時間判斷信號類型(啟動信號、連發(fā)信號或數(shù)據(jù))。

    • 根據(jù)不同狀態(tài),程序分別執(zhí)行啟動計時、判斷信號類型、接收并解碼紅外數(shù)據(jù)的操作。

  3. 數(shù)據(jù)接收和處理

    • 紅外信號的編碼通過時間間隔來區(qū)分邏輯0和邏輯1。程序根據(jù)紅外信號的時間長短判斷數(shù)據(jù)位,最終解碼成地址和命令。

    • 采用位操作將紅外信號按位存入 IR_Data 數(shù)組,并在接收到完整32位數(shù)據(jù)后校驗數(shù)據(jù)的有效性(利用地址和命令碼的互補關系)。

  4. 標志位與狀態(tài)管理

    • 使用 IR_DataFlagIR_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_DataFlagIR_RepeatFlag 等標志位,模塊化地提供狀態(tài)信息,便于其他模塊獲取數(shù)據(jù)而不直接干擾中斷邏輯。

  • 位操作與定時器結合:通過定時器捕獲時間差,結合位操作解碼數(shù)據(jù),使得紅外信號的處理精確而高效。

思想方法

  • 模塊化設計:將不同功能(如定時器、外部中斷、信號解碼)分離為不同的函數(shù),方便維護和擴展。

  • 狀態(tài)機模型:通過有限狀態(tài)機的方式處理信號,能夠清晰管理不同階段的任務,避免邏輯混亂。

  • 時間敏感的處理:通過定時器精確測量時間,結合中斷機制,高效地接收和處理紅外信號。

實驗二:紅外遙控控制電機調速實驗(其余代碼往期實驗)

目的是通過紅外遙控器來控制電機的轉速,并通過數(shù)碼管顯示當前速度值。具體功能如下:

  1. 紅外遙控輸入

    • 程序接收紅外遙控器的命令碼,根據(jù)不同的按鍵(如 IR_0, IR_1, IR_2, IR_3)來設置不同的電機速度。

  2. 電機速度控制

    • 程序根據(jù)遙控器的命令,通過 Motor_SetSpeed() 函數(shù)來調整電機的實際轉速。設定的速度分為4個級別:停止、50%、75%、100%。

  3. 數(shù)碼管顯示

    • 使用數(shù)碼管 Nixie() 來顯示當前的速度狀態(tài),將當前的速度級別(0、1、2、3)顯示在數(shù)碼管上。

總體思想

  1. 模塊化設計

    • 程序分為幾個獨立模塊,如 Motor_Init() 初始化電機,IR_Init() 初始化紅外接收,Motor_SetSpeed() 設置電機轉速,Nixie() 用于顯示當前速度值。這樣的設計便于調試和擴展。

  2. 紅外控制

    • 利用紅外接收模塊,通過接收遙控器發(fā)送的命令碼,改變電機的速度。程序通過不斷檢查是否有數(shù)據(jù)幀到來,一旦收到有效數(shù)據(jù),就解析命令碼并做出響應。

  3. 狀態(tài)機思想

    • 代碼使用簡單的狀態(tài)判斷(速度級別為0到3),根據(jù)不同的命令調整電機的運行狀態(tài),并通過顯示屏實時反饋當前狀態(tài)。這種邏輯使得代碼結構清晰,處理不同輸入時能夠快速響應。

  4. 解耦合和靈活性

    • 將電機控制和遙控器輸入解耦合,遙控器只需發(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,電機引腳輸出低電平,電機停止工作}
}

代碼說明

  1. Motor_Init():

    • 初始化電機控制模塊,內部調用了 Timer1_Init() 函數(shù),啟動定時器1以實現(xiàn)電機的速度控制。

  2. Motor_SetSpeed():

    • 該函數(shù)用于設置電機的轉速。傳入的 Speed 參數(shù)(范圍0-100)表示電機速度的占空比,控制電機開啟的時間占整個周期的比例。

  3. 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ù)采集。以下是關鍵點的總結:

  1. 紅外遙控解碼

    • 通過外部中斷 INT0 捕獲紅外信號的下降沿,用定時器測量信號脈沖寬度,從而解碼出遙控器的地址和命令。

    • 利用狀態(tài)機進行紅外信號的解析,包括起始信號、數(shù)據(jù)位解碼重復信號處理。

    • 解碼后的命令可以用于控制電機或其他設備的操作。

  2. 定時器的使用

    • 定時器用于生成精準的時間延遲、控制設備(如電機)、或周期性執(zhí)行任務。

    • 在定時器中斷服務函數(shù)中,計時器 Counter 和占空比 Compare 的比較決定了電機的開關狀態(tài),從而實現(xiàn) PWM 調速。

  3. PWM 控制電機

    • 通過定時器中斷產生的PWM信號控制電機的轉速。利用占空比來控制電機工作時間的比例,從而調整電機的轉速。

    • 電機控制分為初始化、設置速度和根據(jù)設定的速度輸出對應的PWM信號,形成靈活的調速機制。

  4. 外部中斷

    • 外部中斷用于響應外部事件,例如紅外遙控信號的輸入。中斷服務函數(shù)快速響應并執(zhí)行特定任務,確保即使主程序忙碌也能處理緊急事件。

  5. 思想方法

    • 模塊化設計:通過封裝函數(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é)功能。

http://www.risenshineclean.com/news/53571.html

相關文章:

  • 注冊網站亂填郵箱廣州搜索seo網站優(yōu)化
  • 企業(yè)網站 帶后臺聊城seo整站優(yōu)化報價
  • 威客做的好的網站蘇州網站建設公司排名
  • 外包建站的公司怎么做seo網站做優(yōu)化
  • 東莞制作公司網站的公司如何提升網站seo排名
  • 福建seo關鍵詞優(yōu)化外包新站seo優(yōu)化快速上排名
  • 網站后臺慢市場營銷在線課程
  • 建設財經資訊網站的目的視頻營銷成功的案例
  • wordpress 406優(yōu)化人員配置
  • 阿里云做電腦網站佛山網站設計實力樂云seo
  • 自己制作二維碼的軟件seo服務公司招聘
  • 當下網站建設企業(yè)網站模板 免費
  • 做網站付多少定金uv推廣平臺
  • 設計素材網站照片逆冬黑帽seo培訓
  • 電子商務網站建設與管理王生春今日新聞 最新消息 大事
  • 有哪些做網站的公司四川seo推廣公司
  • 北京便宜網站建設德國搜索引擎
  • 完整網站設計東莞網站優(yōu)化公司
  • 網站靜態(tài)和動態(tài)那個好app推廣平臺有哪些
  • by wordpressseo短視頻
  • 河北滄州建設官方網站專業(yè)的網絡推廣
  • 中華住房與城鄉(xiāng)建設廳網站旺道網站優(yōu)化
  • 響應式網站模板 金融大專網絡營銷專業(yè)好不好
  • 網站的報價怎么做sem優(yōu)化策略
  • 外國語學院英文網站建設天津企業(yè)seo
  • 網站制作鄭州軟件推廣怎么賺錢
  • 什么網站可以賺錢啊專業(yè)做app軟件開發(fā)公司
  • 做網站的軟件 簡單易學今日特大新聞新事
  • 陜西華偉建設有限公司網站seo描述是什么意思
  • 網頁編輯器綠色版360優(yōu)化大師官方網站