=Quick reference card - 8位单片机普中开发板HC6800_EM3_V2.2

126 阅读5分钟

[toc]

普中开发板HC6800_EM3_V2.2

//功能框图: image //51单片机pinout image //stm32F103C8T6小板的pinout image

//51单片机升级方法: image //如果使用普中仿真器,必须要使用keil c51v901版本,新的keil版本不行!参考 \_proj_普中单片机开发板HC6800_EM3_V2.2\HC6800-EM3 V2.2(10,29)光盘\3--开发工具\5.普中51仿真器驱动及使用说明

51单片机 Keil C51 开发快速参考卡

一、核心架构特性

项目参数/说明
核心架构8位Intel 8051兼容内核
工作频率典型12MHz(1机器周期=12时钟周期)
存储结构哈佛架构(程序与数据分离)
程序存储器(ROM)4-64KB Flash/OTP
内部RAM128-1024字节
特殊功能寄存器(SFR)128字节(可位寻址)
I/O引脚32个(4x8位端口)
定时器/计数器2-3个16位定时器
串行通信UART(全双工)
中断源5-15个中断向量

二、关键SFR寄存器速查

寄存器地址功能说明
ACC0xE0累加器(主要运算寄存器)
B0xF0B寄存器(乘除运算)
PSW0xD0程序状态字(标志寄存器)
SP0x81堆栈指针(栈顶地址)
DPTR82H-83H16位数据指针
P0-P380H-B0H4个并行I/O端口
TCON0x88定时器控制寄存器
TMOD0x89定时器模式寄存器
TH0/TL08CH/8AH定时器0高/低字节
TH1/TL18DH/8BH定时器1高/低字节
SCON0x98串口控制寄存器
SBUF0x99串口数据缓冲器
IE0xA8中断使能寄存器
IP0xB8中断优先级寄存器

三、Keil C51特殊语法

1. 存储类型限定符

data    // 直接寻址内部RAM(0-127字节)
idata   // 间接寻址内部RAM(0-255字节)
bdata   // 位寻址区(20H-2FH)
xdata   // 外部RAM(64KB空间)
code    // 程序存储器(64KB空间)

2. 位操作与特殊位定义

sbit LED = P1^0;      // 定义P1.0引脚为LED
sbit TR0 = TCON^4;    // 定义定时器0启动位
bit flag;             // 声明位变量

LED = 1;              // 设置引脚高电平
if(flag) {...}        // 检测位变量状态

3. 中断服务函数

void Timer0_ISR() interrupt 1  // 定时器0中断(中断号1)
{
    TH0 = 0x3C;                // 重装初值
    TL0 = 0xB0;
    // 中断处理代码
}

void UART_ISR() interrupt 4    // 串口中断(中断号4)
{
    if(RI) {
        RI = 0;                // 清除接收标志
        char c = SBUF;         // 读取接收数据
    }
}

四、常用功能代码模板

1. GPIO控制

#include <reg51.h>

void main() {
    P1 = 0xF0;          // P1高4位置1,低4位置0
    while(1) {
        P0 = ~P0;       // P0状态翻转
        for(int i=0; i<30000; i++); // 简单延时
    }
}

2. 定时器配置(模式1,16位)

void Timer0_Init() {
    TMOD &= 0xF0;       // 清空定时器0设置
    TMOD |= 0x01;       // 设置定时器0为模式1
    TH0 = 0x3C;         // 50ms初值 (12MHz)
    TL0 = 0xB0;
    ET0 = 1;            // 允许定时器0中断
    EA = 1;             // 开总中断
    TR0 = 1;           // 启动定时器0
}

3. 串口通信(9600bps)

void UART_Init() {
    SCON = 0x50;        // 模式1,允许接收
    TMOD |= 0x20;       // 定时器1模式2(自动重装)
    TH1 = 0xFD;         // 9600bps @ 11.0592MHz
    TL1 = 0xFD;
    TR1 = 1;            // 启动定时器1
    ES = 1;             // 允许串口中断
    EA = 1;             // 开总中断
}

void UART_Send(char dat) {
    SBUF = dat;         // 写入发送缓冲区
    while(!TI);         // 等待发送完成
    TI = 0;             // 清除发送标志
}

4. 外部中断

void INT0_Init() {
    IT0 = 1;            // 设置INT0为下降沿触发
    EX0 = 1;            // 允许INT0中断
    EA = 1;             // 开总中断
}

void INT0_ISR() interrupt 0 {
    // 外部中断0处理代码
}

五、调试与优化技巧

1. 内存查看

#include <absacc.h>
DBYTE[0x30] = 0xAA;     // 直接访问内部RAM 30H单元
XBYTE[0x1000] = 0x55;   // 访问外部RAM 1000H单元

2. 看门狗使用

// STC单片机看门狗示例
WDT_CONTR = 0x34;       // 使能看门狗,预分频64,约1s复位

3. 低功耗模式

PCON |= 0x01;           // 进入空闲模式
PCON |= 0x02;           // 进入掉电模式

4. 代码优化技巧

#pragma compact          // 使用紧凑模式减小代码量
#pragma small            // 默认存储模式为small
using 3                 // 指定寄存器组(0-3)

六、Keil C51常用编译指令

#pragma OT(n)            // 优化级别(0-9)
#pragma DEBUG             // 启用调试信息
#pragma NOAREGS           // 禁用绝对寄存器访问
#pragma ROM(LARGE)        // 设置存储模式

七、常见问题速查

  1. 程序不运行

    • 检查复位电路(10μF电容+10K电阻)
    • 确认晶振起振(22pF负载电容)
    • 验证EA引脚接Vcc
  2. 堆栈溢出

    • 默认栈区在内部RAM(空间有限)
    • 避免深度递归调用
    • 减少局部变量使用
  3. 中断不触发

    • 确认中断使能位(EA+EXx/ETx)
    • 检查中断触发方式(ITx)
    • 清除中断标志位

💡 开发提示

  • 使用while(TF0==0);替代软件延时提高精度
  • 关键代码用#pragma ASM/ENDASM嵌入汇编优化
  • 多使用bit类型节省内存空间
  • 定期喂狗防止意外复位

推荐工具

  • 程序下载:STC-ISP (STC单片机)
  • 串口调试:AccessPort/串口助手
  • 电路仿真:Proteus 8 Professional

将此参考卡打印为单页PDF,可快速查阅51单片机开发要点!