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