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

📄 text.c

📁 MSC1210的ADC采集以及RS232通讯读写CPLD的例子程序
💻 C
字号:

#include <REG1210.H>      /* special function register 1210       */
#include <stdio.h>        /* standard I/O .h-file                 */
#include <rtx51tny.h>	  /* RTX-51 tiny functions & defines      */
#include <stdlib.h>
#include <string.h>
#include <16b.h>

#define uint  unsigned int
#define uchar unsigned char


sbit   DAC8532=P1^4;         /*dac8532					*/    
char   data strx[6];
unsigned char data ccnun=4,chanl_n=0;   
uint   daval;
int data_buf[10];
int testad=0;
//void Uart0Send(char card_add,char f,int a,int DATA[],uchar len1 ,uchar len);				
/*write dac8532 */
void write_8532(unsigned int val,unsigned char port) 
{
    uchar i;
	SPICON = SPICON_8532;
	DAC8532 =0;
	for(i=0;i<5;i++)
	{;}
    if(port==1)
	{
		while((AIE&0X08)!=0X08){}SPIDATA=Dac8532A;
		while((AIE&0X08)!=0X08){}SPIDATA=((val>>8)&0xFF);
    	while((AIE&0X08)!=0X08){}SPIDATA=((val)&0xFF);
	}
	if(port==2)
	{
		while((AIE&0X08)!=0X08){}SPIDATA=Dac8532B;
		while((AIE&0X08)!=0X08){}SPIDATA=((val>>8)&0xFF);
    	while((AIE&0X08)!=0X08){}SPIDATA=((val)&0xFF);
	}
	for(i=0;i<5;i++)
	{;} 
	DAC8532 =1;
}

/****int to char  ******/
char* itoa(int argc)
{
	char data s[6];
	sprintf(s,"%d",argc);
	return s;
}


   /****串口0发送子程序 ******/  
void Uart0Send(char card_add,char f,int a,int DATA[],uchar len1 ,uchar len)
{
	uchar xdata i=0,j=0;
	uchar data dd[6];
	TI_0=0; 
	SBUF0='F';  
	while(!TI_0);
	TI_0=0;
	SBUF0='F';  
	while(!TI_0); 
	TI_0=0;
	SBUF0=ADDRESS;  
	while(!TI_0); 
	TI_0=0;
	SBUF0=card_add;  
	while(!TI_0); 
	TI_0=0;
	SBUF0=f;  
	while(!TI_0); 
	TI_0=0;
	j=0;
	strcpy(dd,itoa(a));          
	while(dd[j])
	{
		SBUF0=dd[j++];  
		while(!TI_0);
		TI_0=0;
	}  
	if(len!=0)
	{
		SBUF0=',';  
		while(!TI_0);
		TI_0=0; 
		for(i=len1;i<(len+len1);i++)
		{
			j=0;
	    	strcpy(dd,itoa(DATA[i]));          
	    	while(dd[j])
	    	{
				SBUF0=dd[j++];  
		    	while(!TI_0);
				TI_0=0;
	    	}  
			if (i != (len+len1-1))
	    	{
		    	SBUF0=',';  
		    	while(!TI_0);
				TI_0=0; 
	    	}	
		}
	}
	SBUF0='E';  
	while(!TI_0); 
	TI_0=0;
	SBUF0='E';  
	while(!TI_0); 
	TI_0=0;
	SBUF0='\n';  
	while(!TI_0); 
	TI_0=0;
}

      /*串口0数据处理子程序*/
void read_cmd(char i_cmd_buf, char* rebuf)
{
	char i=0,j=0,k=0, *p1,*p2,*p3;
	p1=&h_cmd.buf[i_cmd_buf];
	p2=rebuf;

	while (i<5)  //数字前面字符的个数5
	{
		*p1++=*p2++;
		i++;
	} 
	p3=&strx[0];
	for (i=0;i<=6;i++)strx[i]=0; //整型最多6个字符				
	while (1)
	{
		if (*p2==69) // If ASCII 'E' 
		{    						
			h_cmd.buf[i_cmd_buf].da[j++]=atoi(strx);
			break;
		}
		if (*p2==0x2c) // If ASCII ',' 
		{						
			h_cmd.buf[i_cmd_buf].da[j++]=atoi(strx);
			for (i=0;i<=6;i++)strx[i]=0;
			p2++;
			p3=&strx[0];
		}
		else *p3++=*p2++;
	}
	Serial0_Receive.buf_present_pos = 0;           //Now location of buffer,initial value is buf_start
	Serial0_Receive.pre_char = 0;                  //Prechar of present position,initial value is 0
	Serial0_Receive.cmd_finish = 0;                //This is 1 command end has been accepted ,initial value is 0
}
/* initial spi ,SPICON在各自的子程序中设置*/
void init_spi(void)
{
	P1DDRH=0x75;	        /* SPI port setup */
	SPITCON=SCLK_EN|DRV_EN;
    PDCON &= ~(PDSPI);		/* turn on SPI  */
}

 /* initial ADC */
void init_adc(void)
{          	
	int decimation=720; 						/* factor of extractive  */
    EAI = CLEAR;				  
	ACLK = 4;									/* ACLK = 11.0592 MHz/(9+1) = 1.10592 MHz */
	ADCON0 &= (~(BOD|EVREF|VREFH|EBUF)|PGA_1);	/* Vref Off,Extenal Verf,Buff off,BOD off, PGA=1 */
	ADCON1 = (POL|SM_3|CAL_1);					/* Unipolar, sinc3, self calibration, offset, gain */
	ADCON2 = decimation & 0xff;					/* LSB of decimation */
	ADCON3 = (decimation >>8)&0x07;				/* MSB of decimation */
	SSCON = CLEAR;
	ADMUX = INP_0|INN_COM;						/* Select AIN0+/Acom- */
	adcsum.ps = CLEAR;							/* buffer sp clear */
    AIE = AD_EN;    							/* Enable Aux Interrupt */
	EAI=SET ;									
	AI=CLEAR;
}


/*initial serial port0*/
void serial0_init (void)               //串口0的初始化
{
    PCON |=0x80;
    SCON0  = 0x50;                     /* mode 1: 8-bit UART, enable receiver   */
    TMOD |= 0x20;                      /* timer 1 mode 2: 8-Bit reload          */
    TH1 = 0xfa;                        /* reload value 9600 baud                */
    TR1 = 1;						   /* timer 1 run                           */
    IE=0x80;
    ES0 = 1;						   /* enable serial port interrupt          */
}

/* serial processing */
serial () interrupt 4 using 2       
{
    unsigned char data c;
    if (RI)                          
    {
    c = SBUF;                        
    RI = 0;                         

	    switch (c)  {                    
	      case 'F':
	        if(Serial0_Receive.pre_char=='F'){
			Serial0_Receive.buf[Serial0_Receive.buf_present_pos++]=c;
			Serial0_Receive.pre_char=c;
			Serial0_Receive.cmd_finish=FALSE;
			}
			else 
			{Serial0_Receive.buf[Serial0_Receive.buf_present_pos++]=c;
			Serial0_Receive.pre_char=c;
	        }
			break;
	
	      case 'E':
	        if(Serial0_Receive.pre_char=='E'){
			Serial0_Receive.buf[Serial0_Receive.buf_present_pos++]=c;
			Serial0_Receive.pre_char=c;
			Serial0_Receive.cmd_finish=TRUE;
			isr_send_signal (INCEPTBUF0);	//唤醒串口1数据处理任务
			}
	        else {
			Serial0_Receive.buf[Serial0_Receive.buf_present_pos++]=c;
			Serial0_Receive.pre_char=c;
			}
			break;
	
	      default:                       /* read all other characters into inbuf  */                                     
	        if (Serial0_Receive.cmd_finish==FALSE){
			Serial0_Receive.buf[Serial0_Receive.buf_present_pos++]=c;
	 	    Serial0_Receive.pre_char=c;
			}
	        break;
	    };
   }

}

       /*辅助中断服务程序*/
assistant_proc() interrupt 6 using 3
{
	signed long int xdata result;
	switch(PAI&0x0f)
	{
		case 0x06://adc滤波中断
		{
			if (ccnun--)	result=unipolar();				// Dummy read to clear ADCIRQ
			else
			{			
				result=unipolar();							// read to clear ADCIRQ
				adcsum.buf[adcsum.ps]=result>>8;			// read to clear ADCIRQ
				switch ((chanl_n++)&0x01)
				{
					case 0:
					{
						ADMUX=((chanl_n+1)<<3)|0x08;																																																																																																																																		
						adcsum.ps=(chanl_n+1)>>1;
					}break;
					case 1:
					{
						ADMUX=0x08;
						adcsum.ps=0;
					}break;
				}
				chanl_n= (chanl_n<8)? chanl_n : 0 ;
				ccnun=4;	
			}
		}break;

	}
	AI=CLEAR;
}

 /******************************************************************************/
/*        Task 0 'init': Initialize                                           */
/******************************************************************************/
void init (void) _task_ INIT  /* program execution starts here        */
{      
    init_spi();
    serial0_init();
    init_adc();
    PDCON |= PDWDT;						/* turn oFF WatchDog  */
 	WDTCON |= EWDT;         			/* set ewbt            */
 	WDTCON &= ~EWDT;        			/* clear ewbt set timeout=8,900ms    */
    PDCON &= ~(PDSPI|PDAD);		        /* turn on SPI and ADC device */ 
    h_cmd.in_p = CLEAR;
    h_cmd.exe_p = CLEAR;
    h_cmd.cont = CLEAR;
	Serial0_Receive.buf_present_pos = 0;           /*Now location of buffer,initial value is buf_start*/
	Serial0_Receive.pre_char = 0;                  /*Prechar of present position,initial value is 0*/
	Serial0_Receive.cmd_finish = 0;                /*This is 1 command end has been accepted ,initial value is 0*/
	TI_0=0; 
	TI_1=0; 
    DAC8532 =1;
    os_create_task (LOGIC_JUDGE);
    os_create_task (COMMAND);
    os_create_task (INCEPTBUF0); 
	os_delete_task (INIT);              /* stop init task (no longer needed)    */
}

/*--------------------------------------------------------------------------
                      读写CPLD
---------------------------------------------------------------------------*/

void logic_judge (void) _task_ LOGIC_JUDGE  
{	
    int data i=0;
	while(1)
	{
		os_wait (K_TMO, 50,0);
	    for(i=0;i<5;i++)
        {
            *(W_ADDRESS+i)= adcsum.buf[i]>>1; 
    		data_buf[i]=adcsum.buf[i]>>1; 
        }
		Uart0Send(card_addr,cmdf_read,0,data_buf,0,7);
	//	for(i=0;i<10;i++)
	//	{
	//		DA[i]=*(W_ADDRESS+64+i);
	//	}
	//	printf("\n%d,%d,%d,%d,%d,%d,%d,%d,%d,%d mmm\n",DA[0],DA[1],DA[2],DA[3],DA[4],DA[5],DA[6],DA[7],DA[8],DA[9]);
		//daval=DA[0];
       // write_8532(daval,2);
	//	Uart0Send(card_addr,cmdf_read,0,DA,0,10); 
	}
}
/******************************************************************************/
/*                                串口0数据处理任务                          */
/******************************************************************************/
void inceptbuf0 (void) _task_ INCEPTBUF0 
{
	while(1)
	{
		os_wait (K_SIG, 0, 0);
		if(h_cmd.in_p<4)
		{		
			read_cmd(h_cmd.in_p, Serial0_Receive.buf);
			h_cmd.in_p++;
			h_cmd.in_p=h_cmd.in_p&3;
			h_cmd.cont++;
		}
		os_clear_signal(INCEPTBUF0);
	}
}

/******************************************************************************/
/*                              命令处理任务                                 */
/******************************************************************************/
void command (void) _task_ COMMAND       
{
	uint valtemp=0,i;
	while(1)
	{
		os_wait (K_TMO, 20,0);	
        if(h_cmd.cont>0)    //h_cmd.cont命令数大于0
        {
			if(h_cmd.buf[h_cmd.exe_p].n==ADDRESS)  //如果站地址等于'z'
    		{
				if(h_cmd.buf[h_cmd.exe_p].a==card_addr)  //功能地址为板地址
				{
					if(h_cmd.buf[h_cmd.exe_p].f==cmdf_read)
					{
						if(h_cmd.buf[h_cmd.exe_p].da[0]==0)
						{
                   			Uart0Send(card_addr,cmdf_read,0,data_buf,0,7);
 					    }
					}
					else if(h_cmd.buf[h_cmd.exe_p].f==cmdf_write)
					{
						if(h_cmd.buf[h_cmd.exe_p].da[0]==1)
						{
							valtemp=h_cmd.buf[h_cmd.exe_p].da[1];
							data_buf[5]=valtemp;
							write_8532(valtemp,1); 
							valtemp=0;
						}
						else if(h_cmd.buf[h_cmd.exe_p].da[0]==2)
						{
							valtemp=h_cmd.buf[h_cmd.exe_p].da[1];
							data_buf[6]=valtemp;
							write_8532(valtemp,2); 
							valtemp=0;
						}
					}
				}	    
    		}
			h_cmd.cont--;
			h_cmd.exe_p++;
			h_cmd.exe_p=h_cmd.exe_p&3;
		}
	}
}

⌨️ 快捷键说明

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