main.c

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

C
706
字号
                                                  * completion 
                                                  */
    return 0;
 }
 //-------------------votage test function-------------------
 // -------------------test 12 general Voltage to gvdata---------
 void Read12GV(void){
 unsigned int i;
 for( i=0;i<=3;i++){
    PTS=i<<4;
    waits();
    gvdata0[i]=AD_Filter(1);
    } 
  for( i=0;i<=3;i++){
    PTS=(i+4)<<4;
    waits();
    gvdata1[i]=AD_Filter(1);
    } 
  for( i=0;i<=3;i++){
    PTS=(i+8)<<4;
    waits();
    gvdata2[i]=AD_Filter(1);
    } 
 }
 //-------------------test 16 single Voltage to svdata---------
 void Read16SV(void){
 DDRK=0X3F;
  PORTK=0X00;
 waits();
 waits();
 waits();
svdata0[0]=AD_Filter(0);
    PORTK=0X01;
     waits();
     waits();
     waits();
 svdata0[1]=AD_Filter(0);
   PORTK=0X02;
   waits();
   waits();
   waits(); 
 svdata0[2]=AD_Filter(0);
  PORTK=0X03;
  waits();
  waits();
     waits();
 svdata0[3]=AD_Filter(0); 
   PORTK=0X14;
   waits();
   waits();
 waits();
 waits(); 
  svdata1[0]=AD_Filter(0);
   PORTK=0X15;
   waits();
   waits();
 waits();
 waits();
  svdata1[1]=AD_Filter(0);
   PORTK=0X16;
   waits();
   waits();
 waits();
 waits();
  svdata1[2]=AD_Filter(0);
   PORTK=0X17;
  svdata1[3]=AD_Filter(0);
    waits();
    waits();
 waits();
 waits();
  PORTK=0X28;
    waits();
  svdata2[0]=AD_Filter(0);
  PORTK=0X29;
    waits();
    waits();
 waits();
 waits();
  svdata2[1]=AD_Filter(0);
  PORTK=0X2A;
    waits();
  svdata2[2]=AD_Filter(0);
  PORTK=0X2B;
    waits(); 
  svdata2[3]=AD_Filter(0); 
    waits();
 PORTK=0X3C;
    waits();
  svdata3[0]=AD_Filter(0);
  PORTK=0X3D;
    waits();
  svdata3[1]=AD_Filter(0);
  PORTK=0X3E;
    waits();
  svdata3[2]=AD_Filter(0);
  PORTK=0X3F;
    waits(); 
  svdata3[3]=AD_Filter(0); 
    waits();   
 }
 //-------------------test General Voltage and Current to guandi---------
 void Readguandi(){
guandi0=AD_Filter(2);
guandi[0]=(int)(9.8*guandi0);
guandi1=AD_Filter(3);
isoc=0.98*((float)guandi1-411);
guandi[1]=(int)(isoc*10);
 }
 void inttofloat() {
 int i;
 for( i=0;i<=3;i++){
   //fsvdata0[i]=0.00162*svdata0[i];
   //fsvdata1[i]=0.00162*svdata1[i];
   //fsvdata2[i]=0.00162*svdata2[i];
   //fsvdata3[i]=0.00162*svdata3[i];
   fgvdata0[i]=0.01468*gvdata0[i];
   fgvdata1[i]=0.01468*gvdata1[i];
   fgvdata2[i]=0.01468*gvdata2[i];
    } 
 }
  
 //--------------18B20 function------------------
 void delay0(unsigned int useconds)
{
    for(;  useconds>0;  useconds--);
}
void delay1(unsigned  long int useconds)
{
    for(;  useconds>0;  useconds--);
}
unsigned char Init_18B20(void) {
    unsigned char k;
    DDRM=0B01000000;
    PTM_PTM6=0;            
    delay0(4100);   //leave it low for 650us
    PTM_PTM6=1;
    DDRM=0B00000000;   
    delay0(1000) ;      //leave it  for 118us  wait for presence
    k=PTM_PTM6;
    //delay0(3850);  // leave it for 620us
   return( k );// 1=presence, 0 = no part
} 
void DS18B20_Write_Byte(char Val)
{
     unsigned char  i;
     for (i=0;  i<8;  i++) // writes byte, one bit at a time
     {  DDRM=0B01000000;
        PTM_PTM6=0;
       delay0(0);  
        if( Val&0x01 )
         PTM_PTM6=1;
         else
         PTM_PTM6=0;
         delay0(170);
         DDRM=0B00000000;
         Val >>= 1;
     }
  delay0(170);   
}
unsigned char DS18B20_Read_Byte(void)
{
    unsigned char  i, Value = 0;
    for (i=0;   i<8;   i++)
    {
        DDRM=0B01000000;
        PTM_PTM6=0;             // DQ = 0; // pull DQ low to start timeslot
        Value >>= 1;
       delay0(0);  
        PTM_PTM6=0;// DQ = 1; // then return high
        asm NOP;
        DDRM=0B00000000;
        delay0(0);
        if( PTM_PTM6 )
          Value|=0x80; 
        delay0(380);          // wait for rest of timeslot!!!!!!!!!!!!!!!!!!!!!
    }
    return(Value);
}
void  Config_18B20(void)
{
   a=Init_18B20();
    DS18B20_Write_Byte(0xCC);
    DS18B20_Write_Byte(0x4E);
    DS18B20_Write_Byte(0x19);
    DS18B20_Write_Byte(0x1A);
    DS18B20_Write_Byte(0x7F);   // 12bit LSB: 0.0625
}
void Read_8bytes_RomID(void) {
  int i;
  for (i=0;   i<8;   i++){
  ROMID[i]=DS18B20_Read_Byte();
  }
}
void Write_8bytes_RomID(unsigned char* P) {

  int i;
  for (i=0;   i<8;   i++){
  DS18B20_Write_Byte(P[i]) ;
  }
} 
void DS18B20_read_temp ()
{
unsigned char i,j;
for(j=0;j<4;j++) //为便于调试,仅以4 路为例,改循环次数即可扩充到8 路或更多
{
Init_18B20();
DS18B20_Write_Byte (0x55); //发送ROM 匹配命令
for(i=0;i<8;i++)
   {
DS18B20_Write_Byte(SN0[j][i]); //发送64 位序列号
}
DS18B20_Write_Byte (0xBE); //发送读取暂存寄存器的命令
a=DS18B20_Read_Byte();
b=DS18B20_Read_Byte();     //前两位是发出的温度信号,只读前两位即可。
t=b;
t<<=8;
t=t|a;
temp0[j]=t;
tt=t*0.0625;        //将温度的高位与低位合并
t= tt*10+0.5;       //对结果进行4舍5入  */  
data[j]=tt;        
        }
for(j=0;j<4;j++) //为便于调试,仅以4 路为例,改循环次数即可扩充到8 路或更多
{
Init_18B20();
DS18B20_Write_Byte (0x55); //发送ROM 匹配命令
for(i=0;i<8;i++)
   {
DS18B20_Write_Byte(SN1[j][i]); //发送64 位序列号
}
DS18B20_Write_Byte (0xBE); //发送读取暂存寄存器的命令
a=DS18B20_Read_Byte();
b=DS18B20_Read_Byte();     //前两位是发出的温度信号,只读前两位即可。
t=b;
t<<=8;
t=t|a;
temp1[j]=t;
tt=t*0.0625;        //将温度的高位与低位合并
t= tt*10+0.5;       //对结果进行4舍5入  */  
data[j]=tt;        
        }
 
} 

#pragma CODE_SEG NON_BANKED

//--------------------receiveinterrupt------------
//receive :the messages with the RXIDR0&0x0f are puted in the  corresponding rxdatax[]
//the lefted are puted in the rxdata[],if RXIDR0&0x0f==0,right led open,ifRXIDR0&0x0f==1 mid led open
//void interrupt 38  CAN0RxISR(void) {
//unsigned char length, index;
 
//sendflag=CAN0RXDSR0&0XFF;
 //   }
 void interrupt 20  Receiv485fun(void) { 
unsigned int a;
a=SCI0SR1;
Trsym=SCI0DRL;
if(socchangeenable==1){
SOCSHI=Trsym*0.004;
SOCFEN=Trsym*0.24;
SOCMIAO=Trsym*14.4;
socchangeenable=0;
} else if (Trsym==0x01)
scisendsign=1;
else if (Trsym==0x02)
 socchangeenable=1;
/*if (Trsym==0X1F) {
masterTrRr485conbit=1; //Enable  485Tr
wait();
TransmitT(pp0,16);  //it is not perfect the last two letters cannot be translate
wait();
wait();
masterTrRr485conbit=0;//Unenble 485Tr 
} else if (Trsym==0X2F){
masterTrRr485conbit=1; //Enable  485Tr
TransmitT(pp1,24);  //it is not perfect the last two letters cannot be translate
wait();
wait();
masterTrRr485conbit=0;//Unenble 485Tr 
  }  */

//asm  rti 
}      
   
void interrupt 7  RTICRG(void) {
 CRGFLG_RTIF=1;
 if(readisign==1){
 readisign=0;
 PORTE=0x00;
 sign=0;
 } else {
 readisign=1;
 PORTE=0x60;
sign=1;
 }
 DS18B20_read_temp ();
 present0=Init_18B20();
 DS18B20_Write_Byte (0xCC); // 跳过读序号列号的操作
 DS18B20_Write_Byte(0x44); // 启动温度转换 
//CAN0SendFrame((0x00180002),  0x00, 8, svdata0);
  //CAN0SendFrame((0x00180004), 0x00, 8, svdata1);
  //CAN0SendFrame((0x00180006), 0x00, 8, svdata2);
// CAN0SendFrame((0x00180008), 0x00, 8, svdata3);
  CAN0SendFrame((0x0018000A), 0x00, 8, gvdata0);
  CAN0SendFrame((0x0018000C), 0x00, 8, gvdata1);
  CAN0SendFrame((0x0018000E), 0x00, 8, gvdata2);
  CAN0SendFrame((0x00180010), 0x00, 8, temp0);
  CAN0SendFrame((0x00180012), 0x00, 8, temp1);
  CAN0SendFrame((0x00180014), 0x00, 8, guandi);  
 CRGFLG_RTIF=1;
 }  
 void interrupt 38  CAN0RxISR(void) {
 unsigned char length, index;
 receiveintc=receiveintc+1;
 length = (CAN0RXDLR & 0x0F);
if((CAN0RXIDR0&0X0F)==0)
     {	for (index=0; index<length; index++)
  	   // rxdata0[index] = *(&CAN0RXDSR0 + index); /* Get received data */
  	    if(receiveflagp==0) {
     PTP_PTP3=1; 
      receiveflagp=1;
    } else if(receiveflagp==1) {  
     PTP_PTP3=0; 
     receiveflagp=0;
      } 
    } else if((CAN0RXIDR0&0X0F)==1) {	for (index=0; index<length; index++)
  	   //rxdata1[index] = *(&CAN0RXDSR0 + index); /* Get received data */
  	     if(receiveflagt==0) {
      PTT_PTT4 = 1;
      receiveflagt=1;
    } else if(receiveflagt==1) {  
    PTT_PTT4 = 0;
    receiveflagt=0;
    }
   /* else if((CAN0RXIDR0&0X0F)==2) {	for (index=0; index<length; index++)
  	   // rxdata2[index] = *(&CAN0RXDSR0 + index); // Get received data 
    }
    else if((CAN0RXIDR0&0X0F)==3) {	for (index=0; index<length; index++)
  	   // rxdata3[index] = *(&CAN0RXDSR0 + index); // Get received data 
    } else if((CAN0RXIDR0&0X0F)==4) {	for (index=0; index<length; index++)
  	   // rxdata4[index] = *(&CAN0RXDSR0 + index); //Get received data 
  	    }
    else if((CAN0RXIDR0&0X0F)==5) {	for (index=0; index<length; index++)
  	   // rxdata5[index] = *(&CAN0RXDSR0 + index); // Get received data 
  	    }
   }else { for (index=0; index<length; index++)
  	    //rxdata[index] = *(&CAN0RXDSR0 + index); //Get received data 
    }  */ 
    }
    CAN0RFLG = 0x01;  //Clear RXF 
     }

⌨️ 快捷键说明

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