⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电子琴.txt

📁 采用TMS320LF2407实现电子琴演奏功能
💻 TXT
字号:


#include "2407A.h"  

void initial();                                     /*初始化子程序 */ 
void timer3initial();                               /*定时器3初始化子程序 */
void pwminitial();                                  /*PWM初始化子程序 */

unsigned int CMPR1;	        		    /*设置PWM周期变量 */
unsigned int T1PER;			            /*设置Timer1周期变量 */

void inline disable()
{
	asm(" SETC INTM");	                    /*禁止所有中断*/
}

void inline enable()
{
	asm(" CLRC INTM");	                    /*开放所有中断 */
}


void initial()
{
	asm(" SETC SXM");                           /*抑制符号位扩展 */ 
	asm(" SETC OVM");                           /*根据遇到溢出的情况,累加器被设置为它的最大正值或负值 */
	asm(" SETC CNF");                           /*B0被设置为程序存储空间 */

	*SCSR1=0X87FE;			            /*clock=fin;使能ADC、SCI、SPI、CAN、EVA、EVB模块*/	
	*WDCR=0X0E8;                                /*不使能看门狗*/
	
	*IMR=0X0002;				    /*允许INT2中断*/
	*IFR=0X0FFFF;				    /*清除全部中断标志*/
	WSGR=0X00;				    /*禁止所有等待状态*/
	
	*MCRA=*MCRA|0X0040;			    /*IOPA6端口设置为基本功能,PWM1 */
	*MCRC=*MCRC&0X0FF00;                        /*IOPE端口设置为一般的I/O功能 */

        *PADATDIR=*PADATDIR|0X4000;                 /*IOPA6设置为输出方式*/ 
	*PEDATDIR=*PEDATDIR|0X0000;		    /*IOPE端口设置为输入方式*/ 
}

void  timer3initial()
{
	*EVBIMRA=*EVBIMRA|0X0080;	            /*允许定时器3的周期中断 */
	*EVBIFRA=*EVBIFRA|0Xffff;	            /*清除定时器3周期中断标志*/
	*T3CON=0X170C;			            /*Timer3为连续增计数模式,预分频值为128,使用内部时钟*/
	*T3PER=0X0c350;			            /*Timer3的周期寄存器的值根据0.64s延时和预分频值确定,改状态*/
	*T3CNT=0X0000;			            /*Timer3的计数器清零*/
}

void  pwminitial()
{
        *ACTRA=0X0002;                              /*PWM1高有效*/   
        *DBTCONA=0X0000;                            /*不使能死区控制*/
        *CMPR1=CMPR1;                               /*设置CMPR1,以确定输出占空比*/                                            
        *T1PER=T1PER;                               /*设置Timer1周期寄存器,以确定PWM周期*/
        *COMCONA=0X8200;                            /*使能比较操作*/
        *T1CON=0X100C;                              /*Timer1为连续增计数模式,预分频值为1,使用内部时钟*/
}

void interrupt T3_INT()
{
	unsigned int flag;
        unsigned int key;

	flag=*EVBIFRA&0X0080;
	if(flag!=0X0080)
	{
                enable();                           /*开中断*/
                return;                             /*中断返回 */ 
        }			
		
        *T3CNT=0X0000;     		            /*Timer3计数器清零*/
	*EVBIFRA=*EVBIFRA|0X0080;       	    /*清除定时器3周期中断标志 */

	key=*PEDATDIR&0X00FF;
	switch(key)
	{	
	        case 1:                             //do  00000001
			  CMPR1=0X4A9C;                   
			  T1PER=0X9538;             /*F=261.5Hz,T=3.82ms */
                          pwminitial();             /*PWM输出初始化 */
                          *T1CON=*T1CON|0X0040;     /*启动Timer1 */ 
			  break;
		case 2:	                            //re  00000010
			  CMPR1=0X429A;                   
			  T1PER=0X8534;             /*F=293.4Hz,T=3.41ms */
                          pwminitial();             
                          *T1CON=*T1CON|0X0040;    
			  break;
		case 4:	                            //mi  00000100
			  CMPR1=0X3B60;                   
			  T1PER=0X76C0;             /*F=328.9Hz,T=3.04ms */
                          pwminitial();            
                          *T1CON=*T1CON|0X0040;     
			  break;
		case 8:                             //fa  00001000
			  CMPR1=0X37DC;                   
			  T1PER=0X6FB8;             /*F=349.2Hz,T=2.86ms*/
                          pwminitial();             
                          *T1CON=*T1CON|0X0040;     
			  break;
		case 16:                            //so  00010000
			  CMPR1=0X319C;                   
			  T1PER=0X6338;             /*F=393Hz,T=2.54ms*/
                          pwminitial();             
                          *T1CON=*T1CON|0X0040;     
			  break;
		case 32:                            //la  00100000
			  CMPR1=0X2C56;                   
			  T1PER=0X58AC;             /*F=440Hz,T=2.27ms*/
                          pwminitial();             
                          *T1CON=*T1CON|0X0040;    
			  break;
		case 64:                            //si  01000000
			  CMPR1=0X37A6;                   
			  T1PER=0X4F4C;             /*F=492.1Hz,T=2.03ms */
                          pwminitial();             
                          *T1CON=*T1CON|0X0040;     
			  break;
		case 128:                           //!do 10000000
			  CMPR1=0X251C;                   
			  T1PER=0X4A38;             /*F=525.2Hz,T=1.9ms*/
                          pwminitial();             
                          *T1CON=*T1CON|0X0040;     
			  break;	
	}
	enable();				    /*开中断*/
	return;					    /*中断返回 */                   
}

void interrupt nothing( ) 
{
 	enable();
 	return;
}
                     
main()
{
	disable();
	initial();
	timer3int();
	enable();
	*T3CON=*T3CON|0X0040;			    /*启动Timer3*/
	
	while(1)
	{
	asm(" nop"); 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -