main.c

来自「9S12单片机实现电压、温度采集程序」· C语言 代码 · 共 706 行 · 第 1/2 页

C
706
字号
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define masterTrRr485conbit (PTS_PTS2) //CHOOSE Tr OR Rr
//---------------variable declaration---------------
unsigned int testint[23],j=0,receivecount=0, databasecarray[4],qq ,Trsym,guandi0,guandi1,guandi2,guandi3,SOCMIAOINT,scisendsign=1,socchangeenable;
float database=2.25;                                                
unsigned char to232; 
int guandi[4];
unsigned int svdata0[4],svdata1[4],svdata2[4],svdata3[4],gvdata0[4],gvdata1[4],gvdata2[4],temp0[4],temp1[4];
float fsvdata0[4],fsvdata1[4],fsvdata2[4],fsvdata3[4],fgvdata0[4],fgvdata1[4],fgvdata2[4],fguandi[4],ii=0,isoc,SOCMIAO,SOCFEN,SOCSHI,SOCSHI1,SOCV;
char *psvdata0=(char*)svdata0,*psvdata1=(char*)svdata1,*psvdata2=(char*)svdata2,*psvdata3=(char*)svdata3,
*pgvdata0=(char*)gvdata0,*pgvdata1=(char*)gvdata1,*pgvdata2=(char*)gvdata2,*ptemp0=(char*)temp0,*ptemp1=(char*)temp1,*pguandi=(char*)guandi; 
  int receiveflagp,receiveflag,receiveflagt,errorintflag,errortimeflag,transintc,rxdata1c,
  transtimec,receiveintc,receivetimec,timetestc, txtimeflag;
int sendnum1=100,sendnum,sendflag,sign,readisign;
int long sendtimes=0;
//-------------------------------------------------------------
unsigned int present0,present1;
unsigned char a=0, b=0,SN0[4][8]={{0X28,0X82,0X2A,0X9D,0X01,0X00,0X00,0X08},
{0X28,0X26,0X3C,0X9D,0X01,0X00,0X00,0X68},{0X28,0XD3,0X2D,0X9D,0X01,0X00,0X00,0X40}, 
{0X28,0XC1,0X2E,0X9D,0X01,0X00,0X00,0X3B}
},SN1[4][8]={{0X28,0X26,0X61,0X9F,0X01,0X00,0X00,0X16}, 
{0X28,0X70,0X39,0X9D,0X01,0X00,0X00,0X26}} ; //a,b Tl And Th;ROMID Store ID;
 unsigned char ROMIDA[8]={0X28,0X82,0X2A,0X9D,0X01,0X00,0X00,0X08},ROMIDB[8]={0X28,0X26,0X3C,0X9D,0X01,0X00,0X00,0X68},
 ROMIDC[8]={0X28,0XD3,0X2D,0X9D,0X01,0X00,0X00,0X40},ROMIDBD[8]={0X28,0XC1,0X2E,0X9D,0X01,0X00,0X00,0X3B},
 ROMIDE[8]={0X28,0X26,0X61,0X9F,0X01,0X00,0X00,0X16},ROMIDF[8]={0X28,0X70,0X39,0X9D,0X01,0X00,0X00,0X26};
unsigned int t=0;
float tt=0,data[6]; 
int ROMID[8];
//-----------function declaration----------------------------
void Read12GV(void);
void Read16SV(void);
void Readguandi(void);
void inttofloat(void);
void wait(void);
void iniports(void);
void initialcan(void) ;
int CAN0SendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata );
void TransmitT(char* text,int textnum);
void initialATD(void);
unsigned long AD_Filter(unsigned char chanel) ;
void initpll(void);
void waits(void);
void IniCOM(void);
void SCIsendgroup(void);
//-------------------------------
void DS18B20_read_temp (void);
void delay0(unsigned int) ;
void delay1(unsigned  long int) ;
unsigned char Init_18B20(void);
void DS18B20_Write_Byte(char);
unsigned char DS18B20_Read_Byte(void);
unsigned int  DS18B20_Read_Temp(char);
void  Config_18B20(void);
void Read_8bytes_RomID(void);
void Write_8bytes_RomID(unsigned char* P);
//-----------main ----------------------------
void main(void) {
/* put your own code here */
  initpll();  // 总线频率25M
  /*-------端口初始化----------*/
   
  RDRT=0xff;   //  reduce the power of T port
  RDRIV=0x93;       //reduce the power   of
  //  int errorflagtime=0;  //symbol for translate
  iniports();           //initial ports
  initialcan();      
  initialATD();
  IniCOM();//initial sci com
  DDRS_DDRS2=1;
  masterTrRr485conbit=0;//unenble 485Tr 
 present0=Init_18B20();
 DS18B20_Write_Byte (0xCC); // 跳过读序号列号的操作
 DS18B20_Write_Byte(0x44); // 启动温度转换
 RTICTL=0xff;  //产生定时中断350m每个周期
 CRGINT_RTIE=1;  //允许RTI中断 
 SOCSHI=SOCV;
 EnableInterrupts;
 for(;;) {
 //Read16SV();
 Read12GV();
 inttofloat();
 Readguandi();
 
if(sign==1){
 SOCMIAO=SOCMIAO+0.01296296296*isoc;
 SOCFEN=SOCFEN+2.1604938e-4*isoc;
 SOCSHI=SOCSHI+3.600823e-6*isoc;
 guandi[2]=SOCSHI*10000;
 guandi[3]=SOCV*10000;
 sign=0;} 
/*if(scisendsign==1){
 masterTrRr485conbit=1;//enble 485Tr 
 SCIsendgroup();
 wait();
 wait();
 wait();
 wait();
 masterTrRr485conbit=0;//unenble 485Tr   
}*/
  } /* wait forever */
  /* please make sure that you never leave this function */
}
 //----------------------initial three ports---------------
void iniports(void) {
 DDRH=0X20;
 DDRE=0X60;  //set  port E5,6 as out put 
 DDRS=0XF0;
 DDRK=0X3F;
 //DDRA=0XFF;
 DDRH=0XFF;
 DDRP=0X0F;
 } /*--------锁相环初始化-------*/
 void initpll(){
   CLKSEL=0x00;             //disable pll;
   CLKSEL=0;
  CLKSEL_PLLSEL = 0;                   
  PLLCTL_PLLON = 0;                   
  SYNR = 24;          //6M晶镇获得25M总线                 
  REFDV = 5;                     
  PLLCTL = 192;
  PLLCTL_PLLON = 1;                    
  while(!CRGFLG_LOCK);              
  CLKSEL_PLLSEL = 1;  
 }
 /*-------延时-------*/
  void wait(void)
{
  unsigned long i;
  for(i=0;i<300;i++) {
    asm nop;
    asm nop;
  }
}
 void waits()
{
  unsigned long i;
  for(i=0;i<350;i++) {
    asm nop;
    asm nop;
  }
} 
 //-------------ATD function-----------------
 //--------initialATD---------
 void initialATD(void) {
 ATD0CTL2=0xc0;   //打开AD电源并关闭边沿触发
 ATD0CTL3=0x28;   //一个序列转换5次,非fifo模式 
//ATD0CTL3=0x40;   //一个序列转换8次,非fifo模式 
 ATD0CTL4=0x09;   //10位精度,速率1.25M(采用25M总线)
 ATD0CTL5=0xC0; 
}
//---------启动ATD--------
 unsigned long AD_Filter(unsigned char chanel) 
{ unsigned long sum,Max,Min,a[5];
 unsigned char i;
 ATD0CTL5=0xa0+chanel;            //右对齐,无符号数,单次转化
 while(!ATD0STAT0_SCF);           //等待一个转换队列完成
 //ATD0STAT0_SCF=1;               //清除标志
 a[0]=ATD0DR0;a[1]=ATD0DR1;a[2]=ATD0DR2;a[3]=ATD0DR3;a[4]=ATD0DR4;
 //a[5]=ATD0DR5;a[6]=ATD0DR6;a[7]=ATD0DR7;
 Max=a[0];Min=a[0];sum=a[0];
 for(i=1;i<5;i++)
    {sum=sum+a[i];
     if(a[i]>Max)Max=a[i];
     if(a[i]<Min)Min=a[i];
    }
return ((sum-Max-Min)/3);   
}

 
  //--------SCI使用函数-----------------
  //--------------SCI传送数据函数------
void TransmitT( char* text,int textnum)
{ unsigned char a;
  unsigned int ii;
  a=SCI0SR1;
  for(ii=0;ii<=textnum;ii++)
        {while (!(SCI0SR1 & 0x80));  /* wait for output buffer empty */
         SCI0DRL = *(text+ii);}  //test add 1 after performing
        
        //while (!(SCI0SR1 & 0x80));  
        } 
//---------------初始化串口------------
void IniCOM(void)
{SCI0BDL=163;		//)6M晶振,25M总线,波特率为9600
 SCI0CR1=0;	 //无奇偶校验,1个起始位8个数据位1个停止位
 SCI0CR2 = 0x2c;  //允许接收中断
} 
void SCIsendgroup(void) { 
 TransmitT(psvdata0,7);
 TransmitT(psvdata1,7);
 TransmitT(psvdata2,7);
 TransmitT(psvdata3,7);
 TransmitT(pgvdata0,7);
 TransmitT(pgvdata1,7);
 TransmitT(pgvdata2,7);
 TransmitT(ptemp0,7);
 TransmitT(ptemp1,7);
 TransmitT(pguandi,9);//多传一个字节,为无用字节,因为485传字节最后一个误码  
}   
//--------------CAN function---------------------------------
//----------------------initial CAN0rig--------------------
void initialcan(void) {
  CAN0CTL0 = 0x01;          /*Enter Initialization Mode 
                               *  
                               *  0b00000001
                               *    ||||||||__ Enter Initialization Mode
                               *    |||||||___ Sleep Mode Request bit
                               *    ||||||____ Wake-Up disabled
                               *    |||||_____ Time stamping disabled
                               *    ||||______ Synchronized Status
                               *    |||_______ CAN not affected by Wait
                               *    ||________ Receiver Active Status bit
                               *    |_________ Received Frame Flag bit
                               */
 while(CAN0CTL1_INITAK!=1); 	/* Wait for Initialization Mode acknowledge
                                 * INITRQ bit = 1
                                 */
                                 

    CAN0CTL1 = 0x80;          /* Enable MSCAN module and not LoopBack Mode
                               *  
                               *  0b10100000
                               *    ||||||||__ Initialization Mode Acknowledge
                               *    |||||||___ Sleep Mode Acknowledge
                               *    ||||||____ Wake-up low-pass filter disabled
                               *    |||||_____ Unimplemented
                               *    ||||______ Listen Only Mode disabled
                               *    |||_______ not Loop Back Mode enabled
                               *    ||________ Ext Osc/Xtal as Clock Source
                               *    |_________ MSCAN Module enabled
                               */
    
    CAN0BTR0 = 0x40;          /* Synch Jump = 2 Tq clock Cycles 
                               *
                               *  0b01000100
                               *    ||||||||__
                               *    |||||||___\
                               *    ||||||____ |
                               *    |||||_____ |_ CAN Clock Prescaler = 5
                               *    ||||______ |
                               *    |||_______ |
                               *    ||________/
                               *    |_________>- SJW = 2
                               */
    
    CAN0BTR1 = 0x36;	      /* Set Number of samples per bit, TSEG1 and TSEG2 (bit=500k)
                               *
                               *  0b00100100
                               *    ||||||||__
                               *    |||||||___|
                               *    ||||||____|- TSEG1 = 5
                               *    |||||_____|
                               *    ||||______
                               *    |||_______\_ TSEG2 = 3
                               *    ||________/
                               *    |_________ One sample per bit
                               */
                              
    CAN0IDAC = 0x10;          /* Set four 16-bit Filters 
                               *  
                               *  0b00010000
                               *    ||||||||__ 
                               *    |||||||___\_ Filter Hit Indicator 
                               *    ||||||____/
                               *    |||||_____ Unimplemented 
                               *    ||||______ 
                               *    |||_______>- Four 16-bit Acceptance Filters   
                               *    ||________ 
                               *    |_________>- Unimplemented 
                               */
                                 
    /* note Acceptance Filters neither Acceptance Filter is accorded with,message in receivebuffer will pass  */

    CAN0IDAR0 = 0xff;    //|\    16 bit Filter 0
    CAN0IDMR0 = 0xff ;   //| \__ Accepts Standard Data Frame Msg 
    CAN0IDAR1 = 0xff;     //| /   with ID 0x100 
    CAN0IDMR1 = 0xff;    //|/
    
    CAN0IDAR2 = 0xff;                   //|\    16 bit Filter 1
    CAN0IDMR2 = 0xff;   //| \__ Accepts Standard Data Frame Msg
    CAN0IDAR3 = 0xff;                   //| /   with ID 0x000
    CAN0IDMR3 = 0xff;    //|/
    
    CAN0IDAR4 = 0xff;                   //|\    16 bit Filter 2
    CAN0IDMR4 = 0xff;   //| \__ Accepts Standard Data Frame Msg
    CAN0IDAR5 = 0xff;                   //| /   with ID 0x000
    CAN0IDMR5 = 0xff;    //|/
    
    CAN0IDAR6 = 0xff;                   //|\    16 bit Filter 3
    CAN0IDMR6 = 0xff;   //| \__ Accepts Standard Data Frame Msg
    CAN0IDAR7 = 0xff;                   //| /   with ID 0x000
    CAN0IDMR7 = 0xff;    //|/
    
    CAN0CTL0 = 0x00;            /* Exit Initialization Mode Request */
    while ((CAN0CTL1&0x01) != 0){};	/* Wait for Normal Mode */
    while(!(CAN0CTL0&0x10));        //note  allways loop here
    CAN0RFLG = 0xC3;          /* Reset Receiver Flags
                               *  
                               *  0b11000011
                               *    ||||||||__ Receive Buffer Full Flag
                               *    |||||||___ Overrun Interrupt Flag
                               *    ||||||____ 
                               *    |||||_____>- Transmitter Status Bits
                               *    ||||______ 
                               *    |||_______>- Receiver Status Bits
                               *    ||________ CAN Status Change Interrupt Flag
                               *    |_________ Wake-Up Interrupt Flag
                               */
    
    CAN0RIER = 0x01;          /* Enable Receive Buffer Full Interrupt
                               *  
                               *  0b00000001
                               *    ||||||||__ Receive Buffer Full Int enabled
                               *    |||||||___ Overrun Int disabled
                               *    ||||||____ 
                               *    |||||_____>- Tx Status Change disabled
                               *    ||||______ 
                               *    |||_______>- Rx Status Change disabled
                               *    ||________ Status Change Int disabled
                               *    |_________ Wake-Up Int disabled
                               */

}
//-------------------------------sendframe-----------------------
  int CAN0SendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata ){
    
    
    unsigned char index;        //number for read message
    unsigned char txbuffer = {0};  //symbol for CAN0TBSEL
    
    
    if (!CAN0TFLG)              /* Is Transmit Buffer full?? */
        return 1;

    CAN0TBSEL = CAN0TFLG;       /* Select lowest empty buffer */
    txbuffer = CAN0TBSEL;		/* Backup selected buffer */
    
    /* Load Id to IDR Registers */
    *((unsigned long *) ((unsigned long)(&CAN0TXIDR0)))= id;
        
    for (index=0;index<length;index++) {
        *(&CAN0TXDSR0 + index) = txdata[index];  /* Load data to Tx buffer 
                                                  * Data Segment Registers
                                                  */
       }

    CAN0TXDLR = length;                          /* Set Data Length Code */
    CAN0TXTBPR = priority;                       /* Set Priority */
    CAN0TFLG = txbuffer;	                     /* Start transmission */
    while ((CAN0TFLG & txbuffer) != txbuffer);  /* Wait for Transmission 

⌨️ 快捷键说明

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