- #include <reg52.h>
- // 定义三个音符的定时器重载值(12MHz晶振)
- #define C4_HALF_PERIOD (65536 - (12000000 / (261.63 * 12 * 2))) // C4
- #define E4_HALF_PERIOD (65536 - (12000000 / (329.63 * 12 * 2))) // E4
- #define G4_HALF_PERIOD (65536 - (12000000 / (392.00 * 12 * 2))) // G4
- // 引脚定义
- sbit PIN_C = P1^0;
- sbit PIN_E = P1^1;
- sbit PIN_G = P1^2;
- // 计数器变量
- volatile unsigned int cnt_C = 0, cnt_E = 0, cnt_G = 0;
- // 初始化定时器0(16位模式)
- void Timer0_Init() {
- TMOD |= 0x01; // 模式1
- TH0 = 0xFF; // 初始值(快速触发首次中断)
- TL0 = 0xFF;
- ET0 = 1; // 使能中断
- EA = 1; // 全局中断
- TR0 = 1; // 启动定时器
- }
- // 定时器0中断服务函数
- void Timer0_ISR() interrupt 1 {
- TH0 = 0xFF; // 重载初始值(短周期)
- TL0 = 0xFF;
- // 生成C4方波
- cnt_C++;
- if (cnt_C >= C4_HALF_PERIOD) {
- cnt_C = 0;
- PIN_C = !PIN_C; // 翻转电平
- }
- // 生成E4方波
- cnt_E++;
- if (cnt_E >= E4_HALF_PERIOD) {
- cnt_E = 0;
- PIN_E = !PIN_E;
- }
- // 生成G4方波
- cnt_G++;
- if (cnt_G >= G4_HALF_PERIOD) {
- cnt_G = 0;
- PIN_G = !PIN_G;
- }
- }
- void main() {
- Timer0_Init();
- while (1); // 主循环保持运行
- }
- const float chord_major[3] = {261.63, 329.63, 392.00}; // C大调
- const float chord_minor[3] = {261.63, 311.13, 392.00}; // C小调
- if (timer1_count >= 1000) { // 播放1秒后停止
- TR0 = 0; // 关闭定时器0
- P1 = 0x00; // 关闭所有引脚
- }
|