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

📄 main.c

📁 DSP中实现的RS编码+MFSK调制的实现
💻 C
字号:
  
//--------------head_file-----------------
#include   <stdio.h>
#include "registers.h"  
#include "initialize.h"
#include "signal_process.h"

//-----------macro defination-------------
#define   N0  15    //码块的长度
#define   L   11    //信息块的长度 
#define   m    4    //每信息符代表的位数
#define   NUM_MCU  2000 //从单片机接受的数据的大小

//--------Global variable
int dIn,dOut,dRs;
unsigned int dataIn[NUM_MCU];
unsigned int out4bit[2*NUM_MCU];
unsigned int int_i=0;
unsigned int count_rs=0;
//---------Function prototypes-----------------
void RSbianma();
void mfsk(int input[]);  
interrupt void timer0();
//-------------main routine---------------------
void main()
 {
 unsigned int i=0,j=0;
 unsigned int data_temp;
 asm(" bset intm ");      //禁止所有可屏蔽中断
 *CLKMD=0x6193;           //时钟信号3倍频
 *SYSR=0x0002;            //clkout4分频
 
 *IVPD=0x0002;            //中断向量指针
 *IVPH=0x0002;  

 init_emif();             //初始化外部存储器
 
 init_mcBSP1();           // 初始化bsp1
 open_mcBSP1();           //打开bsp1口
 for(;;)                  //通过bsp1口从MCU读数
 { 
 while(((*SPCR1_1>>1) & 0x01)==0);
 dataIn[i]=(*DRR1_1);
 i++;
 if(i>=NUM_MCU)
 break;
 }
 close_mcBSP1();           //关闭bsp1口

 for(i=0;i<NUM_MCU;i++)    //把从mcu读的数转化为多进制
 {
// dataIn[i]=0x55;
 data_temp=dataIn[i];
 dataIn[i]=dataIn[i]>>4;
 out4bit[j]=(dataIn[i] & 0x08)+(dataIn[i] & 0x04)+(dataIn[i] & 0x02)+(dataIn[i] & 0x01);     
 j++;
 data_temp=data_temp & 0x0F;
 out4bit[j]=(data_temp & 0x08)+(data_temp & 0x04) +(data_temp & 0x02)+(data_temp & 0x01);  
 j++;

 }
                   
 *ST1_55 &=0xDFFF;                  //XF选通DA片选

 init_mcBSP2();                     //初始化bsp2
 open_mcBSP2();                     //打开bsp2口
 asm(" bclr  intm ");               // 打开可屏蔽中断
 asm(" mov #10000b,mmap(@IER0) ");  //在中断使能寄存器中使能相应的中断 
 init_timer0();
 while(1)
 {
 if(count_rs<NUM_MCU)
 {RSbianma();        //进行一次编码
  open_timer0();     //打开定时器     
  mfsk(RSout);       //调制输出12次                              
  close_timer0();}   //关闭定时器
 else
 {
(*DXR1_2)=400; 
      } 
     }
       
       }

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//@@@@@*************编码函数
void RSbianma()
{  
	int j,data[L]={0};
    initial(m);                        
    GenGx(m,N0,L);                   
 
	for(j=0;j<2;j++)
	data[j]=out4bit[2*count_rs+j];

	Encode(data,g,m,N0,L);
    count_rs++;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void mfsk(int input[])      //调制函数
{
	unsigned int i,j;
	int data2[12]={0};
	     
  for(i=0;i<12;i++)
  {
//************send synchronous signal
	if(i%12==0)
	{
	for(j=0;j<4;j++)
	{
	for(;;)
	{(*DXR1_2)=si_inter[int_i]; 
	if(int_i>881)
	 {int_i=0;break;}}
	 }
	for(;;)
	{(*DXR1_2)=si_syn_start[int_i]; 
	if(int_i>219)
	{int_i=0;break;} }
    //@@@同步信号后接着发间隔信号
	for(;;)
	{(*DXR1_2)=si_inter[int_i]; 
	if(int_i>881)
	 {int_i=0;break;}}
	}
    //@@@**********send signal of 00 01 10 11
	data2[i]=input[2*i+1]+input[2*i]*2;
	if(data2[i]==0)
	{ for(;;)
	{(*DXR1_2)=s00[int_i]; 
	if(int_i>440)
	{int_i=0;break;}}
	 }
	else if(data2[i]==1)
	{for(;;)
	{(*DXR1_2)=s01[int_i]; 
	if(int_i>440)
	{int_i=0;break;}}
	 }
	else if(data2[i]==2)
	{for(;;)
	{(*DXR1_2)=s10[int_i]; 
	if(int_i>440)
	{int_i=0;break;}}	 
	 }
	else if(data2[i]==3)
	{for(;;)
	{(*DXR1_2)=s11[int_i]; 
	if(int_i>440)
	{int_i=0;break;}}	 
	 }
//@@@@@@@@************send signal of interval 
	 for(;;)
	{(*DXR1_2)=si_inter[int_i]; 
	 if(int_i>881)

	 {int_i=0;break;}}
      }	     
	  return; 
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//@@@@******中断服务子函数
	interrupt void timer0()
	{
	 int_i++;
	}

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

⌨️ 快捷键说明

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