欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 964|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)知識(shí)點(diǎn)集

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1167053 發(fā)表于 2026-1-28 01:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
軟件安裝與環(huán)境配置
1. 軟件安裝與環(huán)境配置
1.1 軟件安裝(比賽環(huán)境準(zhǔn)備)
必須安裝的軟件包:1. Keil C51 (推薦uVision V5.23及以上版本)
2. STC-ISP下載工具 (V6.88以上)
3. CH340/CH341 USB轉(zhuǎn)串口驅(qū)動(dòng)
4. STC單片機(jī)型號(hào)數(shù)據(jù)庫(kù) (包含IAP15W4K58S4)
藍(lán)橋杯專用環(huán)境配置:
1. 安裝順序優(yōu)化(避免常見問(wèn)題):
步驟1:安裝Keil C51(默認(rèn)路徑C:\Keil_v5)
步驟2:以管理員身份運(yùn)行STC-ISP工具
步驟3:點(diǎn)擊"添加型號(hào)和頭文件到Keil中"
步驟4:手動(dòng)添加頭文件到Keil安裝目錄的C51\INC文件夾
2. 工程模板創(chuàng)建(節(jié)省比賽時(shí)間):
* 藍(lán)橋杯比賽標(biāo)準(zhǔn)工程模板
* Project Name: 比賽題目名稱
* Target Device: IAP15W4K58S4
* Crystal Frequency: 11.0592MHz
* Created: 202X/XX/XX

// 頭文件包含鏈(按需選擇)
#include <STC15F2K60S2.H>  // IAP15系列通用頭文件
#include <intrins.h>       // 常用函數(shù)庫(kù)

// 常用函數(shù)聲明
void System_Init(void);    // 系統(tǒng)初始化
void Delay1ms(unsigned int n); // 精確延時(shí)
unsigned int ReadKey(void);     // 按鍵讀取

// 全局變量聲明
unsigned int g_uiSystemTick = 0; // 系統(tǒng)時(shí)基
3. 優(yōu)化配置步驟:

Target配置要點(diǎn):
[Target]
Device = STC IAP15W4K58S4
Xtal(MHz) = 11.0592      # 必須準(zhǔn)確
Memory Model: Small      # 變量在內(nèi)部RAM
Code Rom Size: Large     # 64K程序空間
Operating system: None   # 無(wú)操作系統(tǒng)
Output配置要點(diǎn):
☑ Create HEX File
☐ Debug Information    # 調(diào)試時(shí)可開啟,比賽時(shí)關(guān)閉以減小HEX文件
☐ Browse Information   # 同上
Hex Format: HEX-80     # 默認(rèn)格式
1.2 藍(lán)橋杯考試環(huán)境特點(diǎn)
1. 比賽環(huán)境限制:
可能限制網(wǎng)絡(luò),無(wú)法在線安裝
USB接口可能有限制
計(jì)算機(jī)可能有還原卡,重啟后配置丟失
2. 應(yīng)對(duì)策略:
考前準(zhǔn)備:
  - U盤中備份:
    - Keil安裝包
    - STC-ISP工具
    - 驅(qū)動(dòng)包
    - 個(gè)人工程模板
  - 預(yù)先測(cè)試: 在模擬環(huán)境中完整跑通開發(fā)環(huán)境
  - 準(zhǔn)備紙質(zhì)手冊(cè): 寄存器速查表
3. 快速排錯(cuò)指南:
問(wèn)題1: Keil中找不到IAP15芯片
  解決:
  1) 檢查STC數(shù)據(jù)庫(kù)是否安裝
  2) 手動(dòng)添加: Keil目錄下UV4/STC.CDB
  3) 在STC-ISP中點(diǎn)"Keil仿真設(shè)置"

問(wèn)題2: 無(wú)法下載程序
  解決:
  1) 檢查USB線是否連接
  2) 開發(fā)板是否上電
  3) 冷啟動(dòng)順序: 點(diǎn)擊下載→上電復(fù)位
  4) 檢查串口號(hào): STC-ISP中重新掃描
  5) 檢查波特率: 最低波特率(2400)嘗試
2. 板載電路原理(競(jìng)賽深度解析)
2.1 最小系統(tǒng)電路(藍(lán)橋杯核心考點(diǎn))
1. 電源電路分析:
競(jìng)賽開發(fā)板電源拓?fù)?
USB 5V → 保險(xiǎn)絲(500mA) → AMS1117-3.3V →
   ↓                      ↓
5V系統(tǒng)             3.3V系統(tǒng)
(單片機(jī)核心)        (部分傳感器)
  
關(guān)鍵點(diǎn):
- 電源指示燈: P1口控制,低電平點(diǎn)亮
- 電源去耦: 每個(gè)芯片旁有104(0.1μF)電容
- 電源保護(hù): 自恢復(fù)保險(xiǎn)絲,防止短路
2. 復(fù)位電路變種:
藍(lán)橋杯可能考到的復(fù)位方式:
* 1. 上電復(fù)位(RC電路)
* 2. 按鍵復(fù)位(手動(dòng))
* 3. 看門狗復(fù)位(程序跑飛時(shí))
* 4. 軟件復(fù)位(IAP15特有)
*/

// 軟件復(fù)位代碼(考試可能用到)
void Software_Reset(void)
{
    IAP_CONTR = 0x20;  // 觸發(fā)軟件復(fù)位
}
3. 晶振電路擴(kuò)展知識(shí):
// 晶振頻率與定時(shí)器關(guān)系表
// 頻率     定時(shí)1ms初值     波特率9600初值
// 11.0592  0xFC67(64551)   0xFD
// 12.0000  0xFC18(64536)   0xFD(實(shí)際波特率有誤差)
// 24.0000  0xF830(63536)   0xFA

// 內(nèi)部IRC時(shí)鐘切換(IAP15特性)
void Switch_Clock(unsigned char mode)
{
    CLK_DIV = mode;  // 分頻設(shè)置
    // 模式0: 主時(shí)鐘/1
    // 模式1: 主時(shí)鐘/2
    // ... 最高可128分頻
}
2.2 IO口電路設(shè)計(jì)(競(jìng)賽設(shè)計(jì)題考點(diǎn))
1. P0口上拉電阻計(jì)算:
設(shè)計(jì)要求:
驅(qū)動(dòng)8個(gè)LED(每個(gè)10mA),共陽(yáng)接法

計(jì)算過(guò)程:
總電流 = 8 × 10mA = 80mA
P0口單引腳最大電流 = 20mA (安全值)
需要上拉電阻 = (5V - 2.2V) / 20mA ≈ 140Ω
實(shí)際選擇: 1kΩ (降低功耗,亮度稍減)
2. 驅(qū)動(dòng)能力強(qiáng)化
// 推挽模式 vs 準(zhǔn)雙向模式對(duì)比
void IO_Mode_Demo(void)
{
    // 模式對(duì)比表格
    // 模式      輸出高    輸出低    輸入狀態(tài)
    // 準(zhǔn)雙向    弱上拉    強(qiáng)下拉    先寫1
    // 推挽      強(qiáng)上拉    強(qiáng)下拉    不能輸入
    // 高阻      無(wú)        無(wú)        直接輸入
    // 開漏      無(wú)        強(qiáng)下拉    帶上拉電阻
   
    // 設(shè)置P1為推挽輸出(驅(qū)動(dòng)LED更亮)
    P1M0 = 0xFF;
    P1M1 = 0x00;
   
    // 設(shè)置P2為準(zhǔn)雙向(按鍵輸入)
    P2M0 = 0x00;
    P2M1 = 0x00;
}
3. 總線擴(kuò)展接口:
// 74HC138譯碼器擴(kuò)展(競(jìng)賽常見)
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

void Select_Device(unsigned char dev)
{
    HC138_C = (dev & 0x04) >> 2;
    HC138_B = (dev & 0x02) >> 1;
    HC138_A = dev & 0x01;
}

// 使用示例:選擇第3個(gè)設(shè)備
Select_Device(3);  // CBA=011
2.3 藍(lán)橋杯電路設(shè)計(jì)題備考
1. 常見設(shè)計(jì)題型:
題型1: 補(bǔ)全電路圖
  給出部分原理圖,補(bǔ)全缺失元件(電阻、電容值)

題型2: 計(jì)算元件參數(shù)
  根據(jù)設(shè)計(jì)要求(電流、電壓、頻率),計(jì)算元件值

題型3: 故障分析
  指出電路圖中錯(cuò)誤,并改正

題型4: 程序設(shè)計(jì)
  根據(jù)電路圖,編寫驅(qū)動(dòng)程序
2. 必背公式和參數(shù):
* 電阻色環(huán)速查(客觀題可能考)
* 棕1 紅2 橙3 黃4 綠5 藍(lán)6 紫7 灰8 白9 黑0
*
* 常用電阻功率:
* 1/8W, 1/4W, 1/2W, 1W
*
* 電容單位換算:
* 1F = 1000mF = 10^6μF = 10^9nF = 10^12pF
*/
3. 電路分析技巧:
// 通過(guò)代碼驗(yàn)證電路理解
void Test_Circuit_Understanding(void)
{
    // 1. 測(cè)試復(fù)位電路
    // 按下復(fù)位鍵時(shí),P5.4應(yīng)為高電平
    sbit RST_TEST = P5^4;
   
    // 2. 測(cè)試晶振電路
    // 用示波器測(cè)量XTAL1和XTAL2引腳應(yīng)有正弦波
   
    // 3. 測(cè)試電源電路
    // 測(cè)量VCC引腳應(yīng)為穩(wěn)定的5V±0.2V
}
2.4 競(jìng)賽實(shí)戰(zhàn)技巧
1. 環(huán)境快速搭建流程:
比賽開始前10分鐘:
1. 檢查電腦USB口(嘗試插入U(xiǎn)盤)
2. 安裝Keil(如果未預(yù)裝)
3. 安裝STC數(shù)據(jù)庫(kù)
4. 安裝串口驅(qū)動(dòng)
5. 創(chuàng)建工程模板
6. 編譯一個(gè)簡(jiǎn)單程序測(cè)試
2. 硬件快速檢測(cè)流程:
上電后依次測(cè)試:
1. 電源指示燈(正常點(diǎn)亮)
2. 按下復(fù)位鍵(所有LED短暫全亮)
3. 下載測(cè)試程序(LED流水燈)
4. 按鍵測(cè)試(按下有反應(yīng))
5. 串口測(cè)試(發(fā)送接收數(shù)據(jù))
3. 緊急情況處理:
情況1: 電腦藍(lán)屏/死機(jī)
  應(yīng)對(duì):
  - 舉手示意監(jiān)考老師
  - 使用備用電腦(如有)
  - 恢復(fù)代碼(U盤備份)

情況2: 開發(fā)板損壞
  應(yīng)對(duì):
  - 申請(qǐng)更換開發(fā)板
  - 快速移植已有代碼
  - 重新測(cè)試基本功能

情況3: 時(shí)間不足
  應(yīng)對(duì):
  - 先完成核心功能
  - 注釋掉復(fù)雜功能
  - 保證基礎(chǔ)分?jǐn)?shù)
3. 51專屬C語(yǔ)言語(yǔ)法(藍(lán)橋杯深度強(qiáng)化)
3.1 C51擴(kuò)展語(yǔ)法詳解
3.1.1 特殊功能寄存器(SFR)操作
標(biāo)準(zhǔn)SFR定義方法:
// 方法1:使用sfr關(guān)鍵字(傳統(tǒng)方法)
sfr P0 = 0x80;      // P0口地址0x80
sfr P1 = 0x90;      // P1口地址0x90
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;     // 程序狀態(tài)字
sfr SCON = 0x98;    // 串口控制寄存器

// 方法2:使用STC官方頭文件(推薦)
#include "STC15F2K60S2.H"  // 包含所有寄存器定義

// 方法3:使用sbit定義位
sbit P1_0 = P1^0;          // 位定義
sbit P1_1 = P1^1;
sbit RS = P2^7;            // LCD控制引腳定義
sbit RW = P2^6;
sbit EN = P2^5;
藍(lán)橋杯考試技巧:
// 技巧1:寄存器別名定義(方便記憶)
#define LED_PORT P0
#define KEY_PORT P3
#define SMG_PORT P2

// 技巧2:使用位域操作(清晰直觀)
typedef union {
    unsigned char byte;
    struct {
        unsigned char bit0 : 1;
        unsigned char bit1 : 1;
        unsigned char bit2 : 1;
        unsigned char bit3 : 1;
        unsigned char bit4 : 1;
        unsigned char bit5 : 1;
        unsigned char bit6 : 1;
        unsigned char bit7 : 1;
    } bits;
} PORT_REG;

// 使用示例
PORT_REG P0_reg;
P0_reg.byte = 0xFF;
P0_reg.bits.bit0 = 0;  // 單獨(dú)控制第0位
3.1.2 中斷系統(tǒng)詳解
中斷向量表(必須掌握):
中斷號(hào)  中斷源        入口地址    優(yōu)先級(jí)
0       外部中斷0     0x0003     最高
1       定時(shí)器0中斷   0x000B     高
2       外部中斷1     0x0013     中
3       定時(shí)器1中斷   0x001B     低
4       串口1中斷     0x0023     最低
5       定時(shí)器2中斷   0x002B     (IAP15特有)
6       串口2中斷     0x0033     (IAP15特有)
7       ADC中斷       0x003B     (IAP15特有)
中斷編程規(guī)范:
// 1. 中斷服務(wù)函數(shù)命名規(guī)范
void Timer0_ISR() interrupt 1    // 定時(shí)器0中斷
void INT0_ISR() interrupt 0      // 外部中斷0
void UART1_ISR() interrupt 4     // 串口1中斷
void ADC_ISR() interrupt 7       // ADC中斷

// 2. 中斷優(yōu)先級(jí)設(shè)置(IP寄存器)
IP = 0x04;      // 設(shè)置定時(shí)器0為高優(yōu)先級(jí)
// IP各位含義:PX0, PT0, PX1, PT1, PS, PT2, PS2, PADC

// 3. 中斷使能控制(IE寄存器)
IE = 0x8F;      // EA=1, EX0=1, ET0=1, EX1=1, ET1=1
// IE各位含義:EA, -, ET2, ES, ET1, EX1, ET0, EX0
藍(lán)橋杯中斷考點(diǎn)代碼框架:
// 完整的中斷配置示例
void Interrupts_Init(void)
{
    // 定時(shí)器0初始化
    TMOD &= 0xF0;       // 清除T0模式位
    TMOD |= 0x01;       // T0模式1,16位定時(shí)器
    TH0 = 0xFC;         // 1ms初值@11.0592MHz
    TL0 = 0x67;
    ET0 = 1;            // 允許T0中斷
    TR0 = 1;            // 啟動(dòng)T0
   
    // 外部中斷0初始化
    IT0 = 1;            // 下降沿觸發(fā)
    EX0 = 1;            // 允許外部中斷0
   
    // 串口中斷初始化
    ES = 1;             // 允許串口中斷
   
    // 設(shè)置中斷優(yōu)先級(jí)(可選)
    IP = 0x04;          // 定時(shí)器0為高優(yōu)先級(jí)
   
    EA = 1;             // 開總中斷
}

// 中斷服務(wù)函數(shù)示例
volatile unsigned int g_uiTimerCount = 0;  // 使用volatile防止優(yōu)化

void Timer0_ISR() interrupt 1
{
    TH0 = 0xFC;         // 重裝初值(必須)
    TL0 = 0x67;
    g_uiTimerCount++;   // 定時(shí)器計(jì)數(shù)
   
    // 避免在中斷中使用長(zhǎng)延時(shí)
    // 避免在中斷中進(jìn)行復(fù)雜計(jì)算
    // 使用標(biāo)志位與主程序通信
}
4. IAP15 IO口操作(藍(lán)橋杯實(shí)戰(zhàn)強(qiáng)化)
4.1 IO口模式深入分析
四種模式詳細(xì)對(duì)比:
* IAP15 IO口模式寄存器說(shuō)明:
* PxM1, PxM0 (x=0,1,2,3,4,5)
*
* 模式   PxM1 PxM0  說(shuō)明                      應(yīng)用場(chǎng)景
* 00     0    0    準(zhǔn)雙向口(弱上拉)         按鍵輸入、LED控制
* 01     0    1    推挽輸出(強(qiáng)驅(qū)動(dòng))         LED、蜂鳴器、電機(jī)驅(qū)動(dòng)
* 10     1    0    高阻輸入(高輸入阻抗)     ADC輸入、電壓測(cè)量
* 11     1    1    開漏輸出(需外接上拉)     I2C、單總線、電平轉(zhuǎn)換
*/
IO口配置實(shí)戰(zhàn)代碼:

// 1. 按位配置IO口模式
void IO_Mode_Config(void)
{
    // P0口配置:低4位推挽輸出,高4位準(zhǔn)雙向
    P0M0 = 0x0F;  // 0000 1111
    P0M1 = 0x00;  // 0000 0000
   
    // P1口配置:全部為推挽輸出(驅(qū)動(dòng)LED)
    P1M0 = 0xFF;
    P1M1 = 0x00;
   
    // P2口配置:位0-3為高阻輸入(ADC),位4-7為準(zhǔn)雙向
    P2M0 = 0x00;
    P2M1 = 0x0F;  // 0000 1111
   
    // P3口配置:開漏輸出(用于I2C)
    P3M0 = 0xFF;
    P3M1 = 0xFF;
}

// 2. 動(dòng)態(tài)切換IO口模式
void Dynamic_IO_Switch(void)
{
    // 讀取傳感器時(shí)設(shè)為高阻輸入
    P2M0 = 0x00;
    P2M1 = 0x0F;
    ADC_Value = Read_ADC(0);  // 讀取ADC值
   
    // 驅(qū)動(dòng)LED時(shí)設(shè)為推挽輸出
    P2M0 = 0x0F;
    P2M1 = 0x00;
    P2 = 0x00;  // 點(diǎn)亮LED
}
4.2 IO口驅(qū)動(dòng)能力計(jì)算與優(yōu)化
驅(qū)動(dòng)能力分析表:
* IAP15 IO口驅(qū)動(dòng)能力參數(shù)(參考數(shù)據(jù)手冊(cè)):
* 模式          輸出高電流  輸出低電流  輸入電流
* 準(zhǔn)雙向口       -0.3mA      20mA       ±0.3mA
* 推挽輸出       -20mA       20mA       N/A
* 高阻輸入       N/A         N/A        ±0.3mA
* 開漏輸出       N/A         20mA       N/A
*
* 注:負(fù)電流表示灌電流,正電流表示拉電流
*/
外設(shè)驅(qū)動(dòng)設(shè)計(jì)示例:
// 設(shè)計(jì)LED陣列驅(qū)動(dòng)(8×8點(diǎn)陣)
void LED_Matrix_Drive(void)
{
    // 行驅(qū)動(dòng)用推挽輸出(需要較強(qiáng)驅(qū)動(dòng)能力)
    P1M0 = 0xFF;  // P1口作為行驅(qū)動(dòng),推挽模式
    P1M1 = 0x00;
   
    // 列驅(qū)動(dòng)用準(zhǔn)雙向口(電流要求不高)
    P0M0 = 0x00;  // P0口作為列驅(qū)動(dòng),準(zhǔn)雙向
    P0M1 = 0x00;
   
    // 動(dòng)態(tài)掃描函數(shù)
    void Matrix_Scan(void)
    {
        static unsigned char row = 0;
        
        // 消隱
        P1 = 0xFF;
        P0 = 0x00;
        
        // 顯示下一行
        P1 = ~(1 << row);           // 選中當(dāng)前行(低電平有效)
        P0 = g_MatrixBuffer[row];   // 顯示該行數(shù)據(jù)
        
        row = (row + 1) % 8;        // 循環(huán)掃描
    }
}
4.3 藍(lán)橋杯IO口編程技巧
技巧1:宏定義簡(jiǎn)化操作
// IO口操作宏定義
#define SET_BIT(port, bit) (port |= (1 << bit))     // 置1
#define CLR_BIT(port, bit) (port &= ~(1 << bit))    // 清0
#define GET_BIT(port, bit) (port & (1 << bit))      // 讀取
#define TOG_BIT(port, bit) (port ^= (1 << bit))     // 翻轉(zhuǎn)

// 使用示例
SET_BIT(P1, 0);      // P1.0置1
CLR_BIT(P1, 1);      // P1.1清0
if(GET_BIT(P3, 2))   // 讀取P3.2狀態(tài)
{
    // 執(zhí)行操作
}
TOG_BIT(P2, 3);      // 翻轉(zhuǎn)P2.3
技巧2:端口映射表(用于按鍵掃描)
// 4×4矩陣鍵盤端口映射
const unsigned char KeyPortMap[4][2] = {
    {P3, 4},  // 第一行,P3.4
    {P3, 5},  // 第二行,P3.5
    {P3, 6},  // 第三行,P3.6
    {P3, 7},  // 第四行,P3.7
};

// 讀取按鍵函數(shù)
unsigned char Read_Matrix_Key(void)
{
    unsigned char i, j;
   
    for(i = 0; i < 4; i++)
    {
        // 掃描第i行
        CLR_BIT(KeyPortMap[i][0], KeyPortMap[i][1]);
        
        // 讀取列狀態(tài)
        for(j = 0; j < 4; j++)
        {
            if(!GET_BIT(P4, j))  // 第j列被按下
            {
                // 消抖
                Delay10ms();
                if(!GET_BIT(P4, j))
                {
                    SET_BIT(KeyPortMap[i][0], KeyPortMap[i][1]);  // 恢復(fù)行
                    return i * 4 + j + 1;  // 返回鍵值
                }
            }
        }
        
        SET_BIT(KeyPortMap[i][0], KeyPortMap[i][1]);  // 恢復(fù)行
    }
    return 0;  // 無(wú)按鍵
}
5. 軟件延時(shí)計(jì)算(藍(lán)橋杯精確控制)
5.1 精確延時(shí)算法
機(jī)器周期計(jì)算公式:
* 機(jī)器周期 = 12 / 晶振頻率(單位:μs)
*
* 對(duì)于IAP15(1T模式):機(jī)器周期 = 1 / 晶振頻率
* 默認(rèn)12T模式:機(jī)器周期 = 12 / 晶振頻率
*
* 常用晶振對(duì)應(yīng)機(jī)器周期:
* 11.0592MHz: 12/11.0592 ≈ 1.085μs (12T模式)
* 12.0000MHz: 12/12.0000 = 1.000μs
* 24.0000MHz: 12/24.0000 = 0.500μs
*/
精確延時(shí)函數(shù)庫(kù):
// 1. 基本延時(shí)函數(shù)(11.0592MHz,12T模式)
void Delay1us(void)        //@11.0592MHz
{
    _nop_(); _nop_(); _nop_();
    _nop_(); _nop_(); _nop_();
}

void Delay10us(void)       //@11.0592MHz
{
    unsigned char i;
    i = 27;
    while(--i);
}

void Delay50us(void)       //@11.0592MHz
{
    unsigned char i;
    i = 138;
    while(--i);
}

void Delay100us(void)      //@11.0592MHz
{
    unsigned char i, j;
    i = 3;
    j = 71;
    do {
        while(--j);
    } while(--i);
}

void Delay1ms(void)        //@11.0592MHz
{
    unsigned char i, j;
    i = 12;
    j = 169;
    do {
        while(--j);
    } while(--i);
}

void Delay10ms(void)       //@11.0592MHz
{
    unsigned char i, j, k;
    i = 1;
    j = 207;
    k = 175;
    do {
        do {
            while(--k);
        } while(--j);
    } while(--i);
}

// 2. 可調(diào)延時(shí)函數(shù)
void Delay_us(unsigned int us)   // 微秒級(jí)延時(shí)
{
    while(us--)
    {
        Delay1us();
    }
}

void Delay_ms(unsigned int ms)   // 毫秒級(jí)延時(shí)
{
    while(ms--)
    {
        Delay1ms();
    }
}
5.2 延時(shí)精度分析與校準(zhǔn)
延時(shí)誤差分析:
// 延時(shí)誤差測(cè)試函數(shù)
void Test_Delay_Error(void)
{
    unsigned long i;
    unsigned long start_time, end_time;
   
    // 方法1:使用定時(shí)器測(cè)量
    TMOD = 0x01;      // 定時(shí)器0,模式1
    TH0 = 0x00;
    TL0 = 0x00;
    TR0 = 1;          // 啟動(dòng)定時(shí)器
   
    // 測(cè)試Delay1ms()
    start_time = (TH0 << 8) | TL0;
    Delay1ms();
    end_time = (TH0 << 8) | TL0;
   
    // 計(jì)算實(shí)際延時(shí)時(shí)間(單位:μs)
    unsigned long actual_time = (end_time - start_time) * 1.085;
    // 理想值應(yīng)為1000μs
    unsigned long error = actual_time - 1000;
   
    TR0 = 0;  // 停止定時(shí)器
}
延時(shí)優(yōu)化技巧:
// 技巧1:使用循環(huán)展開減少循環(huán)開銷
void Optimized_Delay1ms(void)   //@11.0592MHz
{
    unsigned char i, j;
   
    // 內(nèi)循環(huán)展開
    i = 11;
    do {
        j = 200;
        while(--j) {
            _nop_(); _nop_(); _nop_(); _nop_();
            _nop_(); _nop_(); _nop_(); _nop_();
        }
    } while(--i);
}

// 技巧2:使用編譯優(yōu)化選項(xiàng)
#pragma O3   // 最高優(yōu)化級(jí)別
void Fast_Delay(void)
{
    // 編譯器會(huì)自動(dòng)優(yōu)化
    unsigned int i;
    for(i = 0; i < 1000; i++);
}
5.3 藍(lán)橋杯延時(shí)應(yīng)用技巧
應(yīng)用1:PWM軟件模擬
// 軟件PWM實(shí)現(xiàn)(可用于呼吸燈)
void Software_PWM(unsigned char pin, unsigned char duty)
{
    // 假設(shè)pin是P1.0
    unsigned char i;
   
    for(i = 0; i < 100; i++)
    {
        if(i < duty)
        {
            CLR_BIT(P1, 0);  // 低電平,燈亮
        }
        else
        {
            SET_BIT(P1, 0);  // 高電平,燈滅
        }
        Delay10us();  // 10μs周期,總周期1ms
    }
}
應(yīng)用2:精確時(shí)序控制

// 單總線(如DS18B20)時(shí)序控制
bit DS18B20_ReadBit(void)
{
    bit dat;
   
    // 主機(jī)拉低至少1μs
    CLR_BIT(P3, 7);  // DQ引腳
    Delay1us();
   
    // 主機(jī)釋放總線
    SET_BIT(P3, 7);
    Delay5us();  // 等待5μs
   
    // 讀取從機(jī)響應(yīng)
    dat = GET_BIT(P3, 7);
    Delay60us();  // 等待60μs完成讀取
   
    return dat;
}

// SPI軟件模擬時(shí)序
unsigned char Soft_SPI_Read(void)
{
    unsigned char i, dat = 0;
   
    for(i = 0; i < 8; i++)
    {
        // 拉高時(shí)鐘
        SET_BIT(P1, 3);  // SCLK
        Delay1us();
        
        // 讀取數(shù)據(jù)位
        dat <<= 1;
        if(GET_BIT(P1, 2))  // MISO
            dat |= 0x01;
        
        // 拉低時(shí)鐘
        CLR_BIT(P1, 3);
        Delay1us();
    }
    return dat;
}
應(yīng)用3:多任務(wù)時(shí)間片輪轉(zhuǎn)
// 使用延時(shí)實(shí)現(xiàn)簡(jiǎn)單的時(shí)間片調(diào)度
void MultiTask_Shedule(void)
{
    stati unsigned int task1_tik = 0;
    stati unsigned int task2_tik = 0;
   
    // 任務(wù)1:每10ms執(zhí)行一次
    if(++task1_tik >= 10)
    {
        task1_tik = 0;
        Task1_Funtion();  // 執(zhí)行任務(wù)1
    }
   
    // 任務(wù)2:每50ms執(zhí)行一次
    if(++task2_tik >= 50)
    {
        task2_tik = 0;
        Task2_Funtion();  // 執(zhí)行任務(wù)2
    }
   
    Delay1ms();  // 等待1ms
}
藍(lán)橋杯考點(diǎn)總結(jié)
51語(yǔ)法考點(diǎn)
特殊關(guān)鍵字:sfr、sbit、interrupt、using、reentrant

存儲(chǔ)類型:data、idata、bdata、xdata、ode、pdata

絕對(duì)地址訪問(wèn):_at_關(guān)鍵字、指針強(qiáng)制轉(zhuǎn)換

IO口操作考點(diǎn)
模式選擇:根據(jù)外設(shè)需求選擇合適的IO模式

驅(qū)動(dòng)設(shè)計(jì):計(jì)算驅(qū)動(dòng)電流,防止過(guò)載

抗干擾設(shè)計(jì):軟件消抖、硬件濾波

延時(shí)控制考點(diǎn)
精度計(jì)算:根據(jù)晶振頻率計(jì)算機(jī)器周期

誤差分析:理解編譯器優(yōu)化對(duì)延時(shí)的影響

時(shí)序模擬:用延時(shí)函數(shù)模擬通信協(xié)議時(shí)序

考試技巧
模板準(zhǔn)備:提前準(zhǔn)備好常用函數(shù)模板

測(cè)試驗(yàn)證:上機(jī)后先測(cè)試延時(shí)函數(shù)準(zhǔn)確性

時(shí)間分配:復(fù)雜時(shí)序控制可先用軟件延時(shí),完成后再優(yōu)化

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1110792 發(fā)表于 2026-1-31 15:48 | 只看該作者
突出重點(diǎn),條例清晰,
回復(fù)

使用道具 舉報(bào)

板凳
ID:1166852 發(fā)表于 2026-2-3 11:15 | 只看該作者
筆記精華,知識(shí)回顧。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表