七个音阶的单片机汇编语言
时间: 2023-10-18 15:04:38 浏览: 52
以下是一个简单的七个音阶的单片机汇编语言程序,使用的是8051微控制器:
```
ORG 0000H ;程序起始地址
MOV P1, #0FFH ;配置P1口为输出状态
LOOP: ;主程序循环
MOV P1, #7FH ;发出Do音
ACALL DELAY ;延时
MOV P1, #3FH ;发出Re音
ACALL DELAY ;延时
MOV P1, #1FH ;发出Mi音
ACALL DELAY ;延时
MOV P1, #0FH ;发出Fa音
ACALL DELAY ;延时
MOV P1, #07H ;发出So音
ACALL DELAY ;延时
MOV P1, #03H ;发出La音
ACALL DELAY ;延时
MOV P1, #01H ;发出Si音
ACALL DELAY ;延时
SJMP LOOP ;回到主程序循环
DELAY: ;延时子程序
MOV R7, #20H ;设置延时计数器
DELAY_LOOP: ;延时循环
DJNZ R7, DELAY_LOOP ;减少计数器
RET ;返回主程序
```
这个程序通过设置P1口的输出状态,依次发出Do、Re、Mi、Fa、So、La、Si七个音阶,并且使用一个简单的延时子程序来控制每个音阶之间的暂停时间。循环执行主程序,直到程序被停止。
相关问题
汇编语言C大调电子琴程序,用51单片机 汇编语言 做简单的电子琴
这是一个简单的汇编语言C大调电子琴程序,使用51单片机。
```
ORG 0000H ; 定义程序起始地址
MOV P0, #0FFH ; 将P0口设为输出
MAIN:
MOV A, P1 ; 读取P1口状态
CJNE A, #1, MAIN ; 如果P1口没有按键则继续等待
MOV A, P1 ; 读取P1口状态
ANL A, #0FH ; 只取低4位
MOV P0, A ; 输出到P0口
CALL PLAY_NOTE ; 播放音符
JMP MAIN ; 继续等待按键
PLAY_NOTE:
PUSH ACC ; 保存ACC寄存器
PUSH PSW ; 保存PSW寄存器
MOV A, P1 ; 读取按键状态
ANL A, #0FH ; 只取低4位
CPL A ; 取反
ADD A, #1 ; 加1
MOV R0, A ; 存储音符编号
MOV A, R0 ; 读取音符编号
MOV R1, A ; 存储到R1寄存器
MOV A, #0FFH ; 发送高电平到蜂鸣器
MOV P0, A ; 输出到P0口
MOV A, R1 ; 读取音符编号
CJNE A, #01H, NOT_C ; 如果不是C,则跳转到NOT_C
MOV R2, #38H ; C3
JMP PLAY
NOT_C:
CJNE A, #02H, NOT_D ; 如果不是D,则跳转到NOT_D
MOV R2, #34H ; D3
JMP PLAY
NOT_D:
CJNE A, #03H, NOT_E ; 如果不是E,则跳转到NOT_E
MOV R2, #30H ; E3
JMP PLAY
NOT_E:
CJNE A, #04H, NOT_F ; 如果不是F,则跳转到NOT_F
MOV R2, #2CH ; F3
JMP PLAY
NOT_F:
CJNE A, #05H, NOT_G ; 如果不是G,则跳转到NOT_G
MOV R2, #28H ; G3
JMP PLAY
NOT_G:
CJNE A, #06H, NOT_A ; 如果不是A,则跳转到NOT_A
MOV R2, #24H ; A3
JMP PLAY
NOT_A:
CJNE A, #07H, NOT_B ; 如果不是B,则跳转到NOT_B
MOV R2, #20H ; B3
JMP PLAY
NOT_B:
CJNE A, #08H, NOT_C_2 ; 如果不是C,则跳转到NOT_C_2
MOV R2, #1CH ; C4
JMP PLAY
NOT_C_2:
CJNE A, #09H, NOT_D_2 ; 如果不是D,则跳转到NOT_D_2
MOV R2, #18H ; D4
JMP PLAY
NOT_D_2:
CJNE A, #0AH, NOT_E_2 ; 如果不是E,则跳转到NOT_E_2
MOV R2, #14H ; E4
JMP PLAY
NOT_E_2:
CJNE A, #0BH, NOT_F_2 ; 如果不是F,则跳转到NOT_F_2
MOV R2, #10H ; F4
JMP PLAY
NOT_F_2:
CJNE A, #0CH, NOT_G_2 ; 如果不是G,则跳转到NOT_G_2
MOV R2, #0CH ; G4
JMP PLAY
NOT_G_2:
CJNE A, #0DH, NOT_A_2 ; 如果不是A,则跳转到NOT_A_2
MOV R2, #08H ; A4
JMP PLAY
NOT_A_2:
CJNE A, #0EH, NOT_B_2 ; 如果不是B,则跳转到NOT_B_2
MOV R2, #04H ; B4
JMP PLAY
NOT_B_2:
MOV R2, #00H ; 没有按键,静音
PLAY:
MOV A, R2 ; 读取音符频率
MOV R3, A ; 存储到R3寄存器
MOV A, #0 ; 清空ACC寄存器
MOV B, #1 ; 设置B为1
LOOP:
DJNZ B, LOOP ; 延时
MOV A, R3 ; 读取音符频率
XRL P0, #0FFH ; 取反输出
DJNZ ACC, LOOP ; 延时
POP PSW ; 恢复PSW寄存器
POP ACC ; 恢复ACC寄存器
RET ; 返回
```
该程序使用P1口读取按键状态,将按键编号转换为音符频率,并通过P0口输出音符信号。该程序只支持C大调音阶,如果需要支持其他音阶,需要修改对应的音符频率。
蜂鸣器发出7种音阶编程单片机
要让单片机控制蜂鸣器发出7种音阶,可以通过控制蜂鸣器的频率来实现。以下是一个基于51单片机的简单示例代码,可以让蜂鸣器发出C、D、E、F、G、A、B这七个音符:
```
#include <reg52.h> // 包含51单片机的头文件
#define C 262 // 定义C音符频率
#define D 294 // 定义D音符频率
#define E 330 // 定义E音符频率
#define F 349 // 定义F音符频率
#define G 392 // 定义G音符频率
#define A 440 // 定义A音符频率
#define B 494 // 定义B音符频率
sbit buzzerPin = P1^5; // 蜂鸣器引脚
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void main()
{
while(1)
{
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xFC; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xF4; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xE8; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xDD; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xC9; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xBE; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xB4; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
buzzerPin = 1; // 将蜂鸣器引脚设置为高电平
TMOD = 0x01; // 将定时器0设为模式1
TH0 = 0xFF; // 设置定时器0的初值
TL0 = 0xA1; // 设置定时器0的初值
TR0 = 1; // 启动定时器0
while(!TF0); // 等待定时器0溢出
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除定时器0的溢出标志位
buzzerPin = 0; // 将蜂鸣器引脚设置为低电平
delay(200); // 延时200毫秒
}
}
```
这个程序中使用了`TMOD`和`TH0`、`TL0`寄存器来控制定时器0的模式和初值,通过不同的初值和延时时间的组合,实现了蜂鸣器发出7种音阶的效果。可以根据需要修改频率和延时时间,来达到不同的音效。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)