当前位置: 首页 > news >正文

51单片机演奏兰亭序

使用开发板为普中51-实验板 普中-2
时钟频率:11.001081MHZ
演示视频:
【51单片机演奏兰亭序】 https://www.bilibili.com/video/BV12G411D7uK/?share_source=copy_web&vd_source=0f48f7cc0fef720b95e067122ac83437

源码如下:

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

delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delayxms(unsigned int xms); //@11.0592MHz#endif
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);}
}
Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init();#endif
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;
}
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 36unsigned 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); // 每个音间隔5msTR0 = 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口}
}
http://www.lryc.cn/news/242662.html

相关文章:

  • 计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载
  • zookeeper单机版的搭建
  • roseha for windows 11+oracle 11g部署过程
  • 机器学习与因果推断的高级实践 | 数学建模
  • go语言实现高性能自定义ip管理模块(ip黑名单)
  • 检索增强生成架构详解【RAG】
  • 高清动态壁纸软件Live Wallpaper Themes 4K mac中文版功能
  • Kafka配置SASL认证密码登录
  • 两年功能五年自动化测试面试经验分享
  • 大数据基础设施搭建 - Kafka(with ZooKeeper)
  • [JVM] 京东一面~说一下Java 类加载过程
  • 2023 年 认证杯 小美赛 ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
  • N-134基于java实现捕鱼达人游戏
  • MTK联发科MT6762/MT6763/MT6765安卓核心板参数规格比较
  • 仿ChatGPT对话前端页面(内含源码)
  • js粒子效果(一)
  • 程序员必备工具篇 / 程序员必备基础:Git
  • MacBook使用指南
  • 数据库的事务的基本特性,事务的隔离级别,事务隔离级别如何在java代码中使用,使用MySQL数据库演示不同隔离级别下的并发问题
  • Robust taboo search for the quadratic assignment problem-二次分配问题的鲁棒禁忌搜索
  • Linux:创建进程 -- fork,到底是什么?
  • 基于SpringBoot+vue的token验证
  • Clickhouse设置多磁盘存储策略
  • Python开发运维:Django 4.2.7 使用Celery 5.3.5 完成异步和定时任务
  • 媒体增加日活量的有效策略
  • es6新特性总结
  • Spring Boot + hutool 创建海报图片
  • 0002Java程序设计-springboot在线考试系统小程序
  • Linux(Centos)上使用crontab实现定时任务(定时执行脚本)
  • 【Leetcode合集】20. 有效的括号