『壹』 設計一個單片機測溫系統,請高人指點!!!
單片機不應該直接帶負載,功率器件要公光耦隔離,你的電機驅動IC最好用高速光耦隔離開。
如果單片機直接帶負載,實驗的時候可能沒問題,但是會有很多不穩定因素,單片機死機或者程序跑飛都有可能,甚至燒壞單片機的I/O口
步進電機的轉速可控,輸出穩定,
一般電機(玩具上拆的)可以通過PWM來控制轉速,但是輸出不穩定,
當然,還有其他的電機,具體要查相關的資料了,
如果你的電機只是通短,那隨便找個能轉的就OK了
『貳』 熱電偶單片機如何測溫
熱電偶輸出的是電壓信號,毫伏。用單片機熱電偶測溫。單片機有帶A/D轉換的,將熱電偶輸出的毫伏信號(放大),輸入到單片機的A/D轉換口,轉換成數字量。單片機內存有熱電偶電壓溫度數據表,根據數字量查表查出溫度數,然後將溫度數從口輸出,顯示驅動單元顯示溫度。
『叄』 單片機測溫電路
用熱敏電阻測溫 看你精度要求高低了
如果不高可以採用精密電阻分壓方式測量
就是一個高精度穩壓源串聯一個精密電阻,下面再接你的熱敏電阻。
你通過測量熱敏電阻的電壓值以及穩壓源的電壓值算出熱敏電阻阻值從而測得溫度。
『肆』 單片機 熱敏電阻測溫
1、單片機熱敏電阻測溫首先要設計電路原理圖,如圖所示:
上圖R3為上拉電阻,T1為接熱敏電阻端,TC1為單片機AD採集口、電阻R4和電熱C6為阻容濾波電路。
2、上拉電阻R3的選擇:根據所用溫度的范圍,選擇熱敏電阻對應阻值范圍的中間值最好,這樣檢測的溫度偏差較小。
3、上拉電阻選定後,根據熱敏電阻阻值表,算出溫度真值表,用於軟體查表,計算出溫度值。在算溫度真值表前,首先要確定單片機AD模塊的解析度。
4、單片機軟體編程,濾波方法一般採用多次採集求累加和,去最大值和最小值,最後求平均。
5、單片機選擇:一般選用8位單片機就夠。但是,單片機自帶的溫度採集AD模塊,最好選用10位解析度,10位的AD模塊解析度高,溫度採集精確。
6、以上為單片機熱敏電阻測溫的一般流程。
『伍』 單片機電子測溫計該怎麼設計
單片機 + 測溫元件 + 顯示界面
單片機 :51,AVR,PIC隨便一款就可以啊。
測溫元件:數字的可以用TMP275,DS18B20等等,操作簡單,電路更簡單。模擬的可以用 NTC , PT100 ,熱電偶等等,看測什麼范圍了。
顯示界面:可以用液晶1602,12864,或者簡單的數碼管。液晶需要寫程序,網上的代碼到處都是。數碼管簡單好用。
再加一些外圍設備,按鍵啊,蜂鳴器啊什麼的,這個系統就差不多了。
不能貼圖,就這樣口頭描述了...
希望對你有些幫助。
『陸』 單片機 紅外測溫怎麼實現
紅外測溫用到非接觸測溫感測器,感測器這一塊建議你買現成的,當然單片機可以自己做的,
『柒』 用89C51單片機測溫0到1100攝氏度AD應如何選
什麼型熱電偶?如果是K型,直接用MAX6675。熱電偶需要冷端補償,線性修正的。我qq:52342487
『捌』 單片機測溫程序在臨界點跳來跳去問題
/****lcd1602顯示溫度(使用溫度感測器18b20)*****/
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
/*********液晶屏相關參數**************/
#definedata_portP1 //液晶屏指令、數據通信介面
sbitrs=P2^0; //液晶屏寄存器選擇介面(rs=0時選擇指令寄存器,rs=1時選擇數據寄存器)
sbitrw=P2^1; //液晶屏讀寫選擇介面(rw=0時選擇寫入,rw=1時選擇讀出)
sbiten=P2^2; //液晶屏使能介面(en=0時通信介面中斷,en=1時通信介面接通)
ucharcodeline1_str[]={"Temperature"};//液晶屏第一行要顯示的字元串
ucharcodenum_tab[]={"0123456789"};
/*********溫度感測器18b20相關參數**********/
sbitDQ=P3^5; //溫度感測器18b20的數據介面
/**********子函數聲明部分************/
voidT1_int();//定時器T1初始化子函數聲明
voidin_command(ucharcom); //向液晶屏輸入命令子函數聲明
voidin_data(uchardat); //向液晶屏輸入數據子函數聲明
voidlcd_disp_string(ucharstr[]); //液晶屏顯示一串字元子函數聲明
voidlcd_int(); //液晶屏初始化子函數聲明
voiddisp_temperature(uinttemp);//lcd1602顯示溫度子函數聲明
bitds18b20_ret(); //溫度感測器18b20復位子函數聲明
voidds18b20_wr_com(ucharcom); //向溫度感測器18b20寫入命令子函數聲明
voidrd_ram_command(); //發送命令子函數(讀取18b20的RAM)
uintds18b20_rd_data(); //讀出溫度感測器18b20寄存器的相關數據(主要是溫度值)子函數聲明
voidtemperature_convert();//18b20溫度轉換子函數聲明
voiddelayms(uintms); //毫秒延時子函數聲明
voiddelay_n10_us(ucharn); //微秒延時子函數聲明
/************************************/
voidmain()
{
T1_int(); //定時器T1初始化
DQ=1; //釋放溫度感測器18b20的數據介面
temperature_convert(); //第一次調用18b20溫度轉換子函數消除85°C問題
lcd_int(); //液晶屏初始化(放在18b20溫度轉換子函數後邊用來延時,跳過85°C)
while(1)
{
temperature_convert(); //調用18b20溫度轉換子函數
rd_ram_command(); //發送命令子函數(讀取18b20的RAM)
disp_temperature(ds18b20_rd_data());//調用lcd1602顯示溫度子函數
}
}
/**********定時器T1初始化*************/
voidT1_int()
{
TMOD=0x10; //00010000T1工作在定時方式1
TH1=0; //T1設定初值
TL1=0;
TR1=0; //暫時關閉T1
}
/**********18b20溫度轉換子函數*************/
voidtemperature_convert()
{
while(ds18b20_ret()==0);//溫度感測器18b20復位
ds18b20_wr_com(0xcc); //向溫度感測器18b20寫入"跳躍ROM命令"
ds18b20_wr_com(0x44); //向溫度感測器18b20寫入"溫度轉換命令"
delay_n10_us(50); //500us延時,等待轉換完成
}
/**********發送命令子函數(讀取18b20的RAM)***********/
voidrd_ram_command()
{
while(ds18b20_ret()==0);
ds18b20_wr_com(0xcc); //向溫度感測器18b20寫入"跳躍ROM命令"
ds18b20_wr_com(0xbe); //向溫度感測器18b20寫入"讀RAM命令"
}
/******讀出18b20寄存器的相關數據(主要是溫度值)子函數******/
uintds18b20_rd_data()
{
uchari;
uinttemp_val;
for(i=0;i<16;i++)
{
temp_val>>=1;
DQ=0;
_nop_();
DQ=1;
_nop_();
_nop_();
if(DQ==1)
{
temp_val|=0x8000;
}
delay_n10_us(7); //70us延時,確保讀出
}
return(temp_val);
}
/******向溫度感測器18b20寫入命令子函數聲明****/
voidds18b20_wr_com(ucharcom)
{
uchari;
for(i=0;i<8;i++)
{
if((com&0x01)==0)
{
DQ=0;
delay_n10_us(7); //70us延時,確保寫入0
DQ=1;
_nop_();
}
else
{
DQ=0;
_nop_();
DQ=1;
delay_n10_us(7); //70us延時,確保寫入1
}
com>>=1;
}
}
/**********溫度感測器18b20復位子函數**********/
bitds18b20_ret()
{
uinttemp;//暫存脈沖時間
DQ=0;//啟動復位脈沖
delay_n10_us(50); //500us延時(大於480us)
DQ=1;//停止復位脈沖
TR1=1; //啟動T1
while(DQ==1&&TH1*256+TL1<=60);//等待18b20回應,等待時間不超過60us
if(DQ==0) //18b20回應
{
temp=TH1*256+TL1;
while(TH1*256+TL1-temp<40);//等待60us再次檢測回應脈沖是否存在
if(DQ==0) //18b20正常回應
{
while(TH1*256+TL1<=480);//等待正常復位完成
TR1=0; //關閉T1
TH1=0; //計時歸零
TL1=0;
return(1); //18b20有正常回應返回1
}
else
{
TR1=0; //關閉T1
TH1=0; //計時歸零
TL1=0;
return(0); //18b20有正常回應返回0
}
}
else
{
TR1=0; //關閉T1
TH1=0; //計時歸零
TL1=0;
return(0); //18b20沒有回應返回0
}
}
/*********lcd1602顯示溫度子函數聲明********/
voiddisp_temperature(uinttemp)
{
uchartemp_h,temp_l,flag=0;//溫度整數部分,小數部分(二進制)和最高位是否為'0'標志
uinttemp_decimal=0;//存儲溫度值的小數部分(十進制)
in_command(0xc2); //設定第二行字元串起始顯示位置
if(temp>=0x8000)
{
in_data('-'); //顯示'-'號
temp=~temp;
temp+=1;
}
else
{
in_data(''); //'+'號不顯示
}
temp_h=temp/16;
temp_l=temp%16;
if(temp_h/100!=0)
{
flag=1;
in_data(num_tab[temp_h/100]); //顯示溫度值的百位
}
else
{
in_data(''); //百位為'0'則百位不顯示
}
temp_h%=100;
if(temp_h/10!=0||flag==1)
{
flag=1;
in_data(num_tab[temp_h/10]); //顯示溫度值的十位
}
else
{
in_data(''); //百位,十位都為'0'則十位不顯示
}
temp_h%=10;
in_data(num_tab[temp_h]); //顯示溫度值的個位
in_data('.'); //顯示小數點
if(temp_l/8==1)
{temp_decimal+=5000;}
temp_l=temp_l%8;
if(temp_l/4==1)
{temp_decimal+=2500;}
temp_l=temp_l%4;
if(temp_l/2==1)
{temp_decimal+=1250;}
temp_l=temp_l%2;
if(temp_l==1)
{temp_decimal+=625;}
in_data(num_tab[temp_decimal/1000]);//顯示溫度值的十分位
in_data('');
in_data(223); //顯示溫度單位標志'攝氏度'
in_data('C');
}
/**********液晶屏初始化子函數**********/
voidlcd_int()
{
/***************LCD初始設置*****************/
delayms(15); //延時15MS,等待LCD初始化
in_command(0x01); //清顯示屏
in_command(0x38); //8位通信,2行顯示,5*7點陣
in_command(0x0c); //開顯示,關游標,關閃爍
in_command(0x06); //字元不動,游標右移動,地址加一
/************1602顯示上電後電機默認的狀態信息**************/
in_command(0x80); //設定第一行字元串起始顯示位置
lcd_disp_string(line1_str); //顯示數據(字元)
}
/**********液晶屏顯示一串字元**********/
voidlcd_disp_string(ucharstr[])
{
uchari=0;
while(str[i]!='