单片机电子琴仿真原理图如下
avr单片机源程序如下:
//-----------------------------------------------------------------
// 名称: 电子琴仿真
//-----------------------------------------------------------------
// 说明: 本例在键盘矩阵上模拟演奏电子琴,数码管显示键号.
// 按下不同按键时将输出不同频率音符,按键长按时发出长音,
// 短按时发出短音.
//
//-----------------------------------------------------------------
#define F_CPU 1000000UL //1M晶振
#include #include #define INT8U unsigned char
#define INT16U unsigned int
//蜂鸣器定义
#define SPK() (PORTD ^= _BV(PD7))
//定时器比较中断启停定义
//C调音符频率表(部分)
//共阳数码管段码表(0~F)
const INT8U SEG_CODE[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //0 1 2 3 4 5 6 7
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E //8 9 A B C D E F
};
//键盘矩阵相关变量与程序
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
}
//-----------------------------------------------------------------
// T1定时器比较匹配中断程序,控制音符频率输出
//-----------------------------------------------------------------
ISR (TIMER1_COMPA_vect)
{
}
复制代码
//-----------------------------------------------------------------
// 名称: 键盘矩阵扫描程序
//-----------------------------------------------------------------
#include #include #define INT8U unsigned char
#define INT16U unsigned int
//键盘端口定义
//19:45 2017/12/19
INT8U KeyNo = 16 ;
//-----------------------------------------------------------------
// 判断键盘矩阵是否有键按下
//-----------------------------------------------------------------
INT8U KeyMatrix_Down()
{
}
//-----------------------------------------------------------------
// 键盘矩阵扫描子程序
//-----------------------------------------------------------------
void Keys_Scan()
{
}
关键字:avr单片机 电子琴 键盘矩阵
引用地址:
avr单片机可演奏的电子琴仿真加源码
推荐阅读最新更新时间:2024-11-19 22:08
#单片机#矩阵键盘-电子琴
#include reg52.h //包含51单片机寄存器定义的头文件 sbit sound=P0^4; //将sound位定义为P0.4 #define uchar unsigned char #define uint unsigned int uchar k,num,temp; uint code yinfu = {64580,64684,64777,64820,64898,64968,65030 }; //中1,中2,中3,中4,中5,中6,中7 void delay(uint z) { uint x,y; for(x=z;x 0;x--) for(y=1
[单片机]
AVR单片机(学习ing)—(九)、ATMEGA16的模数转换器—01
九、ATMEGA16的模数转换器 九—(01)、ATMEGA16的模数转换器的介绍 1、介绍 1)特点: • 10 位 精度 • 0.5 LSB 的非线性度 • ± 2 LSB 的绝对精度 • 65 - 260 μs 的转换时间 • 最高分辨率时采样率高达15 kSPS • 8 路复用的单端输入通道 • 7 路差分输入通道 • 2 路可选增益为10x 与200x 的差分输入通道 • 可选的左对齐ADC 读数 • 0 - VCC 的 ADC 输入电压范围 • 可选的2.56V ADC 参考电压 • 连续转换或单次转换模式 • 通过自动触发中断源启动ADC 转换 • ADC 转换结束中断 • 基于睡眠模式的噪声抑制器 Note: 1.
[单片机]
矩阵键盘扫描原理详解——单片机
根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平
[单片机]
AVR单片机与上位机通信协议的制定
单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定! 上行协议,即由单片机向上位机发送数据。 下行协议,即由上位机向单片机发送数据。 而通信协议又要分固定长度和不定长度两种 本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成 起始字PRE 命令字ORD 值VAL 结束字END 附注 1byte 1byte 1byte 1byte BBH AAH(ORD_SATA) 单片机状态转换命令标识 01H EEH 模式1:空闲 02H EEH 模式2:温度采集 03H EEH 模式3:温度采集向上位机传送采集值 04H EEH 模式4:PWM测试 BBH DDH(ORD_P
[单片机]
51单片机4X4矩阵键盘驱动与应用程序(C语言)
1、keydrive.c #include reg52.h #include stdio.h /* 程序功能: 本程序用于测试4X4矩阵键盘驱动; 程序算法: 每2MS检测一次按键的状态,若连续8次检测都为相同, 说明现在是一个稳定的状态,否就是干扰不与理采 ; 按键有三种状态:1、按下 2、松开 3、干扰或抖动; 其中前两种都是稳态,后一种为抖动。 接着若判断按键的状态是否改变, 若改变--》判断原来的状态是否为松开---是--说明 现在按键为按下,那么就把键值算出来;---返回0; 若改变--》判断原来的状态是否为松开---否--说明 现在按键为松开,那么就把键值返
[单片机]
PIC单片机4X4矩阵键盘检测原理及实现C语言程序
#include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); const uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar key_num; void delay(uint x); void init(); void scan(); void didi(uchar num); void disp(); void mai
[单片机]
AVR单片机IC卡程序
AVR单片机IC卡程序 #include io8535v.h #include macros.h #define uchar unsigned char #define uint unsigned int //**********定义全局变量*******************// //查表0 1 2 3 4 5 6 7 8 9 E F P OFF uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x71,0x73,0x00}; uchar I CC ode ;//定义IC卡复位时读出的4字节代码; uc
[单片机]
矩阵式键盘扫描原理
矩阵式键盘扫描原理 将键值显示在七节显示器上的单片机源码。把每个 键 都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,比对之后就可知道是哪个键被按下。 比如说扫描码送入01111111,前面的0111是代表扫描第一行P1.0列,而后面的1111是让读取的4行接脚先设為VDD,若第一行的第三列按键被按下,那读取的结果就会变成01111101(注意1111变成1101),其中LSB的第三个bit会由1变成0,这是因為这个按键被按下之后,会被垂直的扫描码电位short,而把读取的LSB的bit电位拉
[测试测量]