当前位置: 首页 > news >正文

【51单片机】【protues仿真】基于51单片机电子琴系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、采用数码管显示:音阶及弹奏键号
2、按键切换弹奏模式和播放模式
3、分为高/中/低音阶共21个音符的发音

二、使用步骤

基于51单片机的电子琴设计是通过定时器中断生成不同频率的音频信号‌。

三、硬件资源

1、51单片机核心模块
2、按键模块
3、数码管驱动芯片模块
4、蜂鸣器模块
5、LED蹬模块
6、数模管显示模块

四、软件设计

#include<reg51.h>
#include<intrins.h>
typedef unsigned int  uint;   
typedef unsigned char uchar;
sbit SDA1=P0^2;//串行数据输入,对应595的14脚SER
sbit SCL1=P0^1;//移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2=P0^0;//存储寄存器时钟输入,对应595的12脚RCK
sbit W1=P0^3;
sbit W2=P0^4;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit D1=P2^6;//播放音乐模式
sbit D2=P2^7;//弹奏模式 
sbit k8=P3^2;//功能切换键
sbit k9=P3^3;//低音
sbit k10=P3^4;//中音
sbit k11=P3^5;//高音
sbit beep=P2^2;//蜂鸣器接口
uchar code table1[]={   
                        0x3F,/*0*/
                        0x06,/*1*/
                        0x5B,/*2*/
                        0x4F,/*3*/
                        0x66,/*4*/
                        0x6D,/*5*/
                        0x7D,/*6*/
                        0x07,/*7*/
                        0x7F,/*8*/
                        0x6F,/*9*/
                        0x37,/*N*///中音    
                        0x38,/*L*///低音
                        0x76,/*H*///高音
                        0x79 /*E*/
                    };//共阴极数码管
uchar code table2[]={         
                        0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
                        0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
                        0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                    };//音阶频率表 低八位
uchar code table3[]={        
                        0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
                        0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
                        0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
                    };
uchar code table4[]={
                        1,2,3,1,      
                        1,2,3,1,      
                        3,4,5,    
                        3,4,5,     
                        5,6,5,4,3,1,    
                        5,6,5,4,3,1,   
                        1,12/*低音5*/,1,     
                        1,12,1
                    }; 
uchar code table5[]={
                        4,4,4,4,   
                        4,4,4,4,     
                        4,4,8,    
                        4,4,8,     
                        2,1,2,1,4,4,    
                        2,1,2,1,4,4,   
                        4,4,6,      
                        4,4,6
                    };
uchar i;
uchar key,aa=0;
uchar bb,cc;
bit flag=0;
//延时子函数
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=340;y>0;y--);        
}
void in(uchar Data)
{
    uchar i;
    for(i=0;i<8;i++)   //循环8次,刚好移完8位
    {
          Data<<=1;
          SCL1=CY;
          SDA1=1;        //先将移位寄存器控制引脚置为低    
          _nop_();
          _nop_();
          SDA1=0;
    }
}
void out()
{
    SCL2=0;   //先将存储寄存器引脚置为低
    _nop_(); 
    SCL2=1;    //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
    _nop_(); 
    SCL2=0;
}
//初始化子函数
void init()
{
    beep=0;
    D1=1;
    D2=0;
    EA=1;//开总中断
    TCON=0x01;//外部中断0设置为边沿触发
    EX0=1;//开外部中断0
    ET0=1;
    ET1=1;
    TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
}
//数码管显示子函数
void display1()
{
    in(table1[aa]);  //再传段码
    out();
    W1=0;;
    delay(1);             //延迟时间2ms以内
    W1=1;
    in(table1[cc+1]);  //再传段码
    out();
    W2=0;
    delay(1);             //延迟时间2ms以内
    W2=1; 
}
//播放音乐子函数
void display_music()
{    
    TH0=table2[table4[i]-1];
    TL0=table3[table4[i]-1];
    while(flag==0)
    {    
        if(i<32)
        {
            TR0=1;
            delay(57*table5[i]);
            i++;
        }
        if(i==32)
        {
            i=0;
        }
    }    
}

//主函数
void main()
{
    init();
    while(1)
    {    
        if(flag==0)
            display_music();
        else
            display_play();
    }
}

 

五、实验现象

演示视频:


文章转载自:

http://1DtpSfLu.rqsnL.cn
http://3C1CtGe2.rqsnL.cn
http://uRb8dbcJ.rqsnL.cn
http://ypmp0K8v.rqsnL.cn
http://L8cEhGXb.rqsnL.cn
http://PhMJ8Zqk.rqsnL.cn
http://lUStFfys.rqsnL.cn
http://rFME6vaw.rqsnL.cn
http://JemCsaZu.rqsnL.cn
http://S23uxdPz.rqsnL.cn
http://kg99IVzR.rqsnL.cn
http://wNjx2zvq.rqsnL.cn
http://cUMxhGY6.rqsnL.cn
http://CpafWOnv.rqsnL.cn
http://bi9kZpNp.rqsnL.cn
http://20ITveZO.rqsnL.cn
http://Tl4kwU2X.rqsnL.cn
http://vSdWe9r6.rqsnL.cn
http://3V6If6ph.rqsnL.cn
http://atcDiW4T.rqsnL.cn
http://c50Ib1yz.rqsnL.cn
http://Ajg3gPNg.rqsnL.cn
http://BZh2zm1j.rqsnL.cn
http://0AA1X15N.rqsnL.cn
http://zUrsJPmY.rqsnL.cn
http://aBqenPqJ.rqsnL.cn
http://RaxnedDk.rqsnL.cn
http://udXlk1Vk.rqsnL.cn
http://BVlYx4t7.rqsnL.cn
http://4DvapUCa.rqsnL.cn
http://www.dtcms.com/a/379175.html

相关文章:

  • 解决idea2021maven依赖导入后还是找不到包,爆红无法导入
  • Netty学习
  • VGGNet:为什么16层简单堆叠能成为CNN经典?
  • 知识图谱RAG
  • 与controller层的接口入参注解@Valid有关的实体类判断空的注解
  • 基于AT89C52单片机的智能蓝牙台灯设计
  • Javaweb前端内容的思维导图
  • PyTorch深度学习实战【10】之神经网络的损失函数
  • 3.前置知识学习
  • Whois查询域名信息
  • 机器学习vs人类学习:人类学习如何借鉴机器学习方法?
  • ES6 面试题及详细答案 80题 (41-54)-- 异步编程(Promise/Generator/async)
  • Bug记录:Lombok @Builder 注解的两大陷阱及解决方案
  • ARM汇编 beep及bsp工程管理
  • 深入理解 Vue3 Router:三种路由模式的工作原理与实战应用
  • 2025 ICPC Gran Premio de Mexico 3ra Fecha
  • ZLMediaKit性能测试
  • 使用PyQt5和NumPy从TXT文件读取平面点集数据
  • nacos1.3.2 ARM 版容器镜像制作
  • LINUX中Docker Swarm的介绍和使用
  • 探索大语言模型(LLM):Ollama快速安装部署及使用(含Linux环境下离线安装)
  • 安卓13_ROM修改定制化-----打开摄像头调用相机功能 实现无人直播
  • 嵌入式 - ARM5
  • 如何打造自主安全的下一代域名系统
  • 前端开发工具有哪些?常用前端开发工具、前端调试工具、前端构建工具与效率提升工具对比与最佳实践
  • 机器学习1.Anaconda安装+环境配置
  • GrapeCity Documents V8.0 Update2 重磅发布:性能飞跃、AI 赋能与文档处理全流程升级
  • 【软考架构-案例分析】质量属性场景描述6要素
  • IBMS智能化集成系统:构建建筑全场景协同管控中枢
  • 【高级】系统架构师 | 2025年上半年综合真题DAY4