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

关于#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); // 设置16×2显示,5×7点阵字符
  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. }

复制代码

下载说明:
1.本站资源都是白菜价出售,同样的东西,我们不卖几百,也不卖几十,甚至才卖几块钱,一个永久会员能下载全站100%源码了,所以单独购买也好,会员也好均不提供相关技术服务。
2.如果源码下载地址失效请联系站长QQ进行补发。
3.本站所有资源仅用于学习及研究使用,请必须在24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您权益请联系本站删除!
4.本站站内提供的所有可下载资源(软件等等)本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发);但本网站不能保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug;同时本站用户必须明白,【安安资源网】对提供下载的软件等不拥有任何权利(本站原创和特约原创作者除外),其版权归该资源的合法拥有者所有。
5.请您认真阅读上述内容,购买即以为着您同意上述内容。
安安资源网 » 关于#51单片机#的问题:数字音乐盒(相关搜索:蜂鸣器)