永发信息网

求一个能是单片机AT89C2051,P1.7口输出的,蜂鸣器音乐程序

答案:1  悬赏:20  手机版
解决时间 2021-04-14 12:34
求一个能是单片机AT89C2051,P1.7口输出的,蜂鸣器音乐程序
最佳答案
#include <reg52.h>
sbit speaker = P1^7;
unsigned char timer0h, timer0l, time;
//--------------------------------------
//单片机晶振采用11.0592MHz
// 频率-半周期数据表高八位 本软件共保存了四个八度的28个频率数据
code unsigned char FREQH[] = {
0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567

// 频率-半周期数据表 低八位
code unsigned char FREQL[] = {
0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
//--------------------------------------
//世上只有妈妈好数据表 要想演奏不同的乐曲, 只需要修改这个数据表
code unsigned char sszymmh[] = {
6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1,
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};
//--------------------------------------

void t0int() interrupt 1 //T0中断程序,控制发音的音调
{
TR0 = 0; //先关闭T0
speaker = !speaker; //输出方波, 发音
TH0 = timer0h; //下次的中断时间, 这个时间, 控制音调高低
TL0 = timer0l;
TR0 = 1; //启动T0
}
//--------------------------------------
void delay(unsigned char t) //延时程序,控制发音的时间长度
{
unsigned char t1;
unsigned long t2;
for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍
for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音
TR0 = 0; //关闭T0, 停止发音
}
//--------------------------------------
void song() //演奏一个音符
{
TH0 = timer0h; //控制音调
TL0 = timer0l;
TR0 = 1; //启动T0, 由T0输出方波去发音
delay(time); //控制时间长度
}
//--------------------------------------
void main(void)
{
unsigned char k, i;
TMOD = 1; //置T0定时工作方式1
ET0 = 1; //开T0中断
EA = 1; //开CPU中断
while(1) {
i = 0;
time = 1;
while(time) {
k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;
//第i个是音符, 第i+1个是第几个八度
timer0h = FREQH[k]; //从数据表中读出频率数值
timer0l = FREQL[k]; //实际上, 是定时的时间长度
time = sszymmh[i + 2]; //读出时间长度数值
i += 3;
song(); //发出一个音符
} } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐几部悲伤的小说(或电视剧)
龙脊套装要多少万?
以'读名著'为主题写一篇作文.不限
nokia n81 8G版的在那里插内存卡的
利用胡萝卜根的组织或细胞繁殖后代的方法属于
恩施六城同创标语,怎样写对两城同创的祝福语
键盘几个键突然失灵
音频怪物的假面与什么歌旋律相同
夏风宾馆地址在哪,我要去那里办事
在宿舍怎么存放衬衫
跪求一首送小孩的古体诗。
社会上流行的趣味话题有哪些?
从泰兴汽车客运站到天津火车站有汽车么
学完初中可以考师范学校吗?
大学生贷款有什么要求,手机贷需要什么条件
推荐资讯
有什么好听些的歌曲?
连贵农技综合服务部这个地址在什么地方,我要
上海青浦华新模具厂有哪些
介绍一下有什么便宜又好用的品牌手机
DNF最好用的G是那个???
开车的时候前面横着一条蛇刹车不及辗过去了是
单选题下列各句中加粗的词语古今意义不同的一
黑色的高三生活,要怎样调节?
单选题下列表述不正确的一项A.《我的叔叔于勒
OKWAP C310Java MIDP 2.0 手机QQ?
历届奥运会开幕式都要举行颇为隆重的“火炬接
一般卡车有什么型号的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?