❶ 溫度感測器(熱敏電阻)測量溫度的單片機C程序
用熱敏電阻搭成橋式電路,採集其電壓,再進行AD轉換輸入單片機即可。另外測溫推薦數字溫度感測器,例如SHT71,這樣精度高,編程也簡單
❷ 用單片機c語言設計數字溫度計!求代碼!急急急
//------------------------------------------------------------------
//DS18B20溫度感測器輸出顯示,運行本例時,外界溫度將顯示在1602LCD上
//------------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ=P2^2;
sbit la=P2^6; //定義鎖存器鎖存端
sbit wela=P2^7;
sbit rs=P3^5; //定義1602液晶RS端
sbit lcden=P3^4;//定義1602液晶LCDEN端
sbit s1=P3^0; //定義按鍵--功能鍵
sbit s2=P3^1;//定義按鍵--增加鍵
sbit s3=P3^2;//定義按鍵--減小鍵
sbit s4=P3^6;//鬧鍾查看鍵
sbit rd=P3^7;
sbit beep=P2^3; //定義蜂鳴器端
uchar code Temp_Disp_Title[]={" Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};
uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};
uchar temp_data[2]={0x00,0x00};
uchar temp_alarm[2]={0x00,0x00};
uchar display[5]={0x00,0x00,0x00,0x00,0x00};
uchar display1[3]={0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT=0;//當前讀取的溫度整數部分
uchar Temp_Value[]={0x00,0x00};//從DS18B20讀取的溫度值
uchar Display_Digit[]={0,0,0,0}; //待顯示的各溫度數位
bit DS18B20_IS_OK=1;//感測器正常標志
//-------------------------------------
//延時1
//-------------------------------------
void delay1(uint x)
{
uchar i;
while(x--) for(i=0;i<200;i++);
}
//-------------------------------------
//延時2
//-------------------------------------
void Delay(uint x)
{
while(x--);
}
//------------------------------------
//忙檢查
//------------------------------------
void write_com(uchar com)//液晶寫命令函數
{
rs=0;
lcden=0;
P0=com;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void Write_LCD_Data(uchar date)//液晶寫數據函數
{
rs=1;
lcden=0;
P0=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
//-----------------------------
//設置LCD顯示位置
//---------------------------------
void Set_Disp_Pos(uchar Pos)
{
write_com(Pos|0x80);
}
//-----------------------------
//LCD初始化
//---------------------------------
void Initialize_LCD()
{
uchar num;
rd=0; //軟體將矩陣按鍵第4列一端置低用以分解出獨立按鍵
la=0;//關閉兩鎖存器鎖存端,防止操作液晶時數碼管會出亂碼
wela=0;
lcden=0;
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//設置顯示初始坐標
for(num=0;num<14;num++)//顯示年月日星期
{
Write_LCD_Data(Temp_Disp_Title[num]);
delay1(5);
}
}
//-------------------------------------
//函數功能:初始化DS18B20
//出口參數:status---DS18B20是否復位成功的標志
//-------------------------------------
uchar Init_DS18B20()
{
uchar status; //儲存DS18B20是否存在的標志,status=0,表示存在;status=1,表示不存在
DQ=1;Delay(8); //先將數據線拉高 //略微延時約6微秒
DQ=0;Delay(90); //再將數據線從高拉低,要求保持480~960us
//略微延時約600微秒 以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ=1;Delay(8); //釋放數據線(將數據線拉高) //延時約30us(釋放匯流排後需等待15~60us讓DS18B20輸出存在脈沖)
status=DQ;Delay(100); //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) //延時足夠長時間,等待存在脈沖輸出完畢
DQ=1; // 將數據線拉高
return status; //返回檢測成功標志
}
//-------------------------------------
//函數功能:讀一位元組
//出口參數:dat---讀出的數據
//-------------------------------------
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_(); // 先將數據線拉高 //等待一個機器周期
for (i=0;i<8;i++)
{
DQ=0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
dat>>=1;
_nop_();//等待一個機器周期
DQ=1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
_nop_();_nop_(); //延時約6us,使主機在15us內采樣
if (DQ) dat|=0x80; //如果讀到的數據是1,則將1存入dat,如果是0則保持原值不變
Delay(30); //延時3us,兩個讀時序之間必須有大於1us的恢復期
DQ=1; // 將數據線拉高,為讀下一位數據做准備
}
return dat;
}
//-------------------------------------
//函數功能:寫一位元組
//入口參數:dat---待寫入的數據
//-------------------------------------
void WriteOneByte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
{
DQ=0; //將數據線從高拉低時即啟動寫時序
DQ=dat & 0x01; //利用與運算取出要寫的某位二進制數據,
//並將其送到數據線上等待DS18B20采樣
Delay(5); //延時約30us,DS18B20在拉低後的約15~60us期間從數據線上采樣
DQ=1; //釋放數據線
dat>>=1; //將dat中的各二進制位數據右移1位
}
}
//-------------------------------------
//函數功能:讀取溫度值
//出入口參數:無
//-------------------------------------
void Read_Temperature()
{
if(Init_DS18B20() == 1) //DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC); // 跳過讀序號列號的操作
WriteOneByte(0x44); // 啟動溫度轉換
Init_DS18B20(); //將DS18B20初始化
WriteOneByte(0xCC); //跳過讀序號列號的操作
WriteOneByte(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
Temp_Value[0]=ReadOneByte(); //溫度低8位
Temp_Value[1]=ReadOneByte(); //溫度高8位
DS18B20_IS_OK=1;
}
}
//-------------------------------------
//函數功能:在LCD上顯示當前溫度
//入口參數:
//-------------------------------------
void Display_Temperature()
{
uchar i;
//延時值與負數標識
uchar t=150,ng=0;
//高5位全為1(0xF8)則為負數,為負數時取反加1,並設置負數標示
if ((Temp_Value[1] & 0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++; //加1後如果低位元組為00表示有進位,進位位再加到高位元組上
ng=1; //負數標示置1
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0x0F]; //查表得到溫度小數部分
//獲取溫度整數部分(高位元組的低3位與低位元組中的高4位,無符號)
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07)<<4);
//將整數部分分解為3位待顯示數字
Display_Digit[3]=CurrentT/100;//百位 digit[CurrentT/100];
Display_Digit[2]=CurrentT%100/10;//十位
Display_Digit[1]=CurrentT%10;//個位
//刷新LCD顯示緩沖
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';//先將'0'轉換成整數48,然後與前面數字相加,得到相應數字的ASCII字元
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; //個位
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; //十位
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //百位
//高位為0時不顯示
if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';
//高位為0且次高位為0時,次高位不顯示
if(Display_Digit[2]==0 && Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//負數符號顯示在恰當位置
if(ng)
{
if (Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行顯示標題
Set_Disp_Pos(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_Disp_Pos(0x40); //在第二行顯示當前溫度
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//顯示溫度符號
//Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);
Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);
Set_Disp_Pos(0x4E);Write_LCD_Data('C');
}
//-------------------------------------
//函數功能:主函數
//入口參數:
//-------------------------------------
void main()
{
Initialize_LCD();
Read_Temperature();
Delay(50000);
Delay(50000);
while (1)
{
Read_Temperature();
if (DS18B20_IS_OK) Display_Temperature();
delay1(100);
}
}
❸ 單片機溫度報警器的溫度上下限按鍵調控的C語言程序怎麼編
溫度報警器就是需要溫度感測器不停地對監控的對象進行檢測,例如pt100溫度感測器,pt100感測器是不同溫度下,阻值會不同,在同一溫度下,阻值是相同的。根據這個原理通過電路轉換成電壓,然後模擬量轉換成數字量輸入到單片機,單片機根據讀取到的電壓值判斷實際溫度值,然後根據設定的報警值比較,如果超過 就進行報警動作。
在實際設計過程中那個報警溫度的設定,可以直接對那個變數進行加減的,例如
void actfuntion(unsigned char temp)
{
temp++;
}
然後在檢測到按鍵有電平跳變的時候,就調用這個含參子函數對定義的溫度設定值進行加操作,減操作也是一樣,還可以在調用的後面進行最大值或者最小值的判斷。
如果覺得這樣一下一下的按太麻煩了,可以對按鍵進行長按連續觸發進行判斷,就是在定時器里進行判斷按下時間,然後不停的調用這個子函數。
當然這個設定值是需要考慮掉電保存的,或者是按鍵保存。可以在設定好溫度值之後,在按下其他的按鍵,進行把溫度設定值 保存到單片機內部eeprom就可以了,不需要保存太多數據的情況下,現在市面上很多單片機都有的內部eeprom就夠用的了,不需要進行外部擴展。
然後在單片機上電,也就是主函數的開頭進行讀取eeprom中保存的設定值。
❹ 跪求 單片機進行溫度檢測的C語言程序
//DS18B20的讀寫程序,數據腳P2.7 //
//溫度感測器18B20匯編程序,採用器件默認的12位轉化 //
//最大轉化時間750微秒,顯示溫度-55到+125度,顯示精度 //
//為0.1度,顯示採用4位LED共陽顯示測溫值 //
//P0口為段碼輸入,P34~P37為位選 //
/***************************************************/
#include "reg51.h"
#include "intrins.h" //_nop_();延時函數用
#define Disdata P0 //段碼輸出口
#define discan P3 //掃描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^7; //溫度輸入口
sbit DIN=P0^7; //LED小數點控制
uint h;
uint temp;
//
//
//**************溫度小數部分用查表法***********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列掃描控制字
uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據和一個運算暫用
//
//
//
/*****************11us延時函數*************************/
//
void delay(uint t)
{
for (;t>0;t--);
}
//
/****************顯示掃描函數***************************/
scan()
{
char k;
for(k=0;k<4;k++) //4位LED掃描控制
{
Disdata=dis_7[display[k]]; //數據顯示
if (k==1){DIN=0;} //小數點顯示
discan=scan_con[k]; //位選
delay(300);
}
}
//
//
/****************DS18B20復位函數************************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//從高拉倒低
DQ=0;
delay(50); //550 us
DQ=1;
delay(6); //66 us
presence=DQ; //presence=0 復位成功,繼續下一步
}
delay(45); //延時500 us
presence=~DQ;
}
DQ=1; //拉高電平
}
//
//
/****************DS18B20寫命令函數************************/
//向1-WIRE 匯流排上寫1個位元組
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_(); //從高拉倒低
DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
delay(1);
}
//
/****************DS18B20讀1位元組函數************************/
//從匯流排上取1個位元組
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
delay(6); //66 us
}
DQ=1;
return(value);
}
//
/****************讀出溫度函數************************/
//
read_temp()
{
ow_reset(); //匯流排復位
delay(200);
write_byte(0xcc); //發命令
write_byte(0x44); //發轉換命令
ow_reset();
delay(1);
write_byte(0xcc); //發命令
write_byte(0xbe);
temp_data[0]=read_byte(); //讀溫度值的第位元組
temp_data[1]=read_byte(); //讀溫度值的高位元組
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 兩位元組合成一個整型變數。
return temp; //返回溫度值
}
//
/****************溫度數據處理函數************************/
//二進制高位元組的低半位元組和低位元組的高半位元組組成一位元組,這個
//位元組的二進制轉換為十進制後,就是溫度值的百、十、個位值,而剩
//下的低位元組的低半位元組轉化成十進制後,就是溫度值的小數部分
/********************************************************/
work_temp(uint tem)
{
uchar n=0;
if(tem>6348) // 溫度值正負判斷
{tem=65536-tem;n=1;} // 負溫度求補碼,標志位置1
display[4]=tem&0x0f; // 取小數部分的值
display[0]=ditab[display[4]]; // 存入小數部分顯示值
display[4]=tem>>4; // 取中間八位,即整數部分的值
display[3]=display[4]/100; // 取百位數據暫存
display[1]=display[4]%100; // 取後兩位數據暫存
display[2]=display[1]/10; // 取十位數據暫存
display[1]=display[1]%10;
/******************符號位顯示判斷**************************/
if(!display[3])
{
display[3]=0x0a; //最高位為0時不顯示
if(!display[2])
{
display[2]=0x0a; //次高位為0時不顯示
}
}
if(n){display[3]=0x0b;} //負溫度時最高位顯示"-"
}
//
//
/****************主函數************************/
main()
{
Disdata=0xff; //初始化埠
discan=0xff;
for(h=0;h<4;h++) //開機顯示"0000"
{display[h]=0;}
ow_reset(); //開機先轉換一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //發轉換命令
for(h=0;h<100;h++) //開機顯示"0000"
{scan();}
while(1)
{
work_temp(read_temp()); //處理溫度數據
scan(); //顯示溫度值
}
}
//
//***********************結束**************************//
❺ 單片機溫度檢測的程序
/***************writer:shopping.w******************/
#include<reg51.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P3^6;
ucharcodeDSY_CODE[]=
{0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};
ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
ucharCurrentT=0;
ucharTemp_Value[]={0x11,0x22};
ucharDisplay_Digit[]={0,0,0,0};
bitDS18B20_IS_OK=1;
voidDelay(uintx)
{
while(--x);
}
ucharInit_DS18B20()
{
ucharstatus;
DQ=1;
Delay(8);
DQ=0;
Delay(90);
DQ=1;
Delay(8);
DQ=1;
returnstatus;
}
ucharReadOneByte()
{
uchari,dat=0;
DQ=1;
_nop_();
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)
dat|=0X80;
Delay(30);
DQ=1;
}
returndat;
}
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
voidRead_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
voidDisplay_Temperature()
{
uchari;
uchart=150;
ucharng=0,np=0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)Temp_Value[1]++;
ng=1;np=0xfd;
}
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
if(Display_Digit[3]==0)
{
Display_Digit[3]=10;
np=0xfb;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0xf7;
}
}
for(i=0;i<30;i++)
{
P0=0x39;P2=0x7f;Delay(t);P2=0xFF;
P0=0x63;P2=0xbf;Delay(t);P2=0xff;
P0=DSY_CODE[Display_Digit[0]];
P2=0xDF;Delay(t);P2=0xff;
P0=(DSY_CODE[Display_Digit[1]])|0x80;
P2=0xef;Delay(t);P2=0xff;
P0=DSY_CODE[Display_Digit[2]];
P2=0xf7;Delay(t);P2=0xff;
P0=DSY_CODE[Display_Digit[3]];
P2=0xfb;Delay(t);P2=0xff;
if(ng)
{
P0=0x40;P2=np;Delay(t);P2=0xff;
}
}
}
voidmain()
{
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
}
}
❻ 單片機數字溫度計設計用C語言寫程序
#include<reg51.h>
#defineucharunsignedchar
sbitBEEP=P3^7; //接控制繼電器
sbitDQ=P3^6; //接溫度感測器18B20
uchart[2],number=0,*pt; //溫度值
ucharTempBuffer1[4]={0,0,0,0};
ucharTmax=50,Tmin=10;
uchardistab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};
ucharcurrtemp;
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P2=1<<number;
if(number==2)P0=distab[TempBuffer1[0]]&0x7f;
elseP0=distab[TempBuffer1[0]];
number++;
if(number>3)number=0;
}
voiddelay_18B20(unsignedinti)
{
while(i--);
}
/**********ds18b20初始化函數**********************/
voidInit_DS18B20(void)
{
bitx=0;
do{
DQ=1;
delay_18B20(8);
DQ=0;//單片機將DQ拉低
delay_18B20(90);//精確延時大於480us
DQ=1;//拉高匯流排
delay_18B20(14);
x=DQ;//稍做延時後如果x=0則初始化成功x=1則初始化失敗,繼續初始化
}while(x);
delay_18B20(20);
}
/***********ds18b20讀一個位元組**************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//給脈沖信號
dat>>=1;
DQ=1;//給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個位元組****************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************讀取ds18b20當前溫度************/
unsignedchar*ReadTemperature(unsignedcharrs)
{
unsignedchartt[2];
delay_18B20(80);
Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0x44); //啟動溫度轉換
delay_18B20(80);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
tt[0]=ReadOneChar();//讀取溫度值低位
tt[1]=ReadOneChar();//讀取溫度值高位
return(tt);
}
voidcovert1(void) //將溫度轉換為LED顯示的數據
{
ucharx=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]&0x080)//判斷正負溫度
{
TempBuffer1[0]=0x0c; //c代表負
t[1]=~t[1]; /*下面幾句把負數的補碼*/
t[0]=~t[0]; /*換算成絕對值*********/
x=t[0]+1;
t[0]=x;
if(x==0x00)t[1]++;
}
elseTempBuffer1[0]=0x0a; //A代表正
t[1]<<=4; //將高位元組左移4位
t[1]=t[1]&0xf0;
x=t[0]; //將t[0]暫存到X,因為取小數部分還要用到它
x>>=4; //右移4位
x=x&0x0f; //和前面兩句就是取出t[0]的高四位
y=t[1]|x; //將高低位元組的有效值的整數部分拼成一個位元組
TempBuffer1[1]=(y%100)/10;
TempBuffer1[2]=(y%100)%10;
t[0]=t[0]&0x0f; //小數部分
TempBuffer1[3]=t[0]*10/16;
if(currtemp<Tmin||currtemp>Tmax)BEEP=1;
elseBEEP=0;
}
voidconvert(chartmp)
{
uchara;
if(tmp<0)
{
TempBuffer1[0]=0x0c;
a=~tmp+1;
}
else
{
TempBuffer1[0]=0x0a;
a=tmp;
}
TempBuffer1[1]=(a%100)/10;
TempBuffer1[2]=(a%100)%10;
}
main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
out=1;
flag=0;
ReadTemperature(0x3f);
delay_18B20(50000); //延時等待18B20數據穩定
while(1)
{
pt=ReadTemperature(0x7f);//讀取溫度,溫度值存放在一個兩個位元組的數組中
if(dismod==0)covert1();
delay_18B20(30000);
}
}
❼ 水溫感測器c語言編程
1、氧感測器:當氧感測器故障時,ECU無法獲取這些信息,就不知道噴射的汽油量是否正確,而不合適的油氣空燃比會導致發動機功率降低,增加排放污染;
2、輪速感測器:它主要是收集汽車的轉速來判斷汽車有沒有打滑的徵兆,所以,就有一一個專門收集汽車輪速的感測器來完成這項工作,一般安裝在每個車輪的輪轂上,而一旦感測器損壞,ABS會失效;
3、水溫感測器:當水溫感測器故障後,往往冷車啟動時顯示的還是熱車時的溫度信號,ECU得不到正確的信號,只能供給發動機較稀薄的混合氣,所以發動機冷車不易啟動,且還會伴隨怠速運轉不穩定,加速動力不足的問題;
4、電子油門踏板位置感測器:當感測器失效後,ECU無法測得油門位置信號,無法獲得油門門踏板的正確位置,所以會出現發動機加速無力的現象,甚至出現發動機不能加速的情況;
5、進氣壓力感測器:進氣壓力感測器顧名思義就是隨著發動機不同的轉速負荷,感應一系列的電阻和壓力變化,轉換成電壓信號,供ECU修正噴油量和點火正時角度。一般安裝在節氣門邊上,假如故障了會引起點火困難、怠速不穩、加速無力等問題。
❽ c51單片機溫度感測器c語言程序
void delay_18B20(unsigned int i)
{
while(i--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(80); //稍做延時
DQ = 0; //單片機將DQ拉低
delay_18B20(800); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay_18B20(140);
x=DQ; delay_18B20(200);
}
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(40); //40
}
return(dat);
}
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(50); //50
DQ = 1;
dat>>=1;
}
}
unsigned int ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(1000);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1000);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
temp_value = b<<8;
temp_value |= a;
return temp_value;
}