sy_wt_tt.c

来自「This program is used to measure the temp」· C语言 代码 · 共 559 行 · 第 1/2 页

C
559
字号

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;                       
   TR1 = 1;                            // START Timer1
   TI0 = 1;                            // Indicate TX0 ready
}

//-----------------------------------------------------------------------------
// Timer2_Init SYSCLK no Interrupt
//-----------------------------------------------------------------------------
//
// Configure Timer2 to auto-reload at interval specified by <counts> (no 
// interrupt generated) using SYSCLK as its time base.
//
void Timer2_Init (int counts)
{
   TMR2CN = 0x00;                      // STOP Timer2; Clear TF2H and TF2L;
                                       // disable low-byte interrupt; disable
                                       // split mode; select internal timebase
   CKCON |= 0x10;                      // Timer2 uses SYSCLK as its timebase

   TMR2RL  = -counts;                  // Init reload values
   TMR2    = TMR2RL;                   // Init Timer2 with reload value
   ET2 = 0;                            // disable Timer2 interrupts
   TR2 = 1;                            // start Timer2
}


//***************************************************************
UI read_temper1(void)
{
     
      UI teml,temh,temper,zt,xt;    
      UC b;     
      float data_f=0.0625, data_t;

      b = ow_reset1();     // read byte      
      write_byte1(0xcc);      
      write_byte1(0xbe);  // read 9 RAM          
      teml=(unsigned int )read_byte1();    // L tem, in ds18b20 RAM 0,1,2,3,4      
      temh=(unsigned int )read_byte1();    // H tem
      //-------------------------------------------------
      //temh=(unsigned int)0x00;   // test T 0191=25.0625c******************
      //teml=(unsigned int)0x00;   // test T fe6f=-25.0625c*****************
      // test 00A2=10.125c; 0001=0.0625c; 0000=0c; ffff=-0.0625c; 
      // fffe=-0.125c; fff8=-0.5c; fff0=-1.0c;                                    
      //-------------------------------------------------
      temper=temh;
      if((temper&0x00f8)==0x00f8) // 负值 
        {
         temper= ~((temh<<8)+teml)+1;        

         data_t=(-data_f*temper)+0.05; // +0.05**********
        }
      else                        // 正值
        {
         temper=(temh<<8)+teml;         

         data_t=(data_f*temper)-0.05; // -0.05***********
        }     
   //-----------------------------------------------
      
     if(data_t>=0)              //  正值 TEM_FD=0;
      { 
        zt=(unsigned int)data_t;
        data_t=(data_t-zt);
        zt=zt*100;        
        xt=(unsigned int)(data_t*100);          
        temper=zt+xt;
      
        TEM_FD=0;
      }
      else                      // 负值  TEM_FD=1
      {
        //data_t=(abs)data_t;
        zt=(unsigned int)data_t;
        data_t=(data_t-zt);
        zt=zt*100;        
        xt=(unsigned int)(data_t*100);          
        temper=zt+xt; 
   
        TEM_FD=1;
      }
      return(temper); 
}
//--------------------------------------------------------------
void read_data(void)
{    
      unsigned int temp;                 
     
      temp=read_temper1();
      
      
      if(TEM_FD)      //  负值符号
       {
         led[4]=0x01; // - 符号
         temp=~temp+1;
         led[3]=led_bcd[(unsigned char)(temp/1000)]; temp%=1000;
         if(led[3]==0x7e)   // 0x7e=0,
            {
              led[5]=0x00;  // 0x00= ,
              led[4]=0x01;  // -
             }
         led[2]=led_bcd[(unsigned char)(temp/100)];  temp%=100;
         
         led[1]=led_bcd[(unsigned char)(temp/10)];   temp%=10;
         
         led[0]=led_bcd[(unsigned char)temp];
       }
      else      // 正值 >99, max 120c.
       {                  
         led[4]=led_bcd[(unsigned char)(temp/10000)]; temp%=10000;
         if(led[4]==0x7e)  // 0x7e=0,
            led[4]=0x00;   // 0x00=' ' ,
                     
         led[3]=led_bcd[(unsigned char)(temp/1000)];  temp%=1000; 
         if((led[4]==0x00)&&(led[3]==0x7e)) // 0x7e=0,
             led[3]=0x00;  // 0x00=' ' ,

         led[2]=led_bcd[(unsigned char)(temp/100)];   temp%=100; // DP. |0x80
         
         led[1]=led_bcd[(unsigned char)(temp/10)];    temp%=10;  
         
         led[0]=led_bcd[(unsigned char)temp]; 
        
       }
}                        
//**************************************************************
//       18B20
//**************************************************************
void delay_us(UI use)// 1=15us ; time=X*5us+15us; X<20; 
{
  UI i;
  
    for(i=0; i<use; i++)
       { _Nop();  _Nop();}    
   
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void delay_ms(UI yscnt)   // 1=1ms  ok
{
	UI  y;
	for(;yscnt>0;yscnt--)
		{
			y=0x0132;
			while(y!=0)
			{
				y--;
			}
		}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void delay_50us(UI count)
{
  UI i; UC j;
  for(i=0; i<count; i++)
     for(j=0; j<22; j++);
}
//****************************************************
//----reset1------------------------------------------
UC ow_reset1()
{
   UC presence=1;

   TEMPE1 = 0;
   delay_us(180);  // 480...960us; 150=700us
      
   TEMPE1=1;
   delay_us(10);   // 15...60us;    5=35us 
   
   presence=TEMPE1;
   delay_us(30);   // 60...240us;  20=120us
   
  return(presence);// ok=0, no=1
}
//------read byte-------------------------------------
UC read_byte1(void)
{
   UC i,ii;
   UC value=0;

   for(i=8; i>0; i--)
     {
        value>>=1;
        TEMPE1=0;
        TEMPE1=1;
        
        for(ii=0; ii<6; ii++);// 15us...20us; 5=20us
        if(TEMPE1)
        value|=0x80;
        
        delay_us(10);          // 15...60us;    5 = 35us 
     }
     return(value);
}
//------- write byte-----------------------------------
void write_byte1(char val)
{
    UC i;

    for(i=8;i>0;i--)
      {
         TEMPE1=0;
         TEMPE1=val&0x01;
         delay_us(18); // 60...120us; 15 = 90us
         
         TEMPE1=1;
         val=val/2;
      }
      delay_us(20);    // 60...120us; 15 = 90us
      
}
//------------------------------------------------------
//------- ini 18b20 ------------------------------------
void ini_T1(void)
{
   UC b;

   b = ow_reset1();        // write byte
   
   write_byte1(0xcc);  // skip ROM
   write_byte1(CONFIG);// 7f=12A/D 
}
//------------------------------------------------------
void start_temper1(void)
{  
   UC b;
          
   b = ow_reset1();
   
   write_byte1(0xcc);
   write_byte1(0x44);  // start A/D
}
//------------------------------------------------------

/********************************************************************
/* 名称: w_InputByte
* 说明:
* 功能: 往MAX7219写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void w_InputByte(UC ucDa)
{
UC i;
ACC = ucDa;
W_LOAD=0;
for(i=8; i>0; i--)
{
W_CLK = 0;
W_IO = ACC7; /*相当于汇编中的 RLC */
W_CLK = 1;
ACC = ACC << 1;
}
}
/********************************************************************
/********************************************************************
*
* 名称: w_W7219
* 说明: 先写地址,后写命令/数据
* 功能: 往max7219写入数据
* 调用: w_InputByte()
* 输入: ucAddr: max7219地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void w_W7219(UC ucAddr, UC ucDa)
{
W_LOAD = 0;
w_InputByte(ucAddr); /* 地址,命令 */
w_InputByte(ucDa);   /* 写1Byte数据*/
W_LOAD =1;           //写入
}
/********************************************************************
/********************************************************************/


⌨️ 快捷键说明

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