avr单片机定时与中断做的电子琴(仿真+程序)

发布者:Qianfeng最新更新时间:2019-10-23 来源: 51hei关键字:avr单片机  定时  中断  电子琴 手机看文章 扫描二维码
随时随地手机看文章

仿真原理图如下

 

avr单片机源码:


#include

#include


#define uchar unsigned char 

#define uint unsigned int 


#define LED1_ON() PORTA=0xFE

#define LED2_ON() PORTA=0xF7 

#define LED3_ON() PORTA=0xBF 

#define LED4_ON() PORTA=0x7F 


uchar key_0=16;


uint Fr[]= {0,262*8,294*8,330*8,349*8,392*8,440*8,

494*8,523*8,587*8,659*8,698*8,784*8,880*8,988*8 ,1046*8};



uchar SEG_CODE[]=

{ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E 

};


uint Tone_Delay_Table[] =

{ 64021,64103,64260,64400,64524,64580,64684,64777, 

64820,64898,64968,65030,65058,65110,65157,65178};


uchar spe1_Tone[] = { 3,5,5,3,2,1,2,3,5,3,

2,3,5,5,3,2,1,2,3,2,1,1,0xFF };


uchar spe1_Time[] =

{ 2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0xFF };


uchar spe2_Tone[] =

{ 1,3,3,3,3,5,4,2,5,3,7,6,5,5,7,4,4,3,6,7,2,1,0xFF };

uchar spe2_Time[] =

{ 2,1,1,2,1,1,1,2,1,1,3,2,1,1,2,4,1,1,2,1,1,1,0xFF };


uchar spe3_Tone[] = { 0,1,2,3,4,5,5,6,7,8,9,10,11,12,13,14,15,

15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0xFF}; 


uchar spe3_Time[] =

{ 1,1,1,1,1,1,1,1,1,1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 

1, 1, 1,1,1,1,1,1,1,1,1,1,0xFF};


uchar spe4_Tone[] =

{ 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,5,1,1,5,1,0xFF };


uchar spe4_Time[] =

{ 2,1,1,1,2,1,1,1,2,1,1,2,1,1,3,0.5,0.25,0.5,0.25,1,1,

0.5,0.25,0.5,1,1,1,1,3,1,1,3,0xFF };


uchar *spe_Tone_Ptr[]={

        spe1_Tone,spe2_Tone,spe3_Tone,spe4_Tone},

                *spe_Time_Ptr[]=

        {spe1_Time,spe2_Time,spe3_Time,spe4_Time}; 

        

        uint Tone_Idx = 0; 

        

        uint i = 0,j=1,spe_Idx = 0; 

        

        uint FALSE = 0, TRUE = 1, Pause = 1; 

        

        void delay_1ms(void)

        {

                uint i;

                for(i=1;i<(uint)(153*143-2);i++)

                        ;

        }

        

        void delay(unsigned int n)

        {

                unsigned int i;

                

                for(i=0;i                        

                        delay_1ms();

        }

        

        uchar KeyMatrix_Down()

        {

                DDRB=0XF0;

                PORTB=0X0F;

                delay(1);

                return PINB!=0x0f? 1:0;

        }

        

        void Keys_Scan()

        {

                switch(PINB)

                {

                case 0B00001110: key_0=0; break;

                case 0B00001101: key_0=1; break;

                case 0B00001011: key_0=2; break;

                case 0B00000111: key_0=3; break;

                default:key_0=0xFF;

                }

                

                DDRB=0x0F;

                PORTB=0xF0;

                delay(1);

                

                switch(PINB)

                {

                case 0B11100000: key_0+=0; break;

                case 0B11010000: key_0+=4; break;

                case 0B10110000: key_0+=8; break;

                case 0B01110000: key_0+=12; break; 

                default: key_0= 0xFF;

                }

        }

        

        int main() 

        {

                DDRB=0xFF;

                PORTB=0xFF;

                

                

                DDRA=0xFF;

                PORTA=0xFF; 


                DDRC=0xFF;

                PORTC=0xBF; 

                

                DDRD|=BIT(PD7);

                PORTD&=~BIT(PD7);

                

                DDRD=~(BIT(PD2)|BIT(PD3));

                PORTD=BIT(PD2)|BIT(PD3); 

                

                MCUCR=0x82; 

                GICR=BIT(INT0)|BIT(INT1); 

                

                TCCR1A=0x00; 

                TCCR1B=0x09;

                SREG=0x80;

                

                while(1)

                        

                {

                        if(KeyMatrix_Down()==0)

                                

                        {

                                if(Pause)

                                {

                                        continue;

                                }

                                TCCR1B=0x01; 

                                

                                Tone_Idx=spe_Tone_Ptr[spe_Idx][i];

                                if(Tone_Idx==0xFF)

                                {

                                        

                                        delay(200);

                                        i=0; 

                                        continue;         

                                }

                                

                                TIMSK=BIT(TOIE1); 

                                

                                delay(spe_Time_Ptr[spe_Idx][Tone_Idx]*200/26);

                                

                                TIMSK=0x00; 

                                

                                i++; 

                        }

                        else  

[1] [2]
关键字:avr单片机  定时  中断  电子琴 引用地址:avr单片机定时与中断做的电子琴(仿真+程序)

上一篇:avr单片机带小数点数码管的程式
下一篇:ATmage128内部EEPROE的应用程序

推荐阅读最新更新时间:2024-11-07 15:03

基于AVR单片机和组态王的陶瓷检测系统设计
摘要:针对国内的陶瓷性能检测仪自动化程度不高、检测精度低、检测范围比较窄,可视化差等情况,设计开发了一种基于AVR ATmega128单片机和北京亚控公司的组态软件的陶瓷检测实时控制系统。该系统运用虚拟仪器组态王作为上位机,辅以ATmega128单片机为核心的变参数的模糊神经网络PID控制器,对陶瓷性能进行检测。经现场使用表明,该系统检测精度高、范围广、可视化程度高,使用方便。 0 引言 在城市的建设进程中,越来越注重绿色环保理念,然而使用实心砖会造成资源的巨大浪费,因此空心砖的使用量急剧增长。生产空心砖需要大量的生态陶瓷材料,但相应的陶瓷材料的性能检测工具还很不完善。研制高性能生态陶瓷性能检测仪具有重要的现实意义。本文以陶
[单片机]
基于<font color='red'>AVR单片机</font>和组态王的陶瓷检测系统设计
51单片机(二十八)—— 外部中断实验
一、外部中断介绍 在前面文章中,我们对中断的概念进行了介绍。STC89C516单片机内部有6个中断源,它们分别为: INT0—外部中断0,由P32端口线引入,低电平或下降沿触发中断。 INT1—外部中断1,由P33端口线引入,低电平或下降沿触发中断。 T0—定时器/计数器0中断,由T0计数器计满回零引起。 T1—定时器/计数器1中断,由T1计数器计满回零引起。 T2—定时器/计数器2中断,由T2计数器计满回零引起。 TI/RI—串行口中断,串行端口完成一帧字符发送/接收后引起。 在定时器实验中,我们已经对T0、T1、T2中断进行了学习,本文我们对INT0和INT1这两个外部中断进行学习。与这两个外部中断
[单片机]
51单片机(二十八)—— 外部<font color='red'>中断</font>实验
利用随处可见的 555 定时器 取代 LED 驱动器的uP 控制
摘要 本文详细介绍如何使用便宜的 555 定时器,在一些不需要 LED 驱动器全部功能的应用中,代替微处理器对专用 LED 驱动器实施控制。这样做可让用户在降低总系统成本的同时,维持 LED 驱动器的恒定电流。 相比几年以前,现在使用 LED 的应用越来越多。这些应用从高端视频显示器到低端照明应用,不一而足。设计人员通常只需要专用 LED 驱动器的部分功能,但却无力负担控制它们所需的微处理器的相关成本费用。 专用LED驱动器常常被设计为微处理器控制型,旨在实现诸如模拟或脉宽调制(PWM) LED 电流控制、每个 LED 的独立控制、LED 状态和故障信息读取等特性。对于一些仅要求恒定 LED 电流的应用(例如:LED 照明
[嵌入式]
利用随处可见的 555 <font color='red'>定时</font>器 取代 LED 驱动器的uP 控制
s3c2410中断处理程序
s3c2410 中断程序 在此要注意的是区别中断向量表和异常向量表。中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。 以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。 定义中断向量表的物理地址: 代码 .equ pISR_DABORT , (_ISR_STARTADDRESS+0x10) .equ pISR_RESERVED, (_ISR_STARTADDRESS+0x14) .equ pISR_IRQ , (_ISR_STARTADDRESS+0x18) .equ pISR_FIQ , (_ISR_
[模拟电子]
一起学mini2440裸机开发(五)--定时器0的基础实验
实验前的准备 既然是关于定时器的实验,肯定要用到系统时钟,所以一定要保证系统时钟设置好,在这里需要的PCLK为50MHz。第二节分析MDK自带的S3C2440.c可以知道,默认的是不初始化系统时钟(是否选择初始化可以通过修改S3C2440.s中的CLOCK_SETUP来选择)。那么在这里首先修改一下S3C2440.s,对时钟进行初始化。 在这里只需要设置一处即可将 CLOCK_SETUP EQU 0修改为CLOCK_SETUP EQU 1,这样系统在启动时就会对咱们的芯片进行初始化,初始化之后的系统时钟值为:FCLK=300MHz,HCLK=100MHz,PCLK=50MHz。 实验1 实验实现的功
[单片机]
一起学mini2440裸机开发(五)--<font color='red'>定时</font>器0的基础实验
LPC2292的伪中断与伪中断处理
引言   工业以太网具有比现场总线更好的性能,正处于不断发展完善当中,因此研制基于工业以太网的设备具有很好的市场前景。本文设计的嵌入式控制器采用了基于ARM7TDMIS的微控制器LPC2292 。控制器的底层与现场总线CAN相连,向上与Ethernet/IP工业以太网相连。为提高可靠性,应用了冗余控制技术,备有一个一模一样的冗余控制器。通过LVDS接口,控制器与冗余控制器相连,并相互在线监测。同时,本文采用了嵌入式实时操作系统μC/OS-II 。   嵌入式控制器采用高性能的32位单片机LPC2292。但是LPC2292在正常工作中存在产生伪中断的可能性。如果不进行正确处理的话,可能产生严重的后果。本文对此进行了全面的分析,针对不
[单片机]
无需更换电池的数字倒计时定时
只需 MCU、LCD、32kHz 晶振以及一个电阻器即可构成一部基本的倒计时定时器,而且只需一颗普通的纽扣电池即可实现连续超过 10 年的工作时间,如图 1 所示。例如,此类倒计时定时器可用于餐馆提供服务时间保证,服务人员按下一个按钮即可启动倒计时定时器,微控制器开始自动倒计时,时间长短可预先设定,倒计时过程则会显示在显示屏上。如果服务人员在计时结束前尚未向客人提供服务,那么显示器就会闪动显示超时信息,提示未达到服务保证。有两大关键性设计可最小化功耗,并尽可能延长电池使用寿命,一是认真选择电池,二是充分利用 MCU 的低功耗模式。 我们之所以选择 CR2032 纽扣式锂电池,主要是因为它占地较小,可以支持便携式应用,放电曲线
[单片机]
STM32F103程序设计-7-引脚输入功能-按键(中断
AFIO时钟的打开。外部中断、重映射、复用功能?当配置AFIO六个寄存器中的值时就需要打开AFIO时钟。 void EXTI0_Config(void) { /* Enable GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Configure PA.00 pin as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
[单片机]
STM32F103程序设计-7-引脚输入功能-按键(<font color='red'>中断</font>)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved