1.功能需求


2.硬件

三、Keil 工程配置说明(2MHz 晶振)
1. 新建工程
-
打开 Keil uVision
-
Project → New uVision Project
-
选择保存路径,输入项目名称(如 Timer0_2MHz)
2. 选择 CPU 型号
推荐选择以下任一型号(均可正常运行):
-
AT89C52(Atmel / Microchip)
-
STC89C52RC
-
DS89C420
-
或任何标准 8052 兼容芯片
3. 添加汇编源文件
-
右键 Source Group 1 → Add New Item → 选择 Assembly File (.asm)
-
命名为 main.asm
-
将上一轮回复中的完整汇编代码复制进去
4. 关键配置:晶振频率 ⭐
-
点击 Target 1 图标(或 Project → Options for Target 'Target 1')
-
切换到 Target 标签页
-
在 Xtal (MHz) 输入框中填写:2
![设置示意]
text
Xtal (MHz): [2 ]
5. 输出 HEX 文件
-
同窗口切换到 Output 标签页
-
勾选 Create HEX File
-
可选:勾选 Create Batch File
6. 编译与烧录
-
按 F7 或点击 Build 按钮
-
编译成功后生成 .HEX 文件
-
使用编程器(如 STC-ISP、TL866、CH341 等)烧录到单片机
7. 仿真调试(可选)
-
如果不需要硬件,可用 Keil 自带的软件仿真
-
点击 Start/Stop Debug Session(Ctrl+F5)
-
在 View → Watch Window 中添加变量 TICK
-
在 View → Logic Analyzer 中观察 P1.7、P3.7 波形
完整可编译程序(2MHz 晶振)
$MOD52
;——————————————————————————-
; 数据段定义
DSEG AT 30H
TICK: DS 1 ; 10ms 计数器 (0-99)
;——————————————————————————-
; 代码段
CSEG AT 0
LJMP MAIN ; 复位入口
ORG 000BH ; Timer0 中断向量
LJMP TIMER0_ISR
;——————————————————————————-
; 主程序
CSEG AT 100H
MAIN:
; 初始化堆栈
MOV SP, #60H
; 初始化 I/O 口
MOV P1, #0FFH ; P1 口设为输入 / 高电平输出
MOV P3, #0FFH ; P3 口初始高电平
; 初始化变量
MOV TICK, #0
; 初始化 Timer0 (16位定时器模式)
MOV TMOD, #01H ; Timer0, 模式1 (16位)
; 定时初值: 2MHz 晶振, 10ms 中断
; 机器周期 = 6µs, 需要 1667 个机器周期
; 初值 = 65536 – 1667 = 63869 = 0xF97D
MOV TH0, #0F9H
MOV TL0, #07DH
; 开启中断
SETB ET0 ; 允许 Timer0 中断
SETB EA ; 总中断允许
SETB TR0 ; 启动 Timer0
; 主循环:空闲等待中断
SJMP $
;——————————————————————————-
; Timer0 中断服务程序 (每 10ms 执行一次)
TIMER0_ISR:
PUSH ACC
PUSH PSW
; 重装 Timer0 初值 (10ms @ 2MHz)
MOV TH0, #0F9H
MOV TL0, #07DH
; 1. 产生 P3.7 低脉冲 (触发 Z80 中断)
CLR P3.7
NOP ; 短暂延时 (6µs)
NOP ; 又一个延时 (6µs)
SETB P3.7
; 2. 更新 TICK 计数器
MOV A, TICK
INC A
MOV TICK, A
CJNE A, #100, ISR_EXIT ; 是否到达 1 秒?
; 3. 每 1 秒执行一次:P1.7 输出约 30 周期低脉冲
MOV TICK, #0 ; 重置计数器
CLR P1.7 ; 拉低 P1.7
MOV R7, #30
DJNZ R7, $ ; 延时约 30 个机器周期 (180µs)
SETB P1.7 ; 拉高 P1.7
ISR_EXIT:
POP PSW
POP ACC
RETI
;——————————————————————————-
END


