IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【51单片机】用51单片机定时器/计数器产生音乐的练习(实验报告) -> 正文阅读

[嵌入式]【51单片机】用51单片机定时器/计数器产生音乐的练习(实验报告)

1、8051单片机晶振频率为6MHz,利用T0中断产生周期20ms定时的方波,从P1.0输出点亮LED,并连接一个模拟示波器,编写C语言程序并画出Proteus仿真电路进行仿真。

#include<reg52.h>
sbit L1=P1^0;
timer0() interrupt 1 using 2{
	TH0=0xEC;
	TL0=0x78;
	L1=~L1;

}
void main(){
	TMOD=0x01;//定时器0,方式1
	TH0=0xEC;
	TL0=0x78;
	IE=0x82;
	TR0=1;
	while(1); 
}

Tips:由于要产生的是方波,所以计算初值的时候周期要除以2
在这里插入图片描述

2、利用定时器产生生日快乐歌

声音的频谱范围约在几十到几千赫兹,利用单片机定时器的定时中断功能,可以从一个I/O口线上形成一定频率的脉冲,经过滤波和功率放大,接上喇叭就能发出一定频率的声音,若再利用延时程序控制输出脉冲的频率来改变音调,即可实现音乐发生器功能。

要让单片机产生音频脉冲,只要计算出某一音频的周期,在将此周期除以2得到半周期,利用定时器对此半周期进行定时,每当定时时间到,将某个I/O口线上的电平取反,从而在I/O口线上得到所需要的音频脉冲。

例如中音DO的频率为523Hz,若单片机工作频率为12MHz,定时器T0设置为工作方式1,按公式计算得定时器初值为64580;高音DO的频率为1047Hz,计算得定时器初值为65058。

例如一段延时程序DELAY为1/4拍,则1拍只要调用4次DELAY程序,依此类推。

编写音乐程序时,先把乐谱的音符找出,按表建立对应的简谱码及定时器初值表,按表建立节拍码表。每个音符使用1个字节,字节的高4位存放音符的高低,低4位存放音符的节拍。“生日快乐”乐谱如下:
|5.5 6 5|1 7 -||5.5 6 5|2 1 -|5.5 5 3|1 7 6|4.4 3 1|2 1 -|
请设计乐谱对应的音符节拍码表和音符对应的定时器的初值表。

按照上述原理编写出“生日快乐”乐曲的C语言程序。
使用Proteus仿真电路进行仿真,点击Play按钮执行程序,从计算机的音箱中听到“生日快乐”乐曲。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char 
#define uint unsigned int
sbit BEEP=P1^0;						//定义喇叭输出端口
uchar tick,tl,th;					//定义节拍和TO初值变量
uchar TABLE[]={						//音符节拍码表
	0x82, 0x01, 0x81, 0x94, 0x84, 0xB4, 0xA4, 0x04,
	0x82, 0x01, 0x81, 0x94, 0x84, 0xC4, 0xB4, 0x04,
	0x82, 0x01, 0x81, 0xF4, 0xD4, 0xB4, 0xA4, 0x94,
	0xE2, 0x01, 0xE1, 0xD4, 0xB4, 0xC4, 0xB4, 0x04,
	0x82, 0x01, 0x81, 0x94, 0x84, 0xB4, 0xA4, 0x04,
	0x82, 0x01, 0x81, 0x94, 0x84, 0xC4, 0xB4, 0x04,
	0x82, 0x01, 0x81, 0xF4, 0xD4, 0xB4, 0xA4,0x94,
	0xE2, 0x01, 0xE1, 0xD4, 0xB4, 0xC4, 0xB4, 0x04,
	0x00};
uchar TABLE1[]={					//音符对应的定时器初值表
	0xfb, 0x04, 0xfb, 0x90, 0xfc, 0x09, 0xfc,0x44,
	0xfc, 0xac, 0xfd, 0x09, 0xfd, 0x34,0xfd, 0x82,
	0xfd, 0xc8, 0xfe, 0x06, 0xfe, 0x22,0xfe, 0x56,
	0xfe, 0x85, 0xfe, 0x9a, 0xfe, 0xc1};
					/*TO中断服务函数*/
timer0 ()interrupt 1 using 1{ 				//重装定时初值
	TL0=tl; TH0=th;
	BEEP=~ BEEP;}							//喇叭输出端口电平取反
	
void delay1 () {
	uint i;
	for(i=0;i<20000;i++);
	}
	void delay(tt) {
	uchar i;
	for(i=0;i<=tt;i++) delay1();
	}
						/*主函数*/
	void main(){
	uchar t,t1,k=0;							//定义临时变量
	while(1) {
	TMOD=0x01; IE=0x82;						//定义T0工作方式,开中断
	while (TABLE[k]!=0) {					//判断取得的音符节拍码是否为结束码
		tick= (TABLE[k]) &0x0f;				//不是,则取节拍码0[81-8阅)
		t=(_crol_(TABLE[k],4))&0x0f; 		//取音符码
	if(t!=0){								//判断取得的音符码是否为0
		t1=--t*2+1;							//不是,则根据取得的音符码计算TO初值
		t=t*2;
		tl=TL0=TABLE1[t1];
		th=TH0=TABLE1[t];
		TR0=1;								//启动T0
		}
	else TR0=0;								//取得的音符码为0,则停止TO 
	delay(tick);							//根据则取得的节拍码延时
	k++;
			}
	TR0=0;									//取得结束码,则停止TO
		}
	}

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:47:09  更:2021-11-19 17:47:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:51:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码