MTK8088单板机制作(五)10ms定时器生成器 C语言版

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) {
        // 可在此添加其他任务
    }
}