基于单片机音乐弹奏播放DS1302万年历显示及源程序

一、系统方案
1、本设计采用51单片机作为主控器。
2、DS1302计时显示年月日时分秒。
3、按键可以弹奏以及播放音乐,内置16首音乐。
在这里插入图片描述

二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
/时钟显示**/
void init_1602_ds1302()
{
write_sfm2_ds1302(1,1,shi); //显示时
write_sfm2_ds1302(1,4,fen); //显示分
write_sfm2_ds1302(1,7,miao); //显示秒
write_sfm2_ds1302(2,2,nian); //显示年
write_sfm2_ds1302(2,5,yue); //显示月
write_sfm2_ds1302(2,8,ri); //显示日
}
2、液晶显示程序
/延时函数*/
void delay_uint(uint q)
{
while(q–);
}

/lcd1602写命令函数*/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}

/lcd1602写数据函数*/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}

/lcd1602初始化设置*/
void init_1602() //lcd1602初始化设置
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
}

/lcd1602上显示一位十进制数*/
void write_sfm1(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(table_num[date % 10]);
}

/lcd1602上显示两位十进制数*/
void write_sfm2(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(table_num[date / 10 % 10]);
write_data(table_num[date % 10]);
}

void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(table_num[date/16]);
write_data(table_num[date%16]);
}

/lcd1602上显示这字符函数*/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == ‘\0’) break;
write_data(*p);
p++;
}
}

/控制光标函数***/
void write_guanbiao(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
write_com(0x0f); //显示光标并且闪烁
else
write_com(0x0c); //关闭光标
}

/lcd1602清除显示*/
void clear_1602()
{
write_string(1,0," “);
write_string(2,0,” ");
}

/开机液晶显示函数 初始化液晶的内容****************/
void init_1602_dis_csf() //初始化液晶
{
write_string(1,0," : : ");
write_string(2,0,"20 - - ");
}

3、按键电路程序
void anjian() //按键键值识别
{
P1=0xf0; //P1口赋值
if((P1&0xf0)!=0xf0) //判断是否有按键按下
{
delay(); //去抖
if((P1&0xf0)!=0xf0) //再次判断有无按键按下
{
key=getkey(); //扫描按键
Tone_Index=0; //播放音符顺序清零
switch(key) //根据扫描的按键编码将k赋值
{
case 0x88: //按键编码为0x88
k = 0; //k赋值0
break; //已经确定键值后提前跳出switch
case 0x48: //如果不满足上一个case则继续向下判断,直到有符合
k = 1; //k赋值1
break; //下同,略
case 0x28:
k = 2 ;
break;
case 0x18:
k = 3 ;
break;
case 0x84:
k = 4 ;
break;
case 0x44:
k = 5 ;
break;
case 0x24:
k = 6 ;
break;
case 0x14:
k = 7 ;
break;
case 0x82:
k = 8 ;
break;
case 0x42:
k = 9 ;
break;
case 0x22:
k = 10 ;
break;
case 0x12:
k = 11 ;
break;
case 0x81:
k = 12 ;
break;
case 0x41:
k = 13 ;
break;
case 0x21:
k = 14 ;
break;
case 0x11:
k = 15 ;
break;
default : //如果以上都不符合,直接跳出,无键值输出
break;
}
}
}
}
4、核心算法程序
void main(void) //主函数
{
SPK=0;
LED1=1;
LED2=0; //开机默认弹奏模式
senddata_74595(0xc0); //数码管显示0
IE=0x87; //定义外部中断控制器
TMOD=0x01; //定义定时器0的工作方式
IT0=1; //外部中断0为下降沿触发
IT1=1; //外部中断1为下降沿触发
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化显示

while(1)						   //进入死循环
{read_time();		  //读时间init_1602_ds1302();   //显示时钟	P1=0xf0; 					   //P1口赋值if((P1&0xf0)!=0xf0)			   //判断P0口是否有变化{	anjian();				   //读取键值senddata_74595(DSY_CODE[k]);			   //显示键值,也就是显示音符if(FY==0)				   //如果是弹奏模式{STH0 = tab[k]/256;STL0 = tab[k]%256;	   //根据k的值赋初值给T0TR0 = 1;               //打开定时器用于定时产生频率发生     while ((P1&0xf0)!=0xf0); //按键不松开的话,T0就一直产生频率 TR0=0;                 //按键松开后关闭T0计时,频率停止 } else  //如果是播放模式(上面的if语句不成立就执行else){ while (FY==1) 							 //进入播放模式{ read_time();		  //读时间init_1602_ds1302();   //显示时钟if(Song[k][Tone_Index]==-1) 		 //一首播放完退出{Tone_Index=0;SPK=0;break; }  STH0=(tab[Song[k][Tone_Index]])/256;STL0=(tab[Song[k][Tone_Index]])%256; //将内置音乐数组的数据赋给定时器做为初值计时//	P0=DSY_CODE[Song[k][Tone_Index]]; 	 //显示播放的音符TR0 = 1; 							 //打开定时器定时开关delay1(300*Len[k][Tone_Index]); 	 //节拍数组延时Tone_Index++; 						 //变量加准备播放下一个音符TR0=0;								 //停止定时器anjian();							 //扫描按键senddata_74595(DSY_CODE[k]);					 //显示音乐序号while((P1&0xf0)!=0xf0);}}}
}

}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-搜索技术:从技术发展到应用实战的全面指南

在本文中,我们全面探讨了人工智能中搜索技术的发展,从基础算法如DFS和BFS,到高级搜索技术如CSP和优化问题的解决方案,进而探索了机器学习与搜索的融合,最后展望了未来的趋势和挑战,提供了对AI搜索技术深刻的…

Lesson 04 模板入门

C:渴望力量吗,少年? 文章目录 一、泛型编程1. 引入2. 函数模板(1)函数模板概念(2)函数模板格式(3)函数模板的原理(4)函数模板的实例化&#xff08…

uniapp优化h5项目-摇树优化,gzip压缩和删除console.log

1.摇树优化 勾选摇树优化,打包删除死代码 2.gzip压缩和删除console.log 安装插件webpack和compression-webpack-plugin webpack插件 npm install webpack4.46.0 --save-devcompression-webpack-plugin插件 npm install compression-webpack-plugin6.1.1 --save-devconst Com…

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰

说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…

HTTP Error 500.31 - Failed to load ASP.NET Core runtime

在winserver服务器上部署net6应用后,访问接口得到以下提示: 原因是因为没有安装net6的运行时和环境,我们可以在windows自带的 “事件查看器” 查看原因。 可以直接根据给出的地址去官网下载sdk环境,安装即可 下载对应的net版本…

CentOS Linux release 7.9.2009 (Core)中安装配置Tomcat

一、安装JDK 部分内容可以参考我这篇文章:Windows11与CentOS7下配置与检测JDK与Maven环境变量 中的 2.2 安装jdk-8u371-linux-x64.tar.gz和配置环境变量/etc/profile //1、安装redhat-lsb yum install -y redhat-lsb//2、查看系统版本信息 lsb_release -a //3、查…

【C++入门】拷贝构造运算符重载

目录 1. 拷贝构造函数 1.1 概念 1.2 特征 1.3 常用场景 2. 赋值运算符重载 2.1 运算符重载 2.2 特征 2.3 赋值运算符 前言 拷贝构造和运算符重载是面向对象编程中至关重要的部分,它们C编程中的一个核心领域,本期我详细的介绍拷贝构造和运算符重载。 1. …

Transformer中WordPiece/BPE等不同编码方式详解以及优缺点

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

FPGA设计时序约束八、others类约束之Set_Case_Analysis

目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序…

uniapp 微信小程序登录 新手专用 引入即可

预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…

05-Spring Boot工程中简化开发的方式Lombok和dev-tools

简化开发的方式Lombok和dev-tools Lombok常用注解 Lombok用标签方式代替构造器、getter/setter、toString()等重复代码, 在程序编译的时候自动生成这些代码 注解名功能NoArgsConstructor生成无参构造方法AllArgsConstructor生产含所有属性的有参构造方法,如果不希望含所有属…

[C/C++]数据结构 栈和队列()

一:栈 1.1 栈的概念及结构 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守先进后出的原则. 压栈:栈的插入操作叫做进栈/压栈/入栈,将数据插入栈顶 出栈:栈的删除操作也叫出…

Redis新操作

1.Bitmaps 1.1概述 Bitmaps可以对位进行操作&#xff0c;实际上它就是一个字符串&#xff0c;可以将Bitmaps想象为一个以位为单位的数组&#xff0c;数组中的每个元素只能存储0或者1&#xff0c;数组的下标在Bitmaps被称为偏移量。 setbit key offset value&#xff1a;设置o…

MIB 6.S081 System calls(1)using gdb

难度:easy In many cases, print statements will be sufficient to debug your kernel, but sometimes being able to single step through some assembly code or inspecting the variables on the stack is helpful. To learn more about how to run GDB and the common iss…

十二.Jenkins持续集成

十二.Jenkins持续集成 一.安装jenkins 1.下载 Jenkins下载地址&#xff1a;http://jenkins-ci.org/ 或 https://mirrors.jenkins-ci.org/redhat/2.安装 可以通过官网的安装方式来安装 安装完后&#xff0c;需要修改以下的配置 vim /usr/lib/systemd/system/jenkins.servic…

git常用命令和参数有哪些?【git看这一篇就够了】

文章目录 前言常用命令有哪些git速查表奉上常用参数后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;git操作相关 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出…

Git企业开发级讲解(五)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、bug 分⽀二、删除临时分支三、小结 一、bug 分⽀ 假如我们现在正在 dev2 分⽀上进⾏开发…

AI Navigation导航系统_unity基础开发教程

AI Navigation导航系统 安装插件烘焙导航系统障碍物创建人物的AI导航动态障碍物 在unity编辑器中&#xff0c;有一个灰常好用的插件&#xff1a;Navigation。有了它1&#xff0c;你就可以实现人物自动走到你鼠标点击的位置&#xff0c;而且还会自动避开障碍物&#xff0c;下面就…

第7天:信息打点-资产泄漏amp;CMS识别amp;Git监控amp;SVNamp;DS_Storeamp;备份

第7天&#xff1a;信息打点-资产泄漏&CMS识别&Git监控&SVN&DS_Store&备份 知识点&#xff1a; 一、cms指纹识别获取方式 网上开源的程序&#xff0c;得到名字就可以搜索直接获取到源码。 cms在线识别&#xff1a; CMS识别&#xff1a;https://www.yun…

quickapp_快应用_tabBar

tabBar 配置项中配置tabBar(版本兼容)使用tabs组件配置tabBar语法示例问题-切换tab没有反应问题-数据渲染问题解决优化 问题-tab的动态配置 第三方组件tabbar 一般首页都会显示几个tab用于进行页面切换&#xff0c;以下是几种tab配置方式。 配置项中配置tabBar(版本兼容) 在m…