51单片机演奏兰亭序

使用开发板为普中51-实验板 普中-2

时钟频率:11.001081MHZ

演示视频:

【51单片机演奏兰亭序】 https://www.bilibili.com/video/BV12G411D7uK/?share_source=copy_web\&vd_source=0f48f7cc0fef720b95e067122ac83437

源码如下:

数组较大,请在数组前加上code关键字

c 复制代码
delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

void Delayxms(unsigned int xms); //@11.0592MHz

#endif
c 复制代码
delay.c
#include <INTRINS.H>

void Delayxms(unsigned int xms) //@11.0592MHz
{
	while (xms--)
	{
		unsigned char i, j;

		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j)
				;
		} while (--i);
	}
}
c 复制代码
Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__
 
void Timer0_Init();
 
#endif
c 复制代码
Timer0.c
#include <REGX52.H>
 
/**
 * @brief 计时器0初始化
 */
void Timer0_Init() // 1毫秒@11.0592MHz
{
	TMOD &= 0xF0; // 设置定时器模式
	TMOD |= 0x01; // 设置定时器模式
	TL0 = 0x66;	  // 设置定时初值
	TH0 = 0xFC;	  // 设置定时初值
	TF0 = 0;	  // 清除TF0标志
	TR0 = 1;	  // 定时器0开始计时
	// 配置中断
	ET0 = 1;
	EA = 1;
	PT0 = 0;
}
c 复制代码
main.c
#include <REGX52.H>
#include "delay.h"
#include "Timer0.h"

// 蜂鸣器端口
sbit Buzzer = P2 ^ 5;

#define SPEED 500 // 速度

// 音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音#
#define P 0
#define L1 1
#define L1_ 2
#define L2 3
#define L2_ 4
#define L3 5
#define L4 6
#define L4_ 7
#define L5 8
#define L5_ 9
#define L6 10
#define L6_ 11
#define L7 12
#define M1 13
#define M1_ 14
#define M2 15
#define M2_ 16
#define M3 17
#define M4 18
#define M4_ 19
#define M5 20
#define M5_ 21
#define M6 22
#define M6_ 23
#define M7 24
#define H1 25
#define H1_ 26
#define H2 27
#define H2_ 28
#define H3 29
#define H4 30
#define H4_ 31
#define H5 32
#define H5_ 33
#define H6 34
#define H6_ 35
#define H7 36

unsigned int FreqTable[] = {
    0,
    63628, 63731, 63835, 63928, 64021, 64103, 64185, 64260, 64331,
    64400, 64463, 64524, 64580, 64633, 64684, 64732, 64777, 64820,
    64860, 64898, 64934, 64968, 65000, 65030, 65058, 65085, 65110,
    65134, 65157, 65178, 65191, 65217, 65235, 65252, 65268, 65283};
// 音,结束标志:0xFF
code unsigned char Music[] = {0, 0, 0, M5, M6, H1, H2, H1, H2, H3, H2, H1, H2, H3, H5, H3, H2, H1, M6, M5, H3, H5, H6, H3, H2, H2, H1, H3, H2, H2, H1, H1, H2, H3, H2, H1, M6, M5, H2, H3, H1, 0, M5, M3, M5, M6, M3, M5, M6, M5, M3, M2, M3, 0, M3, M2, M3, H1, M6, H1, M6, M5, M3, M1, M3, M2, M2, 0, M5, M5, M5, M6, M6, H1, H2, H1, M6, M5, M6, M5, M3, M2, M5, M3, M3, M2, M1, M2, M3, M2, M1, M3, M1, M1, M1, M1, 0xFF};
// 音长,标准音为4
code unsigned char MusicTime[] = {4, 4, 2, 2, 2, 2, 8, 2, 4, 2, 2, 12, 2, 2, 8, 2, 2, 2, 2, 2, 12, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4};
unsigned char FreqSelect, MusicSelect;
void main()
{
    Timer0_Init();
    while (1)
    {
        if (Music[MusicSelect] != 0xFF)
        {
            FreqSelect = Music[MusicSelect];
            Delayxms(500 / 4 * MusicTime[MusicSelect]);
            MusicSelect++;
            TR0 = 0;     // 计时器停
            Delayxms(5); // 每个音间隔5ms
            TR0 = 1;
        }
        else
        {
            TR0 = 0;
            MusicSelect = 0;
        }
    }
}

void Timer0_Routine() interrupt 1
{
    if (FreqTable[FreqSelect])
    {
        TL0 = FreqTable[FreqSelect] % 256; // 设置定时初值
        TH0 = FreqTable[FreqSelect] / 256; // 设置定时初值
        Buzzer = !Buzzer;                  // 翻转蜂鸣器IO口
    }
}
相关推荐
2CM_Embed1 小时前
Altium Designer 原理图与 PCB 快速相互定位:Cross Probe 交叉探针
嵌入式硬件·pcb·altium designer·c2000
恒锐丰-罗生2 小时前
宽压大电流同步降压优选|CN3906 DC-DC 电源芯片,车载 / 工控 / IoT 全能供电方案
嵌入式硬件·硬件工程
happygrilclh5 小时前
STM32,串口单字节中断接受,每次上电后,会收到一个0x00的解决办法。
单片机·嵌入式硬件
智闲电子设计6 小时前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
zcmodeltech8 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
程序员与背包客_CoderZ8 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
嵌入式阿蔡9 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
天空'之城10 小时前
单片机基础核心知识点汇总(三)
单片机·嵌入式硬件
嵌入式阿蔡11 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
恒锐丰科技韩生11 小时前
率能 SS8847E|2.7~15V 双通道 H 桥电机驱动 ETSSOP16 散热封装 家电 / 打印 / 舞台灯光专用
嵌入式硬件·硬件工程