MCU型号    STC 89C52RC

#include

#define RldTmr(fr) 65536 - (11059200 / 12) / (fr << 1)

#define FuDian(n) (n << 1) / 3 //附点n分音符的换算

typedef unsigned char UCHAR;

typedef unsigned int UINT;

typedef unsigned long ULONG;

sbit BUZZ = P1^6;

UINT code noteFreq[] = { //中音 1-7 和高音 1-7对应的频率列表

523, 587, 659, 698, 784, 880, 988,

1047, 1175, 1319, 1397, 1568, 1760, 1976

};

UINT code tmrRld[] = { //中音 1-7 和高音 1-7对应的定时器重载值

RldTmr(523), RldTmr(587), RldTmr(659), RldTmr(698), RldTmr(784), RldTmr(880), RldTmr(988),

RldTmr(1047), RldTmr(1175), RldTmr(1319), RldTmr(1397), RldTmr(1568), RldTmr(1760), RldTmr(1976),

};

UCHAR code musicNote[] = { //音名

1, 2, 3, 1,

1, 2, 3, 1,

3, 4, 5,

3, 4, 5,

5, 6, 5, 4, 3, 1,

5, 6, 5, 4, 3, 1,

1, 5, 1,

1, 5, 1

};

UCHAR code noteDuration[] = { //音名对应的时值,4表示4分音符,8表示8分音符,16表示16分音符

4, 4, 4, 4,

4, 4, 4, 4,

4, 4, 2,

4, 4, 2,

FuDian(8), 16, FuDian(8), 16, 4, 4,

FuDian(8), 16, FuDian(8), 16, 4, 4,

4, 4, 2,

4, 4, 2

};

bit enable = 1, tmrFlg = 0;

UCHAR T0RH = 0XFF, T0RL = 0X00;

void Delay(UINT n);

void PlayMusic(UCHAR speed); //固定标准为4分音符的速度:例如speed = 108 表示一分钟扫过108个4分音符

void main() {

EA = 1;

TMOD = 0X01;

TH0 = T0RH;

TL0 = T0RL;

ET0 = 1;

TR0 = 1;

while (1) {

PlayMusic(72);

Delay(40000u);

}

}

void Delay(UINT n) {

UINT i;

for (i = 0; i < n; i++) ;

}

void PlayMusic(UCHAR speed) {

UCHAR i;

UCHAR idx;

UINT cnt = 0;

UINT durationCnt = 0;//当前音符的时值对应的定时器计数

UINT soundCnt = 0;//当前音符的发声时值对应的计数值

for (i = 0; i < sizeof (musicNote); ) {

while (!tmrFlg) ;

tmrFlg = 0;

if (cnt == 0) {

idx = musicNote[i] - 1;

T0RH = tmrRld[idx] >> 8;

T0RL = tmrRld[idx];

durationCnt = (ULONG)240 * (ULONG)noteFreq[idx] / ((ULONG)noteDuration[i] * (ULONG)speed);

soundCnt = durationCnt - (durationCnt >> 2);//当前音符时值的前3/4发声,后1/4静音

enable = 1;

cnt++;

}

else {

if (cnt == durationCnt) {

cnt = 0;

i++;

}

else {

cnt++;

if (cnt == soundCnt) {

enable = 0;

}

}

}

}

}

void InterruptTmr0() interrupt 1 {

TH0 = T0RH;

TL0 = T0RL;

tmrFlg = 1;

if (enable)

BUZZ = ~BUZZ;

else

BUZZ = 1;

}

单片机蜂鸣器音乐c语言程序,51单片机 使用蜂鸣器播放简单音乐相关推荐

  1. 单片机汉字点阵c语言程序,51单片机C语言多种点阵屏驱动程序(开发软件为keil C...

    51单片机C语言多种点阵屏驱动程序(开发软件为keil C 2016-08-23 1 0 0 暂无评分 其他 1 积分下载 如何获取积分? 51单片机C语言多种点阵屏驱动程序(开发软件为keil C ...

  2. 单片机 中断秒表 c语言程序,51单片机c语言的秒表设计.doc

    51单片机c语言的秒表设计.doc 课程设计报告 基于AT89C51单片机的秒表设计 院 系 电子信息工程学院 专 业 电子信息工程 1 姓 名 摘 要 本设计是设计一个单片机控制的多功能秒表系统. ...

  3. 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)

    EA     是 中断总开关, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断; ET0   是 定时器0 的专用中断开关, 也就是说: 打开了EA.而不打开ET0,定时器0是无法触发 ...

  4. 单片机卡农c语言程序,51单片机用蜂鸣器演奏卡农

    ORG 0000H LJMP START ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH ;12M晶振,形成10毫秒中断 RET ...

  5. 单片机 中断秒表 c语言程序,51单片机秒表C程序

    本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52:电路找到相应部分即可.这是一整个单片机开发板的电路图其他的忽略. 本程序的keil工程下载: http://www.51hei.c ...

  6. 8255A红绿灯c语言程序,51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序).doc...

    51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序) 51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序)2010-04-21 22:0 ...

  7. 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...

    <51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...

  8. 单片机交通灯数码管c语言程序,51单片机C语言实现交通灯(红绿灯)源程序.doc

    51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /*1.程序目的:使用定 ...

  9. 单片机交通灯灯c语言程序,51单片机用C语言实现交通灯(红绿灯)源程序

    51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /* 1.程序目的:使用 ...

  10. 超声波c语言程序,51单片机超声波模块的C语言程序.doc

    51单片机超声波模块的C语言程序.doc 超声波模块程序 超声波模块程序 Trig P20 Echo P32 include define uchar unsigned char define uin ...

最新文章

  1. 怎样在javascript函数中将变量传递给服务端脚本程序?
  2. EOS之记事本智能合约
  3. java 在数组末尾添加元素_Java集合05——LinkedList
  4. WeQuant交易策略—简单均线
  5. DCMTK:读取DICOM图像,并使用设置创建PGM位图
  6. 机器学习 数据模型_使用PyCaret将机器学习模型运送到数据—第二部分
  7. 安装并配置ROS环境
  8. 计算机等级考试模拟题卷子,二级VB模拟试卷 1
  9. htonl(), ntohl(), htons(), ntohs() 函数
  10. salt 启动mysql_saltsack自动化配置day03:服务部署mysql部署
  11. kotlin 用协程做网络请求_中国电信营业厅: 感受 Kotlin 的 quot;加速度quot;
  12. 动态添加表格点击事件
  13. 聊聊我所从事过的通信行业
  14. 地图制图基础(二):地图内容
  15. 函数调用中的堆栈平衡
  16. 富文本编辑器ueditor 自定义工具栏配置
  17. 电气潮流运算Matlab怎么编程,基于Matlab的电力系统潮流编程计算
  18. 计算机网络重要知识点
  19. mysql 竖线_为什么MySQL拒绝在INSERT INTO字符串中使用竖线('|')字符?
  20. 一文了解 NextJS 并对性能优化做出最佳实践

热门文章

  1. wps linux版本支持vba,Wps vba安装包
  2. 2009年:国内常见的PKM工具软件介绍
  3. 老主板BIOS不识别nvem固态硬盘,修改BIOS添加nvme驱动
  4. LaTeX伪代码写法总结
  5. 北斗导航 | RAIM算法之奇偶矢量法(原理讲解,附代码链接:可用性判定)
  6. 64位 mxcomponent_三菱MX Component 4.16S下载
  7. 股票数据下载-下载股票历史数据
  8. 关于软件项目管理的一些问题
  9. 啊哈c语言第四章 pdf,啊哈!算法 PDF扫描版[73MB]
  10. FPGA定点数字信号处理技巧(一)