📄 text.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 + -