‘壹’ 设计一个单片机测温系统,请高人指点!!!
单片机不应该直接带负载,功率器件要公光耦隔离,你的电机驱动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]!='