Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于51单片机设计的简易电子琴

基于51单片机设计的简易电子琴

作者头像
zy010101
发布于 2019-05-25 12:00:12
发布于 2019-05-25 12:00:12
82400
代码可运行
举报
文章被收录于专栏:程序员程序员
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433392

基于51单片机设计的简易电子琴

下面直接给出proteus仿真电路

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <reg51.h> 
#define uint unsigned int 
#define uchar unsigned char
#define output P1
#define input P1
//方便移植在其他电路板上,我的电路使用P1口做键盘输入接口
//定义16个按键
enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15};
uchar code table[]={				  //数组定义,显示数码管
	    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
	    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned int code Freqtab[] = { 	//定时半周期的初始值
     64021,64103,64260,64400,      //低音3 4 5 6
     64524,64580,64684,64777,      //低音7,中音1 2 3
     64820,64898,64968,65030,      //中音4 5 6 7
     65058,65110,65157,65178};     //高音1 2 3 4
uint FreqTemp;
//蜂鸣器声音不怎么样,我们使用扬声器,接P3.7口
sbit SPEAK = P3^7;
void delay1ms(uint n)   //误差 0us ,延时n毫秒
{
    uint a,b,c;
	for(c=n;c>0;c--)
    	for(b=199;b>0;b--)
        	for(a=1;a>0;a--);
}

uint key_input(void)
{
	uchar temp1,temp2;			//临时保存读取的行或者列
	uchar num = 16;			   	//返回按键的值
	output = 0x0f;		
   	temp1 = input;				//先读取行
	if(0x0f != temp1)   		//按键按下
	{				   	
		delay1ms(5);			//延时,消除抖动
		temp1 = input;			//再次读取行
		if(0x0f != temp1)		//说明按键确实按下	
		{
			temp1 = temp1 & 0x0f;	//保留低4位
			output = 0xf0;			//准备读取列
			delay1ms(1);			//延时一下,防止下一句读不到
			temp2 = input;			//直接读取列
			temp2 = temp2 & 0xf0;	//保留高4位
			temp1 = temp1 | temp2;	//将temp1和temp2的值合并
		}
	}
	switch(temp1)
	{
		case 0xee:num=0;break;  
        case 0xde:num=1;break;  
        case 0xbe:num=2;break;   
        case 0x7e:num=3;break; 
		case 0xed:num=4;break;               
        case 0xdd:num=5;break;           
        case 0xbd:num=6;break;             
        case 0x7d:num=7;break;   
		case 0xeb:num=8;break;    
        case 0xdb:num=9;break;    
        case 0xbb:num=10;break;   
        case 0x7b:num=11;break;    
		case 0xe7:num=12;break;   
        case 0xd7:num=13;break;   
        case 0xb7:num=14;break;    
        case 0x77:num=15;break;      
		default:break;
	}
	return num;
}
void T0_INT(void) interrupt 1
{
     TL0 = FreqTemp;                //载入定时半周期的初始值
     TH0 = FreqTemp >> 8;
     SPEAK = ~SPEAK;                    //发音
} 
int main()
{
	TMOD = 0X01;		//定时器T0设置为方式1
	EA = 1;
	ET0 = 1;
	TR0 = 0;
	while(1)
	{
		uint num,temp;
		num = key_input();
		temp = num;
		P0 = table[num];
		if(16 != num)
		{
			FreqTemp = Freqtab[num];
			TR0 = 1;
			while(0xf0 != output);		//检测按键松开
			TR0 = 0;
			SPEAK = 1;	
		}		
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
1602驱动电路_lcd1602的a和k接哪里
今天我也开博了,一个前辈的话对我触动很大:不会分享,不懂总结,就不要做技术。这也是我这博客的目的,望各路过高手菜鸟多多指教。
全栈程序员站长
2022/11/08
4290
基于51单片机的自动浇花器电路
自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。
芯动大师
2024/05/16
1420
基于51单片机的自动浇花器电路
学习单片机第4天
开发板板载一个74HC165 芯片,本章就来介绍如何来扩展单片机IO 口,通过本章的学习,让大家学会使用74HC165 芯片来扩展IO 口。本章所要实现的功能是:使用开发板上的74HC165 模块扩展8 位IO 与独立按键连接,通过独立按键控制LED 灯。
笃信好学
2022/09/13
2590
新概念51单片机C语言教程纠错(3)「建议收藏」
这一次错误在课本P140页例6.6.1中,这个例子在proteus仿真中再一次刷新了我的认知。
全栈程序员站长
2022/06/28
5450
基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)
本学期单片机课程要求做课程设计,我选取的课题如下: 基于单片机的电子时钟设计,要求: (1)实时显示当前时间; (2)能够对时间进行设置; (3)包括年月日,小时,分钟,秒. (4)整点提醒功能. 经过一周的时间已实现上述功能,故在此分享一下;
全栈程序员站长
2022/09/15
4.7K2
基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)
基于51单片机的八路抢答器设计开题报告_8路抢答器设计51单片机
随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也越来越重要。本文设计出以STC89C52RC单片机为核心的八路抢答器。
全栈程序员站长
2022/11/01
5290
基于51单片机的八路抢答器设计开题报告_8路抢答器设计51单片机
计算机控制技术实验说明
AD转换是所有嵌入式系统或机器人获取外部信息的一种重要方式,将温度、角度和位置等转换为对应的数字量,供处理器处理。
zhangrelay
2019/01/23
5500
八路抢答器单片机c语言程序_八路抢答器单片机c语言程序
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
全栈程序员站长
2022/11/01
1K0
STC51单片机中断与定时器配置参考
*外中断INT0--------void intsvr0(void) interrupt 0 using 1
小锋学长生活大爆炸
2020/08/13
1.5K0
STC51单片机中断与定时器配置参考
设计分享|单片机8路抢答器
51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。
电子工程师成长日记
2022/07/27
6170
设计分享|单片机8路抢答器
蓝桥杯单片机必备知识—–(5)独立按键
1.放在while(1)一直扫描按键是否按下 2.放在中断中 中断一次扫描按键是否按下 注:大型项目会放在中断中进行,一直扫描会占用过多资源,如果参加比赛则可以在while中一直使用循环
全栈程序员站长
2021/04/15
5330
C51单片机–定时器实验
这个代码感觉逻辑上没问题,实际仿真出来倒计时的1s感觉要比实际的慢,可能是由于单片机执行语句时也需要耗费时间
全栈程序员站长
2022/09/13
7960
C51单片机–定时器实验
山东大学单片机原理与应用实验 3.4 矩阵键盘扫描实验
1. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件。
timerring
2022/07/20
5200
山东大学单片机原理与应用实验 3.4 矩阵键盘扫描实验
89C51 单片机调速 可执行代码 c+汇编
 然而很多人做电机,但是课程没有教电机,hhhh(然后三个班做电机的代码都是我给的?
用户2965768
2019/07/01
6490
山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验
利用LCD1602和AD0808实现简单的交流信号过零检测与频率分析。要求信号幅度变化时(满量程的5%—95%),不影响检测到结果。频率检测的结果通过LCD1602的第一行显示出来,信号过零时,能够通过P2.6输出一个脉冲宽度为5μs的脉冲信号。
timerring
2022/07/20
9350
山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验
【51单片机】配置定时器
​ 那么我们先创建一个子函数 void Timer0_Init() ⇥ 对定时器进行初始化。 那么首先是TMOD的一个配置,定时器1我们先不管(高四位定时器全部给上0),只管低四位的一个定时器0的一个配置。 在前面的定时器工作有介绍过,STC89C52 的 T0 和 T1 一共有四种工作模式:在这里我们选择最常用的工作模式1。 Ⅰ:工作模式①的话,我们只需要把 M1 = 0,M0 = 1 就是定时器模式①的配置了。 Ⅱ:C/T(取反):这个我们只需要给C/T(取反) = 0即可,SYSclk⇢系统时钟。 Ⅲ:GATE(门控端),GATE = 0,这里当中都是数字电路当中的一些基础逻辑门,TR0 = 1。
謓泽
2022/12/12
7320
【51单片机】配置定时器
单片机原理及接口技术实验报告-4x4开关+1602显示屏模拟电话拨号(开源)
用户6948990
2025/04/03
490
单片机红外传感器_基于51单片机的声音传感器
我们工作久了,久坐导致的毛病就显现出来了,腰酸背痛颈椎疼,最近看到利用番茄钟工作法挺好,工作25分钟,休息5分钟,既能调整工作节奏,避免精力过分消耗,也能避免久坐导致的身体问题。 我刚开始使用闹钟做提醒,后来尝试番茄钟软件,但是都要手动去操作手机,拿起手机看到信息,然后就会去处理手机上的事情了,起不到作用… 直到有一天收拾东西看到了我大学期间基于51单片机做的一个电子设计,激起了我的灵感,开始了基于51单片机的自动番茄钟,久坐提醒神器的设计和制作。 整体方案硬件部分继承了大学时焊接的电路板,更换了传感器部分,软件部分重新编写了控制部分的代码。 之前的软硬件设计方案可以参考这篇文章《基于51单片机的上下限可调的数字温度控制系统》,本文重点阐述差异部分。
全栈程序员站长
2022/11/15
7270
单片机红外传感器_基于51单片机的声音传感器
单片机实验说明<四>矩阵键盘与LCD基本使用
对4×4矩阵式键盘电路的键值进行编码,编程实现在LCD液晶显示器上显示每个按键的“0-F”序号
zhangrelay
2021/03/03
7830
别怕!51 单片机从入门到应用,小白也能轻松吃透
这篇教程专为单片机小白打造,从 51 单片机基础讲起,带你搭建开发环境,学习汇编与 C 语言编程。通过 LED 灯闪烁、按键控制、数码管显示等基础实验,以及简易电子钟、温度检测系统等应用案例,结合代码实操,助你快速掌握 51 单片机开发。
羑悻的小杀马特.
2025/03/24
4240
推荐阅读
相关推荐
1602驱动电路_lcd1602的a和k接哪里
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档