请选择 进入手机版 | 继续访问电脑版
天气与日历 切换到窄版

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 130|回复: 0

[C++源码] 关于#51单片机#的问题:数字音乐盒(相关搜索:蜂鸣器)

[复制链接]

2972

主题

4

回帖

3054

积分

管理员

积分
3054
发表于 2024-3-23 20:38:42 | 显示全部楼层 |阅读模式
关于#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设计的一个数字音乐盒代码:

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. // 定义按键端口
  4. sbit K1 = P1^0;
  5. sbit K2 = P1^1;
  6. sbit K3 = P1^2;
  7. sbit K4 = P1^3;
  8. sbit K5 = P1^4;
  9. // 定义蜂鸣器端口
  10. sbit BUZZER = P2^7;
  11. // 定义LCD端口
  12. sbit RS = P2^2;
  13. sbit RW = P2^1;
  14. sbit EN = P2^0;
  15. // 定义LCD数据端口
  16. sbit D0 = P3^0;
  17. sbit D1 = P3^1;
  18. sbit D2 = P3^2;
  19. sbit D3 = P3^3;
  20. sbit D4 = P3^4;
  21. sbit D5 = P3^5;
  22. sbit D6 = P3^6;
  23. sbit D7 = P3^7;
  24. // 定义LCD显示字符串
  25. char str1[] = "小星星";
  26. char str2[] = "两只老虎";
  27. char str3[] = "卡农";
  28. // 定义LCD显示行数
  29. #define LCD_LINE1 0x80
  30. #define LCD_LINE2 0xC0
  31. // 定义音乐播放函数
  32. void playMusic(char *str) {
  33.   // 循环播放音乐
  34.   while (1) {
  35.     // 发出音乐信号
  36.     BUZZER = 1;
  37.     delay(100);
  38.     BUZZER = 0;
  39.     delay(100);
  40.     // 显示音乐名称
  41.     lcd_write_string(str);
  42.     // 延时1秒
  43.     delay(1000);
  44.   }
  45. }

  46. // 延时函数
  47. void delay(int ms) {
  48.   for (int i = 0; i < ms; i++) {
  49.     _nop_();
  50.   }
  51. }
  52. // LCD写字符函数
  53. void lcd_write_char(char ch) {
  54.   // 发送写命令
  55.   RS = 1;
  56.   RW = 0;
  57.   EN = 1;
  58.   P3 = ch;
  59.   EN = 0;
  60.    // 等待写操作完成
  61.   while (P3 & 0x80);
  62. }
  63. // LCD写字符串函数
  64. void lcd_write_string(char *str) {
  65.   while (*str != '\0') {
  66.     lcd_write_char(*str++);
  67.   }
  68. }
  69. // LCD清屏函数
  70. void lcd_clear() {
  71.   lcd_write_command(0x01);
  72. }
  73. // LCD设置光标位置函数
  74. void lcd_set_cursor(char line, char column) {
  75.   char cmd = 0x80 + (line * 0x40) + column;
  76.   lcd_write_command(cmd);
  77. }
  78. // LCD初始化函数
  79. void lcd_init() {
  80.   lcd_write_command(0x38); // 设置16x2显示,5x7点阵字符
  81.   lcd_write_command(0x0C); // 显示开,光标关闭
  82.   lcd_write_command(0x06); // 写入字符后,光标右移,显示不移动
  83.   lcd_write_command(0x01); // 清屏
  84. }
  85. // LCD写命令函数
  86. void lcd_write_command(char cmd) {
  87.   // 发送写命令
  88.   RS = 0;
  89.   RW = 0;
  90.   EN = 1;
  91.   P3 = cmd;
  92.   EN = 0;
  93.   // 等待写操作完成
  94.   while (P3 & 0x80);
  95. }
  96. // 延时函数
  97. void delay(int ms) {
  98.   for (int i = 0; i < ms; i++) {
  99.     for (int j = 0; j < 1000; j++);
  100.   }
  101. }


  102. // 主函数
  103. void main() {
  104.   // 初始化LCD
  105.   lcd_init();
  106.   // 显示欢迎信息
  107.   lcd_set_cursor(0, 0);
  108.   lcd_write_string("Welcome to the");
  109.   lcd_set_cursor(1, 0);
  110.   lcd_write_string("Digital Music Box");
  111.   // 延时2秒
  112.   delay(2000);
  113.   // 清除LCD显示
  114.   lcd_clear();
  115.    // 主循环
  116.   while (1) {
  117.     // 检测按键按下
  118.     if (K1 == 0) {
  119.       // 播放小星星
  120.       lcd_clear();
  121.       lcd_set_cursor(0, 0);
  122.       lcd_write_string("Now Playing:");
  123.       lcd_set_cursor(1, 0);
  124.       lcd_write_string("Twinkle Twinkle");
  125.       playMusic(str1);
  126.     } else if (K2 == 0) {
  127.       // 播放两只老虎
  128.       lcd_clear();
  129.       lcd_set_cursor(0, 0);
  130.       lcd_write_string("Now Playing:");
  131.       lcd_set_cursor(1, 0);
  132.       lcd_write_string("Two Little Tigers");
  133.       playMusic(str2);
  134.     } else if (K3 == 0) {
  135.       // 播放卡农
  136.       lcd_clear();
  137.       lcd_set_cursor(0, 0);
  138.       lcd_write_string("Now Playing:");
  139.       lcd_set_cursor(1, 0);
  140.       lcd_write_string("Canon in D");
  141.       playMusic(str3);
  142.     } else if (K4 == 0) {
  143.       // 播放音乐
  144.       BUZZER = 1;
  145.       lcd_set_cursor(1, 15);
  146.       lcd_write_char('>');
  147.     } else if (K5 == 0) {
  148.       // 暂停音乐
  149.       BUZZER = 0;
  150.       lcd_set_cursor(1, 15);
  151.       lcd_write_char(' ');
  152.     }
  153.   }
  154. }
复制代码


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
快速回复 返回顶部 返回列表