[toc]
普中开发板HC6800_EM3_V2.2
//功能框图:
//51单片机pinout
//stm32F103C8T6小板的pinout
//51单片机升级方法:
//如果使用普中仿真器,必须要使用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 |
| 内部RAM | 128-1024字节 |
| 特殊功能寄存器(SFR) | 128字节(可位寻址) |
| I/O引脚 | 32个(4x8位端口) |
| 定时器/计数器 | 2-3个16位定时器 |
| 串行通信 | UART(全双工) |
| 中断源 | 5-15个中断向量 |
二、关键SFR寄存器速查
| 寄存器 | 地址 | 功能说明 |
|---|---|---|
| ACC | 0xE0 | 累加器(主要运算寄存器) |
| B | 0xF0 | B寄存器(乘除运算) |
| PSW | 0xD0 | 程序状态字(标志寄存器) |
| SP | 0x81 | 堆栈指针(栈顶地址) |
| DPTR | 82H-83H | 16位数据指针 |
| P0-P3 | 80H-B0H | 4个并行I/O端口 |
| TCON | 0x88 | 定时器控制寄存器 |
| TMOD | 0x89 | 定时器模式寄存器 |
| TH0/TL0 | 8CH/8AH | 定时器0高/低字节 |
| TH1/TL1 | 8DH/8BH | 定时器1高/低字节 |
| SCON | 0x98 | 串口控制寄存器 |
| SBUF | 0x99 | 串口数据缓冲器 |
| IE | 0xA8 | 中断使能寄存器 |
| IP | 0xB8 | 中断优先级寄存器 |
三、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) // 设置存储模式
七、常见问题速查
-
程序不运行
- 检查复位电路(10μF电容+10K电阻)
- 确认晶振起振(22pF负载电容)
- 验证EA引脚接Vcc
-
堆栈溢出
- 默认栈区在内部RAM(空间有限)
- 避免深度递归调用
- 减少局部变量使用
-
中断不触发
- 确认中断使能位(EA+EXx/ETx)
- 检查中断触发方式(ITx)
- 清除中断标志位
💡 开发提示:
- 使用
while(TF0==0);替代软件延时提高精度- 关键代码用
#pragma ASM/ENDASM嵌入汇编优化- 多使用
bit类型节省内存空间- 定期喂狗防止意外复位
推荐工具:
- 程序下载:STC-ISP (STC单片机)
- 串口调试:AccessPort/串口助手
- 电路仿真:Proteus 8 Professional
将此参考卡打印为单页PDF,可快速查阅51单片机开发要点!