Ⅰ 基于单片机的恒温控制系统
我刚帮别人做了一个,是按这个要求做的,你可以提出任意修改要求。
程序是汇编的,已经调试通过。
ProteUS仿真文件下载地址:
推荐:70电加热PRE.rar( http://ishare.iask.sina.com.cn/f/7033603.html )
; 设计基于单片计算机的温度控制器。用于控制电加热炉的温度。具体要求如下:
; 1. 温度连续可调,范围为30℃~150℃
; 2. 超调量σ%≤20%
; 3. 温度误差≤±0.5℃
; 4. 人-机对话方便
; 5. 控制算法采用PID或改进的PID或其他算法.
; (我用的是AT89C52的单片机:
; A.电加热炉经由温度传感器测量后,
; 通过V/F变换器的模数转换,
; 将电压或电流量转换为数字信号进入单片机内,
; 然后通过移位寄存器和译码器的信息转换,
; 通过显示驱动器来进行LED数码管的温度显示;
; B.单片机也通过双向可控硅来控制炉内的温度;
; C.用户通过按键来设置温度上限、下限值)
Ⅱ 怎样用PID算法对恒温箱的温度进行控制,求相关的51单片机汇编程序
本设计要求:本温度控制系统为以单片机为核心,实现了对温度实时监测和控制,实现了控制的智能化。设计恒温箱温度控制系统,配有温度传感器,采用DS18B20数字温度传感器,无需数模拟∕数字转换,可直接与单片机进行数字传输,采用了PID控制技术,可以使温度保持在要求的一个恒定范围内,配有键盘,用于输入设定温度;配有数码管LED用来显示温度。
技术参数和设计任务:
1、利用单片机AT89C2051实现对温度的控制,实现保持恒温箱在最高温度为110℃。
2、可预置恒温箱温度,烘干过程恒温控制,温度控制误差小于±2℃。
3、预置时显示设定温度,恒温时显示实时温度,采用PID控制算法显示精确到0.1℃。
4、温度超出预置温度±5℃时发出声音报警。
5、对升、降温过程没有线性要求。
6、温度检测部分采用DS18B20数字温度传感器,无需数模拟∕数字转换,可直接与单片机进行数字传输
7、人机对话部分由键盘、显示和报警三部分组成,实现对温度的显示、报警。
需要的话联系用户名扣扣
Ⅲ 基于单片机的恒温箱设计可能遇到什么难点
关键在于PID恒温。
第一步要先做好PID子程序
第二部需要摸索参数调整的规律。
Ⅳ 基于单片机恒温箱控制系统
只有图,没有程序。从图来看,端口配置不好,单一功能要充分利用端口,原则上P0口作为段吗,这里,如果作为位码的话可以节省一级驱动,应为P0口的驱动能力较强,极力推鉴1051-4051(端口驱动20mA),降低硬件成本,减少软件编程量。这里有一个仿真器带的温度显示程序。你参考一下,如果加上控制,在程序合适位置加入判断语句如if(****,P1.x=?),再配置一个输出端口,就行了。程序如下,附仿真图。
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDATA=P1^0;//DS18B20接入口
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char,shi,ge;//定义变量
/*延时子函数*/
voiddelay(uintnum)
{
while(num--);
}
/*************DS18b20温度传感器函数*********************/
voidInit_DS18B20(void) //传感器初始化
{
ucharx=0;
DATA=1; //DQ复位
delay(10); //稍做延时
DATA=0; //单片机将DQ拉低
delay(80); //精确延时大于480us//450
DATA=1; //拉高总线
delay(20);
x=DATA; //稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DATA=0;//给脉冲信号
dat>>=1;
DATA=1;//给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
//写一个字节
voidWriteOneChar(unsignedchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
//读取温度
intReadTemperature(void)
{
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
t=b;
t<<=8;
t=t|a; //得到温度值的各个位的值
t=t*0.0625; //得到实际的温度值
return(t);
}
/*显示子函数*/
voiddisplay(int,intshi,intge)
{
P0=0xff; //对数码管清零,防止串扰
P2=0xfb;
P0=table[]; //显示百位
delay(50); //一小段延时动态显示
P0=0xff; //对数码管清零,防止串扰
P2=0xf7;
P0=table[shi]; //显示十位
delay(50);
P0=0xff;
P2=0xef;
P0=table[ge]&0x7f; //显示个位
delay(100);
P0=0xff;
P2=0xdf;
P0=table[0]; //显示小数位,这里没有处理小数位,默认的为0
delay(50);
}
voidmain()
{
inttemp;
while(1)
{
temp=ReadTemperature(); //读温度
=temp/100; //获取百位
shi=temp%100/10; //获取十位
ge=temp%10; //获取个位
display(,shi,ge); //显示函数
}
}