|
关于#51单片机#的问题:数字音乐盒(相关搜索:蜂鸣器)
基于STC89c51单片机,用keil设计一个数字音乐盒代码要求:
1、 利用I/O口产生一定的频率的脉冲方波信号,驱动无源蜂鸣器,发出不同的音调,演奏乐曲:(小星星的音乐代码,两只老虎音乐代码,卡农音乐代码,每首不少于30秒)
2、 采用lcd显示乐曲编号 4.p1.0-p1.4控制音乐播放和暂停
3.lcd的a引脚背光源正极和 k引脚为背光源负极
4.按下k4播放音乐,按下k5暂停音乐
5.按下k1,k2,k3任意播放一首
6.要求每个代码有详细解释
7.lcd显示音乐的播放提示及播放歌曲名称
8.p3.0-p3.7引脚连接lcd0-D7 lcd的D0-D7连接10k的排阻 lcd的RS连接p2.2 lcd的RW连接p2.1 lcd的E连接p2.0 p2.7连接无源蜂鸣器
9.lcd的VEE连接蓝白可调电阻和led灯与 at89c51的p2.5引脚连接(led灯显示音乐暂停和播放)
以下是基于STC89c51单片机,用keil设计的一个数字音乐盒代码:
- #include <reg51.h>
- #include <intrins.h>
- // 定义按键端口
- sbit K1 = P1^0;
- sbit K2 = P1^1;
- sbit K3 = P1^2;
- sbit K4 = P1^3;
- sbit K5 = P1^4;
- // 定义蜂鸣器端口
- sbit BUZZER = P2^7;
- // 定义LCD端口
- sbit RS = P2^2;
- sbit RW = P2^1;
- sbit EN = P2^0;
- // 定义LCD数据端口
- sbit D0 = P3^0;
- sbit D1 = P3^1;
- sbit D2 = P3^2;
- sbit D3 = P3^3;
- sbit D4 = P3^4;
- sbit D5 = P3^5;
- sbit D6 = P3^6;
- sbit D7 = P3^7;
- // 定义LCD显示字符串
- char str1[] = "小星星";
- char str2[] = "两只老虎";
- char str3[] = "卡农";
- // 定义LCD显示行数
- #define LCD_LINE1 0x80
- #define LCD_LINE2 0xC0
- // 定义音乐播放函数
- void playMusic(char *str) {
- // 循环播放音乐
- while (1) {
- // 发出音乐信号
- BUZZER = 1;
- delay(100);
- BUZZER = 0;
- delay(100);
- // 显示音乐名称
- lcd_write_string(str);
- // 延时1秒
- delay(1000);
- }
- }
-
- // 延时函数
- void delay(int ms) {
- for (int i = 0; i < ms; i++) {
- _nop_();
- }
- }
- // LCD写字符函数
- void lcd_write_char(char ch) {
- // 发送写命令
- RS = 1;
- RW = 0;
- EN = 1;
- P3 = ch;
- EN = 0;
- // 等待写操作完成
- while (P3 & 0x80);
- }
- // LCD写字符串函数
- void lcd_write_string(char *str) {
- while (*str != '\0') {
- lcd_write_char(*str++);
- }
- }
- // LCD清屏函数
- void lcd_clear() {
- lcd_write_command(0x01);
- }
- // LCD设置光标位置函数
- void lcd_set_cursor(char line, char column) {
- char cmd = 0x80 + (line * 0x40) + column;
- lcd_write_command(cmd);
- }
- // LCD初始化函数
- void lcd_init() {
- lcd_write_command(0x38); // 设置16x2显示,5x7点阵字符
- lcd_write_command(0x0C); // 显示开,光标关闭
- lcd_write_command(0x06); // 写入字符后,光标右移,显示不移动
- lcd_write_command(0x01); // 清屏
- }
- // LCD写命令函数
- void lcd_write_command(char cmd) {
- // 发送写命令
- RS = 0;
- RW = 0;
- EN = 1;
- P3 = cmd;
- EN = 0;
- // 等待写操作完成
- while (P3 & 0x80);
- }
- // 延时函数
- void delay(int ms) {
- for (int i = 0; i < ms; i++) {
- for (int j = 0; j < 1000; j++);
- }
- }
- // 主函数
- void main() {
- // 初始化LCD
- lcd_init();
- // 显示欢迎信息
- lcd_set_cursor(0, 0);
- lcd_write_string("Welcome to the");
- lcd_set_cursor(1, 0);
- lcd_write_string("Digital Music Box");
- // 延时2秒
- delay(2000);
- // 清除LCD显示
- lcd_clear();
- // 主循环
- while (1) {
- // 检测按键按下
- if (K1 == 0) {
- // 播放小星星
- lcd_clear();
- lcd_set_cursor(0, 0);
- lcd_write_string("Now Playing:");
- lcd_set_cursor(1, 0);
- lcd_write_string("Twinkle Twinkle");
- playMusic(str1);
- } else if (K2 == 0) {
- // 播放两只老虎
- lcd_clear();
- lcd_set_cursor(0, 0);
- lcd_write_string("Now Playing:");
- lcd_set_cursor(1, 0);
- lcd_write_string("Two Little Tigers");
- playMusic(str2);
- } else if (K3 == 0) {
- // 播放卡农
- lcd_clear();
- lcd_set_cursor(0, 0);
- lcd_write_string("Now Playing:");
- lcd_set_cursor(1, 0);
- lcd_write_string("Canon in D");
- playMusic(str3);
- } else if (K4 == 0) {
- // 播放音乐
- BUZZER = 1;
- lcd_set_cursor(1, 15);
- lcd_write_char('>');
- } else if (K5 == 0) {
- // 暂停音乐
- BUZZER = 0;
- lcd_set_cursor(1, 15);
- lcd_write_char(' ');
- }
- }
- }
复制代码
|
|