找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

单片机知识点集

[复制链接]
ID:1167053 发表于 2026-1-28 01:07 | 显示全部楼层 |阅读模式
软件安装与环境配置
1. 软件安装与环境配置
1.1 软件安装(比赛环境准备)
必须安装的软件包:1. Keil C51 (推荐uVision V5.23及以上版本)
2. STC-ISP下载工具 (V6.88以上)
3. CH340/CH341 USB转串口驱动
4. STC单片机型号数据库 (包含IAP15W4K58S4)
蓝桥杯专用环境配置:
1. 安装顺序优化(避免常见问题):
步骤1:安装Keil C51(默认路径C:\Keil_v5)
步骤2:以管理员身份运行STC-ISP工具
步骤3:点击"添加型号和头文件到Keil中"
步骤4:手动添加头文件到Keil安装目录的C51\INC文件夹
2. 工程模板创建(节省比赛时间):
* 蓝桥杯比赛标准工程模板
* Project Name: 比赛题目名称
* Target Device: IAP15W4K58S4
* Crystal Frequency: 11.0592MHz
* Created: 202X/XX/XX

// 头文件包含链(按需选择)
#include <STC15F2K60S2.H>  // IAP15系列通用头文件
#include <intrins.h>       // 常用函数库

// 常用函数声明
void System_Init(void);    // 系统初始化
void Delay1ms(unsigned int n); // 精确延时
unsigned int ReadKey(void);     // 按键读取

// 全局变量声明
unsigned int g_uiSystemTick = 0; // 系统时基
3. 优化配置步骤:

Target配置要点:
[Target]
Device = STC IAP15W4K58S4
Xtal(MHz) = 11.0592      # 必须准确
Memory Model: Small      # 变量在内部RAM
Code Rom Size: Large     # 64K程序空间
Operating system: None   # 无操作系统
Output配置要点:
☑ Create HEX File
☐ Debug Information    # 调试时可开启,比赛时关闭以减小HEX文件
☐ Browse Information   # 同上
Hex Format: HEX-80     # 默认格式
1.2 蓝桥杯考试环境特点
1. 比赛环境限制:
可能限制网络,无法在线安装
USB接口可能有限制
计算机可能有还原卡,重启后配置丢失
2. 应对策略:
考前准备:
  - U盘中备份:
    - Keil安装包
    - STC-ISP工具
    - 驱动包
    - 个人工程模板
  - 预先测试: 在模拟环境中完整跑通开发环境
  - 准备纸质手册: 寄存器速查表
3. 快速排错指南:
问题1: Keil中找不到IAP15芯片
  解决:
  1) 检查STC数据库是否安装
  2) 手动添加: Keil目录下UV4/STC.CDB
  3) 在STC-ISP中点"Keil仿真设置"

问题2: 无法下载程序
  解决:
  1) 检查USB线是否连接
  2) 开发板是否上电
  3) 冷启动顺序: 点击下载→上电复位
  4) 检查串口号: STC-ISP中重新扫描
  5) 检查波特率: 最低波特率(2400)尝试
2. 板载电路原理(竞赛深度解析)
2.1 最小系统电路(蓝桥杯核心考点)
1. 电源电路分析:
竞赛开发板电源拓扑:
USB 5V → 保险丝(500mA) → AMS1117-3.3V →
   ↓                      ↓
5V系统             3.3V系统
(单片机核心)        (部分传感器)
  
关键点:
- 电源指示灯: P1口控制,低电平点亮
- 电源去耦: 每个芯片旁有104(0.1μF)电容
- 电源保护: 自恢复保险丝,防止短路
2. 复位电路变种:
蓝桥杯可能考到的复位方式:
* 1. 上电复位(RC电路)
* 2. 按键复位(手动)
* 3. 看门狗复位(程序跑飞时)
* 4. 软件复位(IAP15特有)
*/

// 软件复位代码(考试可能用到)
void Software_Reset(void)
{
    IAP_CONTR = 0x20;  // 触发软件复位
}
3. 晶振电路扩展知识:
// 晶振频率与定时器关系表
// 频率     定时1ms初值     波特率9600初值
// 11.0592  0xFC67(64551)   0xFD
// 12.0000  0xFC18(64536)   0xFD(实际波特率有误差)
// 24.0000  0xF830(63536)   0xFA

// 内部IRC时钟切换(IAP15特性)
void Switch_Clock(unsigned char mode)
{
    CLK_DIV = mode;  // 分频设置
    // 模式0: 主时钟/1
    // 模式1: 主时钟/2
    // ... 最高可128分频
}
2.2 IO口电路设计(竞赛设计题考点)
1. P0口上拉电阻计算:
设计要求:
驱动8个LED(每个10mA),共阳接法

计算过程:
总电流 = 8 × 10mA = 80mA
P0口单引脚最大电流 = 20mA (安全值)
需要上拉电阻 = (5V - 2.2V) / 20mA ≈ 140Ω
实际选择: 1kΩ (降低功耗,亮度稍减)
2. 驱动能力强化
// 推挽模式 vs 准双向模式对比
void IO_Mode_Demo(void)
{
    // 模式对比表格
    // 模式      输出高    输出低    输入状态
    // 准双向    弱上拉    强下拉    先写1
    // 推挽      强上拉    强下拉    不能输入
    // 高阻      无        无        直接输入
    // 开漏      无        强下拉    带上拉电阻
   
    // 设置P1为推挽输出(驱动LED更亮)
    P1M0 = 0xFF;
    P1M1 = 0x00;
   
    // 设置P2为准双向(按键输入)
    P2M0 = 0x00;
    P2M1 = 0x00;
}
3. 总线扩展接口:
// 74HC138译码器扩展(竞赛常见)
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个设备
Select_Device(3);  // CBA=011
2.3 蓝桥杯电路设计题备考
1. 常见设计题型:
题型1: 补全电路图
  给出部分原理图,补全缺失元件(电阻、电容值)

题型2: 计算元件参数
  根据设计要求(电流、电压、频率),计算元件值

题型3: 故障分析
  指出电路图中错误,并改正

题型4: 程序设计
  根据电路图,编写驱动程序
2. 必背公式和参数:
* 电阻色环速查(客观题可能考)
* 棕1 红2 橙3 黄4 绿5 蓝6 紫7 灰8 白9 黑0
*
* 常用电阻功率:
* 1/8W, 1/4W, 1/2W, 1W
*
* 电容单位换算:
* 1F = 1000mF = 10^6μF = 10^9nF = 10^12pF
*/
3. 电路分析技巧:
// 通过代码验证电路理解
void Test_Circuit_Understanding(void)
{
    // 1. 测试复位电路
    // 按下复位键时,P5.4应为高电平
    sbit RST_TEST = P5^4;
   
    // 2. 测试晶振电路
    // 用示波器测量XTAL1和XTAL2引脚应有正弦波
   
    // 3. 测试电源电路
    // 测量VCC引脚应为稳定的5V±0.2V
}
2.4 竞赛实战技巧
1. 环境快速搭建流程:
比赛开始前10分钟:
1. 检查电脑USB口(尝试插入U盘)
2. 安装Keil(如果未预装)
3. 安装STC数据库
4. 安装串口驱动
5. 创建工程模板
6. 编译一个简单程序测试
2. 硬件快速检测流程:
上电后依次测试:
1. 电源指示灯(正常点亮)
2. 按下复位键(所有LED短暂全亮)
3. 下载测试程序(LED流水灯)
4. 按键测试(按下有反应)
5. 串口测试(发送接收数据)
3. 紧急情况处理:
情况1: 电脑蓝屏/死机
  应对:
  - 举手示意监考老师
  - 使用备用电脑(如有)
  - 恢复代码(U盘备份)

情况2: 开发板损坏
  应对:
  - 申请更换开发板
  - 快速移植已有代码
  - 重新测试基本功能

情况3: 时间不足
  应对:
  - 先完成核心功能
  - 注释掉复杂功能
  - 保证基础分数
3. 51专属C语言语法(蓝桥杯深度强化)
3.1 C51扩展语法详解
3.1.1 特殊功能寄存器(SFR)操作
标准SFR定义方法:
// 方法1:使用sfr关键字(传统方法)
sfr P0 = 0x80;      // P0口地址0x80
sfr P1 = 0x90;      // P1口地址0x90
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;     // 程序状态字
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;
蓝桥杯考试技巧:
// 技巧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;  // 单独控制第0位
3.1.2 中断系统详解
中断向量表(必须掌握):
中断号  中断源        入口地址    优先级
0       外部中断0     0x0003     最高
1       定时器0中断   0x000B     高
2       外部中断1     0x0013     中
3       定时器1中断   0x001B     低
4       串口1中断     0x0023     最低
5       定时器2中断   0x002B     (IAP15特有)
6       串口2中断     0x0033     (IAP15特有)
7       ADC中断       0x003B     (IAP15特有)
中断编程规范:
// 1. 中断服务函数命名规范
void Timer0_ISR() interrupt 1    // 定时器0中断
void INT0_ISR() interrupt 0      // 外部中断0
void UART1_ISR() interrupt 4     // 串口1中断
void ADC_ISR() interrupt 7       // ADC中断

// 2. 中断优先级设置(IP寄存器)
IP = 0x04;      // 设置定时器0为高优先级
// 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
蓝桥杯中断考点代码框架:
// 完整的中断配置示例
void Interrupts_Init(void)
{
    // 定时器0初始化
    TMOD &= 0xF0;       // 清除T0模式位
    TMOD |= 0x01;       // T0模式1,16位定时器
    TH0 = 0xFC;         // 1ms初值@11.0592MHz
    TL0 = 0x67;
    ET0 = 1;            // 允许T0中断
    TR0 = 1;            // 启动T0
   
    // 外部中断0初始化
    IT0 = 1;            // 下降沿触发
    EX0 = 1;            // 允许外部中断0
   
    // 串口中断初始化
    ES = 1;             // 允许串口中断
   
    // 设置中断优先级(可选)
    IP = 0x04;          // 定时器0为高优先级
   
    EA = 1;             // 开总中断
}

// 中断服务函数示例
volatile unsigned int g_uiTimerCount = 0;  // 使用volatile防止优化

void Timer0_ISR() interrupt 1
{
    TH0 = 0xFC;         // 重装初值(必须)
    TL0 = 0x67;
    g_uiTimerCount++;   // 定时器计数
   
    // 避免在中断中使用长延时
    // 避免在中断中进行复杂计算
    // 使用标志位与主程序通信
}
4. IAP15 IO口操作(蓝桥杯实战强化)
4.1 IO口模式深入分析
四种模式详细对比:
* IAP15 IO口模式寄存器说明:
* PxM1, PxM0 (x=0,1,2,3,4,5)
*
* 模式   PxM1 PxM0  说明                      应用场景
* 00     0    0    准双向口(弱上拉)         按键输入、LED控制
* 01     0    1    推挽输出(强驱动)         LED、蜂鸣器、电机驱动
* 10     1    0    高阻输入(高输入阻抗)     ADC输入、电压测量
* 11     1    1    开漏输出(需外接上拉)     I2C、单总线、电平转换
*/
IO口配置实战代码:

// 1. 按位配置IO口模式
void IO_Mode_Config(void)
{
    // P0口配置:低4位推挽输出,高4位准双向
    P0M0 = 0x0F;  // 0000 1111
    P0M1 = 0x00;  // 0000 0000
   
    // P1口配置:全部为推挽输出(驱动LED)
    P1M0 = 0xFF;
    P1M1 = 0x00;
   
    // P2口配置:位0-3为高阻输入(ADC),位4-7为准双向
    P2M0 = 0x00;
    P2M1 = 0x0F;  // 0000 1111
   
    // P3口配置:开漏输出(用于I2C)
    P3M0 = 0xFF;
    P3M1 = 0xFF;
}

// 2. 动态切换IO口模式
void Dynamic_IO_Switch(void)
{
    // 读取传感器时设为高阻输入
    P2M0 = 0x00;
    P2M1 = 0x0F;
    ADC_Value = Read_ADC(0);  // 读取ADC值
   
    // 驱动LED时设为推挽输出
    P2M0 = 0x0F;
    P2M1 = 0x00;
    P2 = 0x00;  // 点亮LED
}
4.2 IO口驱动能力计算与优化
驱动能力分析表:
* IAP15 IO口驱动能力参数(参考数据手册):
* 模式          输出高电流  输出低电流  输入电流
* 准双向口       -0.3mA      20mA       ±0.3mA
* 推挽输出       -20mA       20mA       N/A
* 高阻输入       N/A         N/A        ±0.3mA
* 开漏输出       N/A         20mA       N/A
*
* 注:负电流表示灌电流,正电流表示拉电流
*/
外设驱动设计示例:
// 设计LED阵列驱动(8×8点阵)
void LED_Matrix_Drive(void)
{
    // 行驱动用推挽输出(需要较强驱动能力)
    P1M0 = 0xFF;  // P1口作为行驱动,推挽模式
    P1M1 = 0x00;
   
    // 列驱动用准双向口(电流要求不高)
    P0M0 = 0x00;  // P0口作为列驱动,准双向
    P0M1 = 0x00;
   
    // 动态扫描函数
    void Matrix_Scan(void)
    {
        static unsigned char row = 0;
        
        // 消隐
        P1 = 0xFF;
        P0 = 0x00;
        
        // 显示下一行
        P1 = ~(1 << row);           // 选中当前行(低电平有效)
        P0 = g_MatrixBuffer[row];   // 显示该行数据
        
        row = (row + 1) % 8;        // 循环扫描
    }
}
4.3 蓝桥杯IO口编程技巧
技巧1:宏定义简化操作
// 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))     // 翻转

// 使用示例
SET_BIT(P1, 0);      // P1.0置1
CLR_BIT(P1, 1);      // P1.1清0
if(GET_BIT(P3, 2))   // 读取P3.2状态
{
    // 执行操作
}
TOG_BIT(P2, 3);      // 翻转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
};

// 读取按键函数
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]);
        
        // 读取列状态
        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]);  // 恢复行
                    return i * 4 + j + 1;  // 返回键值
                }
            }
        }
        
        SET_BIT(KeyPortMap[i][0], KeyPortMap[i][1]);  // 恢复行
    }
    return 0;  // 无按键
}
5. 软件延时计算(蓝桥杯精确控制)
5.1 精确延时算法
机器周期计算公式:
* 机器周期 = 12 / 晶振频率(单位:μs)
*
* 对于IAP15(1T模式):机器周期 = 1 / 晶振频率
* 默认12T模式:机器周期 = 12 / 晶振频率
*
* 常用晶振对应机器周期:
* 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
*/
精确延时函数库:
// 1. 基本延时函数(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. 可调延时函数
void Delay_us(unsigned int us)   // 微秒级延时
{
    while(us--)
    {
        Delay1us();
    }
}

void Delay_ms(unsigned int ms)   // 毫秒级延时
{
    while(ms--)
    {
        Delay1ms();
    }
}
5.2 延时精度分析与校准
延时误差分析:
// 延时误差测试函数
void Test_Delay_Error(void)
{
    unsigned long i;
    unsigned long start_time, end_time;
   
    // 方法1:使用定时器测量
    TMOD = 0x01;      // 定时器0,模式1
    TH0 = 0x00;
    TL0 = 0x00;
    TR0 = 1;          // 启动定时器
   
    // 测试Delay1ms()
    start_time = (TH0 << 8) | TL0;
    Delay1ms();
    end_time = (TH0 << 8) | TL0;
   
    // 计算实际延时时间(单位:μs)
    unsigned long actual_time = (end_time - start_time) * 1.085;
    // 理想值应为1000μs
    unsigned long error = actual_time - 1000;
   
    TR0 = 0;  // 停止定时器
}
延时优化技巧:
// 技巧1:使用循环展开减少循环开销
void Optimized_Delay1ms(void)   //@11.0592MHz
{
    unsigned char i, j;
   
    // 内循环展开
    i = 11;
    do {
        j = 200;
        while(--j) {
            _nop_(); _nop_(); _nop_(); _nop_();
            _nop_(); _nop_(); _nop_(); _nop_();
        }
    } while(--i);
}

// 技巧2:使用编译优化选项
#pragma O3   // 最高优化级别
void Fast_Delay(void)
{
    // 编译器会自动优化
    unsigned int i;
    for(i = 0; i < 1000; i++);
}
5.3 蓝桥杯延时应用技巧
应用1:PWM软件模拟
// 软件PWM实现(可用于呼吸灯)
void Software_PWM(unsigned char pin, unsigned char duty)
{
    // 假设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
    }
}
应用2:精确时序控制

// 单总线(如DS18B20)时序控制
bit DS18B20_ReadBit(void)
{
    bit dat;
   
    // 主机拉低至少1μs
    CLR_BIT(P3, 7);  // DQ引脚
    Delay1us();
   
    // 主机释放总线
    SET_BIT(P3, 7);
    Delay5us();  // 等待5μs
   
    // 读取从机响应
    dat = GET_BIT(P3, 7);
    Delay60us();  // 等待60μs完成读取
   
    return dat;
}

// SPI软件模拟时序
unsigned char Soft_SPI_Read(void)
{
    unsigned char i, dat = 0;
   
    for(i = 0; i < 8; i++)
    {
        // 拉高时钟
        SET_BIT(P1, 3);  // SCLK
        Delay1us();
        
        // 读取数据位
        dat <<= 1;
        if(GET_BIT(P1, 2))  // MISO
            dat |= 0x01;
        
        // 拉低时钟
        CLR_BIT(P1, 3);
        Delay1us();
    }
    return dat;
}
应用3:多任务时间片轮转
// 使用延时实现简单的时间片调度
void MultiTask_Shedule(void)
{
    stati unsigned int task1_tik = 0;
    stati unsigned int task2_tik = 0;
   
    // 任务1:每10ms执行一次
    if(++task1_tik >= 10)
    {
        task1_tik = 0;
        Task1_Funtion();  // 执行任务1
    }
   
    // 任务2:每50ms执行一次
    if(++task2_tik >= 50)
    {
        task2_tik = 0;
        Task2_Funtion();  // 执行任务2
    }
   
    Delay1ms();  // 等待1ms
}
蓝桥杯考点总结
51语法考点
特殊关键字:sfr、sbit、interrupt、using、reentrant

存储类型:data、idata、bdata、xdata、ode、pdata

绝对地址访问:_at_关键字、指针强制转换

IO口操作考点
模式选择:根据外设需求选择合适的IO模式

驱动设计:计算驱动电流,防止过载

抗干扰设计:软件消抖、硬件滤波

延时控制考点
精度计算:根据晶振频率计算机器周期

误差分析:理解编译器优化对延时的影响

时序模拟:用延时函数模拟通信协议时序

考试技巧
模板准备:提前准备好常用函数模板

测试验证:上机后先测试延时函数准确性

时间分配:复杂时序控制可先用软件延时,完成后再优化

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表