|
|
軟件安裝與環(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)分
-
查看全部評(píng)分
|