1.功能需求


2.硬件

3.完整可编译程序(2MHz 晶振)
cpp
#include <reg52.h>
#include <intrins.h>
// 10ms 中断计数器
volatile unsigned char tick = 0;
// 位定义
sbit Z80_INT = P3^7; // 触发 Z80 中断
sbit PULSE_OUT = P1^7; // 1秒脉冲输出
// 简单延时函数(机器周期级延时)
void delay_cycles(unsigned char n) {
while (n--) {
_nop_(); // 空操作,1个机器周期
}
}
// Timer0 中断服务程序(每 10ms 自动调用)
void timer0_isr(void) interrupt 1 {
// 1. 重装初值:10ms @ 2MHz(机器周期 6μs)
TH0 = 0xF9;
TL0 = 0x7D;
// 2. 产生 P3.7 低脉冲(触发 Z80)
Z80_INT = 0;
delay_cycles(2); // 约 12μs 低电平
Z80_INT = 1;
// 3. 更新秒计数器
tick++;
// 4. 每满 100 次(1秒)执行一次动作
if (tick >= 100) {
tick = 0;
// P1.7 输出低脉冲,宽度约 180μs(30个机器周期)
PULSE_OUT = 0;
delay_cycles(30);
PULSE_OUT = 1;
}
}
void main(void) {
// 初始化 I/O 口
P1 = 0xFF;
P3 = 0xFF;
// 初始化 Timer0:16位定时器模式
TMOD = 0x01;
// 初值:65536 - 1667 = 63869 = 0xF97D
TH0 = 0xF9;
TL0 = 0x7D;
// 开启中断
ET0 = 1; // Timer0 中断允许
EA = 1; // 总中断允许
// 启动定时器
TR0 = 1;
// 主循环:空闲等待中断
while (1) {
// 可在此添加其他任务
}
}
