distm.c

来自「一个分选系统的软件:用SmallRtos操作系统」· C语言 代码 · 共 852 行 · 第 1/2 页

C
852
字号
/**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: distm.c
**创   建   人: 曾银玲
**最后修改日期: 2004年4月3日
**描        述: distm源代码。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 曾银玲
** 版  本: V1。0
** 日 期: 2004年2月22日
** 描 述: 原始版本

**------------------------------------------------------------------------------------------------------
** 修改人: 曾银玲
** 版  本: V1.0
** 日 期: 2004年7月2日
** 描 述: 根据新版本要求修改
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/



//#include <absacc.h>

//#include <reg51.h>
//#include <intrins.h>
//#include <string.h>
//#include <stdio.h>
#define  IN_DISTM

#include "config.h"       
main()
{
   init();
   
   TR0=1;
   TR1=1;
   OSStart();
}
void init(void)
{uint8 k;
    init52();
	init_12887();
	//init_16550();
	selct_page_addr();
	sp=&ram0;
	sp0=&ram1;
	for(k=0;k<0x108;k++){
		*(sp+k)=0x00;}
	for(k=0;k<0x108;k++){
		*(sp0+k)=0x00;}
            
         head00_over=0;head01_over=0;head02_over=0;

}
/*********************************************************************************************************
** 函数名称: TaskPICK
** 功能描述: PICK
** 输 入:   无
** 输 出:   无
** 全局变量: AdBuf Cell 
** 调用模块: midst OSWait
**
** 作 者: 曾银玲
** 日 期: 2004年4月28日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void TaskPick(void)
{
uint8 i,j,k;
	cj_50hz();
	cj_6k();
	anly_50hz(0);
	andata00=mdtra;
	anly_50hz(8);
	andata01=mdtra;
	anly_6k(16);
	out_xdata=mdtra;
	
	i=andata00^andata10;
	j=andata01^andata11;
	k=out_xdata^old_out;
	if(i!=0){
		memdata[cjtemp]=andata00;
		memdata[cjtemp+1]=0x66;
		cjtemp+=2;
		storage();
		andata10=andata00;}
	if(j!=0){
		memdata[cjtemp]=andata01;
		memdata[cjtemp+1]=0x77;
		cjtemp+=2;
		storage();
		andata11=andata01;}
	if(k!=0){
		memdata[cjtemp]=out_xdata;
		memdata[cjtemp+1]=0x88;
		cjtemp+=2;
		storage();}
		//old_out=out_xdata;}
}
void TaskTrans_x1x2(void)
{
uint8 temp0,temp1,i,j,highbyte,lowbyte;
	uint16 condat0;
	temp0=out_xdata&0x03;
	temp1=old_out&0x03;
	//temp2=out_xdata&0x30;//2004/10/9
	//temp3=out_xdata&0xc0;//2004/10/9
	i=temp0^temp1;
	if((i!=0)||(time_2s==1)){time_2s=0;
	      while(!trans_over){}
              SBUF=0xfc;trans_over=0;
              while(!trans_over){}
              SBUF=0x33;trans_over=0;

           if(((out_xdata&0x03)==0x01)&&((out_xdata&0xf0)==0x00)){//2004/10/09
           //if((out_xdata&0x03)==0x01){
           	tx[0]=0x44;
           	tx[1]=0x55;
           	tx[2]=0x66;
           	pbuf=&tx[0];
				condat0=getcrccode(pbuf,3);
				lowbyte=condat0&0x00ff;
				highbyte=condat0>>8;
				tx[3]=lowbyte;
				tx[4]=highbyte;
           for(j=0;j<5;j++){	
                while(!trans_over){}
                SBUF=tx[j];trans_over=0;}}
           if(((out_xdata&0x03)==0x02)&&((out_xdata&0xf0)==0x00)){//2004/10/09
           //if((out_xdata&0x03)==0x02){
           	tx[0]=0x77;
           	tx[1]=0x88;
           	tx[2]=0x99;
           	pbuf=&tx[0];
      	        condat0=getcrccode(pbuf,3);
      	        lowbyte=condat0&0x00ff;
      	        highbyte=condat0>>8;
      	        tx[3]=lowbyte;
      	        tx[4]=highbyte;
           for(j=0;j<5;j++){	
                while(!trans_over){}
                SBUF=tx[j];trans_over=0;}}
           if((out_xdata&0x03)==0x00){
           	tx[0]=0xaa;
           	tx[1]=0xbb;
           	tx[2]=0xcc;
           	pbuf=&tx[0];
      	        condat0=getcrccode(pbuf,3);
      	        lowbyte=condat0&0x00ff;
      	        highbyte=condat0>>8;
      	        tx[3]=lowbyte;
      	        tx[4]=highbyte;
           for(j=0;j<5;j++){	
                while(!trans_over){}
                SBUF=tx[j];trans_over=0;}}
           old_out=out_xdata;
              while(!trans_over){}
              SBUF=out_xdata;trans_over=0;
           }              
        	

}	

void TaskD(void)
{uint8 j;
    while (1)
    {
                if((out_xdata&0x30)==0x30){  //有问题040809,已修改041122
                	if((wave00==1)&&((out_xdata&0x01)==0x01)){alarm=1;}
                	else{alarm=0;}}
                else if((out_xdata&0xc0)==0xc0){
                	if((wave01==1)&&((out_xdata&0x02)==0x02)){alarm=1;}
                	else{alarm=0;}}
                j=clear; 	
    }
}
void TaskE(void)
{
    while (1)
    {
        OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
    }
}
void TaskF(void)
{
    while (1)
    {
        OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
    }
}
/*void storage(void)
{	uchar i,j;
	//sp=&ram0;
        j=cjtemp+6;
        read_date();
        read_time();
	     memdata[cjtemp]=date[0];
	     memdata[cjtemp+1]=date[1];
	     memdata[cjtemp+2]=date[2];
	     memdata[cjtemp+3]=date[3];
	     memdata[cjtemp+4]=date[4];
	     memdata[cjtemp+5]=date[5];
	     for(i=0;i<j;i++){
	     	*(sp+num_in)=memdata[i];num_in++;
	     	if(num_in>0xff){
	     	         bytes_write(0xff);
	     	         num_in=0;
	     	         sp=&ram0;}
	     	   }
             cjtemp=0;//variable=0;//04/10/18
}	
uint code crcCcittTable[16] =
{
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
  0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
};*/
int16 getcrccode(uint8 *point0,uint8 lenth);
int16 getcrccode(uint8 *p0,uint8 ilen)
{   uint16 i,j,crc=0;

	for(i=0;i<ilen;i++)
	{   j=(crc>>8)^(*(p0+i));
	    crc=(crc<<8)^crcCcittTable[j];
	}
	return (crc);
}

void init_16550(void)
{
    //MR=1;
    MR=0;
    UARTLCR=0x80;			//bound 80
    UARTRBR=tab[1];                     
    
    UARTIER=0;                          //0
    UARTLCR=0x0b;	//8,n,1    0x0b:odd,0x1b:even
    UARTIER=0x05;

    ACC=UARTLSR;
    ACC=UARTRBR;
    ACC=UARTRBR;
    
    re_start=0;
}
void init_12887(void)
{
     uint8 i;
     //i=RTIMED;
     RTIMEA=0x20;//分频复位70h
     RTIMEB=0x8a;//停止更新,选BCD码,24小时制
    // RTIME0=30;
     RTIME1=0xff;//XBYTE[0XFF00]=0x24;
     //RTIME2=0x33;
     RTIME3=0xff;
     //RTIME4=0x10;
     RTIME5=0xff;
     //RTIME7=0x03;RTIME8=0x05;RTIME9=0x04;
     RTIMEA=0x29;//打开晶振并允许RTC计时
     RTIMEB=0x0a;//每秒计时走一次,24小时制
     i=RTIMEC;
     i=RTIMED;
}
void write_12887(void)
{uint8 i;
      //P13=0;
      i=RTIMED;//0x80 formal 0x00 lithium battery use up
      RTIMEA=0x20; 
      RTIMEB=0x8a;
      RTIME0=date[5];
      RTIME2=date[4];
      RTIME4=date[3];
      RTIME7=date[2];
      RTIME8=date[1];
      RTIME9=date[0];
      RTIMEB=0x0a;
      RTIMEA=0x29;
      i=RTIMEC;
}

void read_time(void)
{uint8 i;//,temp0,temp1,temp2;
      do{i=RTIMEA;} while((i&0x80)==0x80);//RTIMEA==00 oprate valid
      date[5]=RTIME0;date[4]=RTIME2;date[3]=RTIME4;
      //date[2]=RTIME7;date[1]=RTIME8;date[0]=RTIME9;      
      //temp0=date[5];
      //disp[0]=temp0&0x0f;
      //disp[1]=(temp0&0xf0)>>4;
      //temp1=date[4];disp[2]=temp1&0x0f;disp[3]=(temp1&0xf0)>>4;
      //temp2=date[3];disp[4]=temp2&0x0f;disp[5]=(temp2&0xf0)>>4;
      //display();                
}                
void read_date(void)
{uint8 i;//,temp0,temp1,temp2;
      do{i=RTIMEA;} while((i&0x80)==0x80);
      date[2]=RTIME7;date[1]=RTIME8;date[0]=RTIME9;
      //temp0=date[2];disp[0]=temp0&0x0f;disp[1]=(temp0&0xf0)>>4;
      //temp1=date[1];disp[2]=temp1&0x0f;disp[3]=(temp1&0xf0)>>4;
      //temp2=date[0];disp[4]=temp2&0x0f;disp[5]=(temp2&0xf0)>>4;//+0x80;
      //display();
}
uint8 BCD_D(uint8 bcd)
{
	return(((bcd&0xf0)>>4)*10+(bcd&0x0f));
}
//uchar D_BCD(uchar d)
//{
//	return(((d/10)<<4)+(d-(d/10)*10));
//}		
void init52(void)
{
	IE=0xb3;//EA ET2 ES ET0 EX0
	TMOD=0x21;// 16 bit timer and bound = mode 2 
	TCON=0x01;//negative trigger interrupt0
	PCON=0x00;//0x80 bound double
	SCON=0xd0;//50 8,n,1 parity:odd or even
	TH1=tab[0];
	TL1=tab[0];
	TH0=0xff;// FFc2H 7.4khz ffbf 7khz
	TL0=0xb3;//ffb4 6khz ff7d 3.5khz
	TR0=1;
	//TH2=0xff;// FFc2H 7.4khz ffbf 7khz
	//TL2=0xb3;//ffb4 6khz ff7d 3.5khz
	//TR2=1;
	TR1=1;
	//P13=1;
	trans_over=1;
}

void delay(uint16 t)
{uint16 i;//t=1 40us
	for(i=0;i<t;i++)_nop_();
	for(i=0;i<t;i++)_nop_();
}	
void eerom_start(void)
{
       CS0=1; _nop_();       
       SCK=1; _nop_();
       CS0=0; _nop_();
}

void spi_writebits(uint8 byte,uint8 num_of_bits)
{//SK上升沿数据有效
	uint8 count;
	byte=byte<<(8-num_of_bits);
	for(count=0;count<num_of_bits;count++){
		SCK=0;_nop_();_nop_();
		byte<<=1;_nop_();_nop_();
		SIN=CY;_nop_();_nop_();
		SCK=1;_nop_();_nop_();}
}		
uint8 spi_readbyte()
{//SK下降沿数据有效
	uint8 count,byte;
	for(count=0;count<8;count++){
		SCK=1;_nop_();_nop_();
		SCK=0;_nop_();_nop_();
		byte<<=1;
		if(SO){byte++;}
		//byte<<=1;
		_nop_();_nop_();}
		return (byte);
}	
void buffer1write(uint16 len,uint16 start_addr)
{uint16 i;
	uint8 m;
	eerom_start();
	spi_writebits(0x84,8);
	spi_writebits(0x00,8);
	spi_writebits(0x00,7);
	//spi_writebits(0x00,8);
	spi_writebits((uint8)(start_addr>>8),1);
	spi_writebits((uint8)(start_addr),8);
	for(i=0;i<len;i++)
	{	
		m=*(sp+i);
		spi_writebits(*(sp+i),8);}
		spi_writebits(mon>>8,8);
		spi_writebits((uint8)(mon),8);
	CS0=1;
}	
void buffer1topageprogerase(uint16 page)
{//uint i;
	eerom_start();
	spi_writebits(0x83,8);
	spi_writebits(0x00,3);
	spi_writebits((uint8)(page>>8),4);
	spi_writebits((uint8)(page),8);
	spi_writebits(0x00,4);
	spi_writebits(0x00,5);
	CS0=1;
}	

void buffer2_read(uint16 len,uint16 byteaddr)
{
        uint8 m;
        uint16 i;
        //k=len+1;
        eerom_start();

	spi_writebits(0x56,8);
	spi_writebits(0x00,8);
	spi_writebits(0x00,7);
	spi_writebits((uint8)(byteaddr>>8),1);
	spi_writebits((uint8)(byteaddr),8);
	spi_writebits(0x00,8);
	//spi_writebits(0x00,8);//多这一行每次丢失一字节
	for(i=0;i<len;i++)
	{
	m=spi_readbyte();
	*(sp0+i)=m;
	//_nop_();//04423
	//_nop_();
	}	
	
	CS0=1;

⌨️ 快捷键说明

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