1.功能需求
![]()
![]()
2.硬件
![]()
3.完整可编译程序(2MHz 晶振)
#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) { // 可在此添加其他任务 } }
![]()