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 + -
显示快捷键?