溫度感測器編程
❶ 誰能詳細的告訴我怎麼把溫度感測器的信號通過plc(歐姆龍)編程然後控制風扇
溫度感測器一般工業用就是Pt電阻或者熱電偶。看你的實際測試的是什麼溫度,溫度有多高了。我看你控制風扇,猜測溫度應該不會很高,最多幾網路,那麼你可以選Pt電阻。pt電阻輸出的是模擬信號,所以你需要模擬量模塊把模擬信號讀出來。然後就是比較了,復雜點控制可能你需要PID方式控制。如果你想簡單經濟的話,還可以選擇智能型溫控儀,市面上有不少選擇。智能型溫控儀和溫度感測器鏈接後只需要設置幾個參數就可以搞定了,相對於你增加模擬模塊再編程來講便宜高效很多 。
下面的鏈接對於你來說應該很有用:
http://wenku..com/view/81b12c14866fb84ae45c8dcd.html
❷ 急!!!! !!編寫一個溫度感測器的C語言程序(能寫多少算多少)
**************/
unsigned char ReadOneChar(void)
{
uchar i=0; //定義i用於循環
uchar dat = 0; //讀取的8位數據
for (i=8;i>0;i--) //8次循環
{
DQ = 0; //拉低DQ匯流排開始讀時序
dat>>=1; //dat左移一位
DQ = 1; //釋放DQ匯流排
if(DQ) //如果DQ=1,執dat|=0x80;(0x80即第7位為1,如果DQ為1,即讀取的數據為1,將dat的第7為置1,然後dat>>=1,循環8次結束,dat即為讀取的數據)
//DQ=0,就跳過
dat|=0x80;
delay_18B20(4); // 延時以完成此次讀時 序,之後再讀下一數據
}
return(dat); //返回讀取的dat
}
DQ = dat&0x01;這句語句是錯誤的。DQ為位變數,而dat為 unsigned char
如果真要這么寫的話,應該是這樣 :DQ = (bit)dat&0x01;
把我寫的給你做個參考吧:
extern uchar8 sig; //sig判定溫度符號
/*延時函數*/
void delay (int us) //DELAY-11.0592MHZ 調用程序大約為24us,每次循環為16us
{
int s;
for(s=0;s<us;s++);
}
void delayms(int z) //z為毫秒數
{
int x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
/*復位程序*/
unsigned char reset(void)
{
uchar8 presence;
DQ=0; //拉低匯流排。當匯流排停留在低電平480us-960us ,匯流排上所以器件都將被復位
delay(30); //保持低電平504us
DQ=1; //釋放匯流排,讓其恢復高電平
delay(3); //等待晶元應答信號
presence=DQ; //獲取應答信號
delay(25); //延時以完成整個時序
return(presence); //返回應答信號。有晶元應答返回0,否則返回1。
}
/*寫一位數據*/
void write_bit(char bitval)
{
DQ=0; //拉低DQ匯流排,開始時序
if(bitval==1) //如果寫入的為1,則返回高電平
DQ=1;
delay(5); //延時104us,以完成整個時序
DQ=1;
}
/*寫一位元組數據*/
void write_byte(char val)
{
uchar8 i,temp;
for (i=0;i<8;i++) //寫入一個位元組的數據,一個時序中寫一次
{
temp=val>>i; //右移i位
temp&=0x01; //復制那位數據到temp
write_bit(temp); //調用write_bit()
}
delay(5); //延時104us以完成此次時序,之後再寫下一數據
}
/*讀一位數據*/
uchar8 read_bit(void)
{
uchar8 i;
DQ=0; //拉低DQ,開始讀時序
DQ=1; //釋放DQ匯流排
for(i=0;i<3;i++); //從時序開始延時15us
return(DQ); //返回DQ值
}
/*讀一位元組數據*/
uchar8 read_byte(void)
{
uchar8 i,value=0;
for(i=0;i<8;i++)
{
if(read_bit()) //讀一位元組數據,一個時序中讀一次,並作移位處理
value|=0x01<<i;
delay(6); //延時以完成此次讀時序,之後再讀下一數據
}
return(value);
}
/*溫度轉化*/
void tmconvert(void)
{
reset(); //復位
delay(1);
write_byte(0xcc); //僅一個DS18b20 ,跳過ROM
write_byte(0x44); //溫度變換
}
/*讀取溫度*/
long gettm(void)
{
uchar8 LSB=0,MSB=0; //用於存儲讀取的溫度
long temp;
reset(); //復位
write_byte(0xcc); //寫指令,跳過ROM,僅一個DS18b20
write_byte(0xbe); //寫指令,讀暫存存儲器
LSB = read_byte(); //讀LSB
MSB = read_byte(); //讀MSB
sig=(MSB>>4==0X0F);
if(sig) //判斷符號位是否為負值,是負值了,轉去處理
{
LSB=~LSB; //溫度處理
MSB=~MSB;
LSB=LSB+1;
}
temp=MSB*256+LSB; //十六進制轉換為10進制
temp=temp*100/16; //12位精度,最小解析度為0.0625°C
return temp; //獲得0.01°C 的精度並返回
}
❸ 4-20mA輸出的溫度感測器對應2到35度的溫度,在PLC編程里如何設置
4-20mA
對應0--32000在對應於2--35,每度對應於值算出來。在乘以25,就是我們要比較的數值
❹ 急啊!!!!!!!題目是寫一個溫度感測器的C語言程序
18B20溫度感測器
程序如下:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P3^0; sbit EN=P3^2; sbit RW=P3^1; sbit wela=P3^3; sbit DQ=P3^4; uchar i; uint num; uint shi,ge,xiaoshu; uchar code t0[]="The temperature "; uchar code t1[]=" is "; uchar code wen[]="0123456789";
void delay(uint x)
void delay1(uint x)
/*****************液晶寫指令***************/
void write_com(uchar com)
/*****************液晶寫數據指令***************/
void write_date(uchar date)
/*****************液晶初始化指令***************/
void init() { write_com(0x38); delay(20); write_com(0x0f); delay(20);
write_com(0x06); delay(20); write_com(0x80); for(i=0;i<16;i++) write_com(0x80+0x40); for(i=0;i<16;i++)
}
/*************DS18B20溫度讀取模塊*************/
void tmpDelay(int u) //延時函數
void Init_DS18B20() //初始化ds1820
unsigned char ReadOneChar() //讀一個位元組 return(dat); }
void WriteOneChar(unsigned char dat) //寫一個位元組 }
unsigned int Readtemp() //讀取溫度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器 a=ReadOneChar(); //連續讀兩個位元組數據 b=ReadOneChar();
t=b; t<<=8; t=t|a; //兩位元組合成一個整型變數 tt=t*0.0625; //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度 t= tt*10+0.5; //放大十倍,這樣做的目的將小數點後第一位也轉換為可顯示數字,同時進行一個四捨五入操作。 return(t);
} void main() { init(); num=Readtemp(); shi=num/100; ge=num/10%10; xiaoshu=num%10;
write_com(0xc0+5); write_date(wen[shi]);
write_com(0xc0+6); write_date(wen[ge]);
write_com(0xc0+7); write_date(0x2e);
write_com(0xc0+8);
write_date(wen[xiaoshu]); while(1); }
❺ avr單片機18B20溫度感測器編程
;這是關於DS18B20的讀寫程序,數據腳P2.2,晶振12MHZ
;溫度感測器18B20匯編程序,採用器件默認的12位轉化,最大轉化時間750微秒
;可以將檢測到的溫度直接顯示到AT89C51開發實驗板的兩個數碼管上
;顯示溫度00到99度,很准確哦~~無需校正!
ORG 0000H ;單片機內存分配申明!
TEMPER_L EQU 29H;用於保存讀出溫度的低8位
TEMPER_H EQU 28H;用於保存讀出溫度的高8位
FLAG1 EQU 38H;是否檢測到DS18B20標志位
a_bit equ 20h ;數碼管個位數存放內存位置
b_bit equ 21h ;數碼管十位數存放內存位置
TEMP_TH EQU
MAIN:
LCALL GET_TEMPER;調用讀溫度子程序 ,顯示範圍00到99度,顯示精度為1度
;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個新位元組,這個位元組就是實際測量獲得的溫度
MOV A,29H
MOV C,40H;將28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY ;調用數碼管顯示子程序
CPL P1.0
AJMP MAIN
; 這是DS18B20復位初始化子程序
INIT_1820:
SETB P3.5
NOP
CLR P3.5 ;主機發出延時537微秒的復位低脈沖
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.5 ;然後拉高數據線
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P3.5,TSR3 ;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3:
SETB FLAG1 ; 置標志位,表示DS1820存在
CLR P1.7 ;檢查到DS18B20就點亮P1.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P1.1 ;點亮P1。1腳LED表示溫度感測器通信失敗
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7:
SETB P3.5
RET
; 讀出轉換後的溫度值
GET_TEMPER:
SETB P3.5
LCALL INIT_1820 ;先復位DS18B20
JB FLAG1,TSS2
CLR P1.2
RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
CLR P1.3 ;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H ;發出溫度轉換命令
LCALL WRITE_1820
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
LCALL DISPLAY
LCALL INIT_1820 ;准備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數據保存到35H/36H
CLR P1.4
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV R2,#8;一共8位數據
CLR C
WR1:
CLR P3.5
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.5,C
MOV R3,#23
DJNZ R3,$
SETB P3.5
NOP
DJNZ R2,WR1
SETB P3.5
RET
; 讀DS18B20的程序,從DS18B20中讀出兩個位元組的溫度數據
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數據一共有8位
RE01:
CLR C
SETB P3.5
NOP
NOP
CLR P3.5
NOP
NOP
NOP
SETB P3.5
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,P3.5
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;顯示子程序
display: mov a,29H;將29H中的十六進制數轉換成10進制
mov b,#10 ;10進制/10=10進制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;顯示1000次
dplop: mov a,a_bit ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
mov p1,a ;送出個位的7段代碼
setb p2.0 ;開個位顯示
acall d1ms ;顯示1ms
clr p2.0
mov a,b_bit ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
mov p1,a ;送出十位的7段代碼
setb p2.1 ;開十位顯示
acall d1ms ;顯示1ms
clr p2.1
djnz r1,dplop ;100次沒完循環
djnz r0,dpl1 ;4個100次沒完循環
ret
;1MS延時(按12MHZ算)
D1MS: MOV R7,#80
DJNZ R7,$
RET
numtab: ;數碼管共陽極0~9代碼
DB 0C0H,0F9H,0A4H,0B0H,99H, 92H,82H,0F8H,80H,90H
end
感覺對你有用就賞分吧~
❻ 跪求18b20溫度感測器顯示溫度的編程一般順序
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^2; //溫度感測器信號線
//sbit la=P2^6; //數碼管段選線
//sbit wela=P2^7; //數碼管位選線
sbit beep=P1^7; //蜂鳴器
uint temp;
float f_temp;
uint warn_l1=260;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led0=P1^7;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char code table[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,//0x00,//無小數
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,//0x00//小數
};
void delay(uint z)//延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //18B20復位,初始化函數
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //讀1位函數
{
uint i;
bit dat;
ds=0;i++; //i++ 起延時作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //讀1個位元組
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat) //向18B20寫一個位元組數據
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //寫 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //寫 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20 開始獲取溫度並轉換
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 寫跳過讀ROM指令
tempwritebyte(0x44); // 寫溫度轉換指令
}
uint get_temp() //讀取寄存器中存儲的溫度數據
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //讀低8位
b=tempread(); //讀高8位
temp=b;
temp<<=8; //兩個位元組組合為1個字
temp=temp|a;
f_temp=temp*0.0625; //溫度在寄存器中為12位 解析度位0.0625°
temp=f_temp*10+0.5; //乘以10表示小數點後面只取1位,加0.5是四捨五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
////////////////////顯示程序//////////////////////////
void display(uchar num,uchar dat)
{
uchar i;
P0=table[dat];
i=0xFF;
i=i&(~((0X01)<<(num)));
P2=i;
delay(6);
}
void dis_temp(uint t)
{
uchar i;
i=t/100; //第十位
display(4,i); //第一個數碼管顯示
//delay(1);
i=t%100/10; //溫度個位
display(5,i+10); //第二個數碼管顯示
//delay(1);
i=t%100%10; //溫度小數俠
display(6,i); //第三個數碼管顯示
//delay(1);
//delay(3);
//P0=0x3F; //溫度小數俠
//P2=0x7F; //第4個數碼管顯示
}
//////////////////////////////////////////////
void warn(uint s,uchar led) //蜂鳴器報警聲音 ,s控制音調
{
uchar i;i=s;
//la=0;
// wela=0;
beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
beep=1;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t)
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1)) //大於25度小於27度
{
warn(40,0x01);
}
else if(t<=warn_l2) //小於25度
{
warn(10,0x03);
}
else if((t<warn_h2)&&(t>=warn_h1)) //小於32度大於30度
{
warn(40,0x04);
}
else if(t>=warn_h2) //大於32度
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void init_com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void comm(char *parr)
{
do
{
SBUF = *parr++; //發送數據
while(!TI); //等待發送完成標志為1
TI =0; //標志清零
}while(*parr); //保持循環直到字元為'\0'
}
void main()
{
uchar buff[4],i;
// la=0;
// wela=0;
init_com();
while(1)
{
tempchange();
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
deal(temp);
sprintf(buff,"%f",f_temp);
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
comm(buff);
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
}
}
