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-17 17:02

MSP430学习笔记3----定时器学习
先给出框图 随便从百度文库上找了个定时器程序,分析下。 1 #include msp430g2553.h 2 void main (void) 3 { 4 WDTCTL = WDTPW + WDTHOLD; 5 6 7 TA1CTL|=TASSEL_2+TACLR+MC_3+ID_3;//采取内部时钟源1.04M,八分频,增减计数模式 8 TA1CCTL0=CCIE;//启用定时器中断 9 TA1CCR0=65535;//计数1S 10 P1DIR|=BIT0; 11 _EINT(); 12 //LPM4; 13 while(1); 14 } 15 #pragma vecto
[单片机]
MSP430学习笔记3----<font color='red'>定时</font>器学习
ATmega32 复位与中断处理
AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位I 也置位时,中断可以发生。根据程序计数器PC 的不同,在引导锁定位BLB02 或BLB12 被编程的情况下,中断可能被自动禁止。这个特性提高了软件的安全性。详见 P240“ 存储器编程” 的描述。 程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见P42 “中断” 。 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高 的优先级,第二个为 INT0 – 外部中断请求 0。通过置位通用中断控制寄存器 (GICR) 的 IVSEL,中断向量可以移至
[单片机]
基于STR7 ARM微控制器的IRQ中断防御体系
1 引言 ARM7TDMI体系的中断向量的地址是动态分配在中断向量控制器的寄存器中,例如,意法半导体(ST)公司生产的STR71x系列ARM微控制器,其增强型的中断控制器(EIC)的EIC_IVR寄存器(中断向量寄存器)、EIC_SIRn寄存器(源中断寄存器)都是用于存储相关中断通道的中断服务程序在存储器中的地址,内核响应IRQ中断后,再根据当前对应的中断通道的中断向量进行散转,执行相应的中断服务程序。对于一般的8位MCU,通常是将向量中断人口固定分配ROM中,例如MCS-51单片机各个中断的人口地址是固定的。两者相比,ARM的中断体系具有较大的灵活性,但却降低了安全性和可靠性;MCU的中断向量体系虽然失去了灵活性,但确保了系统
[单片机]
基于STR7 ARM微控制器的IRQ<font color='red'>中断</font>防御体系
AVR单片机程序——电脑键盘(P/S2口协议)——pckey
#include avr/io.h #include avr/interrupt.h #include inttypes.h #include avr/delay.h #include avr/signal.h #include scancodes.h #include 74c922.h #define GETPSDATA() ((PIND PIND7)&0x1) //connect to PD7 #define GETPSCLK() ((PIND PIND2)&0x1) //connetc to PD2 static unsigned char IntNum = 0; //count the in
[单片机]
stm32f103定时中断
stm32为我们提供了8个定时器,分为:通用是定时器(TIM2~TIM5),高级定时器(TIM1和TIM8),基本定时器(TIM6和TIM7)。 至于三者之间的区别可以参考以下博客:https://blog.csdn.net/dukai392/article/details/72058041 本次我们主要讨论的是通用定时器的基本知识以及更新中断的配置过程。 通用定时器框图如下: 由于stm32的定时器十分复杂,功能特多而本次我们只讨论他的计数跟新功能(定时)。 时钟的选择: 由框图中红色部分可知定时器的时钟来源有三个:内部时钟(CK_INT),外部时钟(TIMx_ETR),其他定时器的时钟(ITR0-ITR
[单片机]
stm32f103<font color='red'>定时</font>器<font color='red'>中断</font>
PIC单片机PIC18F26K80中断优先级图
上图中,高优先级为红色线的上半部分,低优先级为红色的下半部分。其中一个中断源在上半部分和下半部分都有的,表示它既可以设为高优先级,也可以设为低优先级。如TMR0(定时器0)在上半部分和下半部分都有;而INT0(外部中断0)只在上半部分有,在下半部分没有,表示它只能设置为高优先级,不能设置为低优先级。21ic基础知识
[单片机]
PIC单片机PIC18F26K80<font color='red'>中断</font>优先级图
基于AVR单片机的有害气体红外感应及语音警示控制系统
0引言 利用红外感应系统感应附近有无有害气体,当红外感应系统感受到有有害气体接近时,送出持续一段时间的高电平;单片机通过开启中断,启动语音芯片,单片机通过串口通信,从上位机提取的有害气体参数提示给附近人体,并经过与安全值的比较判定当前环境是否安全。对语音芯片的使用,先将必要的文字、数字信息录制进去,放音时,通过单片机自动寻址,把实时参数读取出来。为便于以后系统改进或移植到其他系统,可设计录音、放音电路,通过切换录制不同内容。系统设计友好、方便,给人的信息也更加直接。 1系统总体设计方案 在气体浓度是现有可利用的数据的基础上,考虑了系统的衔接性和可移植性。系统总体方案见图1。 本系统分为四大模块:核心控制模块、语音电路模块
[单片机]
基于<font color='red'>AVR单片机</font>的有害气体红外感应及语音警示控制系统
AVR单片机教程——数码管
先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低。这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存器DDRx中DDxn位控制的,可以推断出 pin_mode 函数会改变一个引脚对应的DDxn值,输入为0,输出为1,而其复位后的值为0,即输入,因此如果不把引脚配置为输出,它的模式就是输入。类似地 pin_write 函数会改变PORTxn,其值为函数的第二个参数。 所以不配置输出而写高电平的结果就是,这一引脚的DDxn为0,PORTxn为1,是带上拉电阻的输入模式。上拉电阻相当于VCC接电阻后再接在引脚上,外部电路是引脚
[单片机]
<font color='red'>AVR单片机</font>教程——数码管
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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