×
单片机 > 单片机程序设计 > 详情

基于AT89C51单片机低成本温度控制实验系统

发布时间:2020-06-06 发布时间:
|

  笔者在电子市场购买了一块3.6V450mAh的锂离子充电本文介绍一种以AT89C51单片机为核心的低成本温度控制实验系统。该系统采用温度传感器DS18820实现一线数字式测温,经过PID算法输出PWM波,再由PWM信号控制固态继电器,调节热阻丝发热功率,最终达到控制被控对象温度的目的,该系统还扩展了人机接口和串口通信,实现温度设定、控制及图像显示。

  硬件设计


  1.总体设计

  系统结构框图如图1所示,以AT89C51单片机为控制核心,DS18820电池,外型尺寸完全符合原机的内部空间要求。按照正确的正负极性焊连到电路中即可完成电池的更换工作。实际使用效果极佳,连续播放时间超过了7个小时(图4)。测量被控温度,外围电路包括人机接口的按键与数码显示电路、温度读取与控制驱动电路以及与上位机串行通信电路。用户通过按键设定加热温度后,系统启动加热“热得快”烧水。当前水温经过DS18820测量送给单片机,单片机经PID校正后输出PWM信号,然后通过固态继电器驱动热得快加热,最终使水温保持在设定值上,误差不超过O.1℃。

  单片机系统通过串口与上位PC机实现通讯,上位机实现温度、温度曲线显示以及PID参数的设定,用户通过上位机可以清晰地看到设定的PID参数所产生的控制作用,如系统的微调、时间等参数。

  2温度测试模块

  系统选用美国DALLAS公司生产的单总线DS18820数字式温度传感器作为温度模块,引脚图如下图所示。

DS18820具有体积小、经济、使用方便灵活、测试精度高、性价比高、CRC校验功能等特点,温度测量范围为-55+125℃,可编程为9位~12位A/D转换精度,测温分辨率达0.0625℃,被测温度采用带符号位扩展的16位数字方式串行输出。其工作电源即可在远端引入,也可采用寄生电源方式产生,多个DS18820可以并联到3根或2根线上,CPU只需一根端口线即可与多个DS18820通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

  文中的DS18820三引脚分别接公共电源+5V、电源地和单片机P1.O引脚,具体电路如下图所示,由于DS18820为1-WIRE器件,只需在其信号线上加一个上拉电阻到+5V电源即可。

  同时,每一个DS18820均有唯一系列号,即允许在不同地方放置温度灵敏器件,通过SearchRom指令选择不同的DS18820芯片,实现温度的多点监测,如HVAC环境控制、建筑物、设备或机械内温度检测、过程温度监视和控制等。

  3键盘及显示电路模块

  本系统采用PT6961驱动控制电路同时驱动键盘与数码管。PT6961为带有键盘扫描接口的LED驱动控制专用电路,内部集成MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于VCR、VCD、DVD及家庭影院等产品的显示屏驱动、多种显示模式(11段×7位~14段×4位)、键扫描(10×3bit)电路、灰度调节电路(占空比8级可调),与单片机实现串行数据传输,节省了单片机引脚。PT6961可以自己驱动显示和键盘模块电路,可实现串行数据传输,同日寸对时序要求较高。

  单片机的P0.6引脚与PT6961的时钟线相连,控制时序;P0.7引脚与PT6961的片选端相连,选通芯片,P0.4、PO.5引脚与PT6961的DOUT、DIN端相连,进行数据和指令的串行传输,具体的传输数据仍由单片机编程控制。PT6961在cLOCk端产生下降沿时,读取DIN口的数据,在clock端产生上升沿时,在DOUT口产生按键寄存器值可供单片机读取。硬件连接电路如下图所示,该芯片可以同时驱动(8~14)段×(4~7)位数码管和3×10个按键,本文选用驱动6个数码管和1×6个按键。

  4.执行模块

  系统采用固态继电器(SSR)控制热得快电源,固态继电器是一种四端器件,两个输人端,两个输出端,输入端接控制信号,输出端与负载、电源串联,SSR实际是一个受控电力电子开关。

  单片机经PID算法,从P1.5口输出PWM波,经ULN2003反相驱动后,作为SSR的控制信号,如图5所示,在固态继电器输出端接两个二端口插件,方便引线串入热得快插线中。由于SSR与热得快接口是整个系统和电路板唯一一块强电部分,为将其对弱电部分的干扰降到最低,弱电电路线远离该部分电路,且不共地,接线端子的脚间距应大于SSR的脚间距。

  5.串行通信模块

  本系统采用串口实现单片机与上位计算机的连接,单片机向上位机传送温度值,上位机显示该值,并画出温度变化曲线图,反应温度的变化情况,同时上位机可以调整PID参数,使系统适用于不同的对象。串行通信连接如下图所示,其中5个电容均取O.1μF的典型值,串口

  DB9的5端为公共端接地端,2、3端则分别连接信号的接收端和发送端,该电路完成TTL电平与RS232电平转换,DB9接口通过交叉串口线连接到PC机上,完成硬件的串行通信。

  软件设计

  为加强程序的可读性、可移植性和便于调试,系统软件设计采用模块化思想,程序运行时,通过主程序调用各子程序模块。本文主程序流程如下图所示,软件设计主要讲述DS18820信号处理子程序和串口通信子程序。

  1.DS18820信号处理子程序

  DSl8820为1-wire制器件,采用一根信号线即可与单片机进行串行通信,简化了硬件电路,但是,在软件设计中须进行复杂的时序控制。DS1820单线通信功能为分日寸完成,有严格的时隙概念,系统对DS1820的各种操作必须按协议进行。

  操作协议为:初始化DS1820(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据,DS18820操作程序流程如下图所示。

  本文只有一个DSl8820挂在总线上,因此每次对总线进行读写日寸,可跳过读ROM指令,为提高测温精度,文中采用默认的12位数码转换,即0.0625度/位,程序如下:

   #include

  sbit DQ=P1^O;

  void Init_DS18820();

  WriteOneChar(unsigned char dat);

  char ReadOneChar();

  void deIay(unsigned int i);

  unsigned int ReadTemperature()

  {

  unsigned char a=0,c=O:

  unsigned char b=O;

  unsigned int t=O;

  float tt=0;

  Init_DS18820();

  WriteOneChar(0xCC);

  /*跳过读序号列号的操作*/

  WriteOneChar(Ox44);

  /*启动温度转换*/

  Init_DS18820();

  WriteOneChar(OxCC);

  /*跳过读序号列号的操作*/

  WriteOneCha r(0xBE);

  /*读取温度寄存器等(共可读9个寄

  存器)前两个就是温度*/

  a=ReadOneChar();

  /*Read the low byte of the tem-perature*/

  b=ReadOneChar();

  /*high*/

  c=a;

  a>>=4;

  b<<=4;

  t=aㄧb;

  ,  c&=0x0F;

  tt=c;

  tt*=0.0625;

  c=tt*1 0+0.5;

  t=t*1 0+c;

  return t;

  /*温度转化,位了避免浮点数运算,

  尽量用整形数据运算,这样可以减轻CPU负担*/

  }

  void Init_DS18820()

  /*初始化函数*/

  {

  unsigned char x=0;

  DQ=1;

  /*DQ复位*/

  delay(8);

  /*稍做延时*/

  DQ=0;

  /单片机将DQ拉低*/

  delay(80);

  /*精确延时大于480μs*/

  DQ=1;

  /*拉高总线*/

  delay(1 4):

  x=DQ;

  /*稍做延时后,如果x=0则初始化

  成功x=1则初始化失败*/

  }

  char ReadoneChar()

  /*读一个字节*/

  {

  unsigned char i=O;

  unsigned char dat=O;

  for(i=8;i>O;i--)

  {

  DQ=0:

  /*给脉冲信号*/

  dat>>=1;

  DQ=1;

  /*给脉冲信号*/

  if(DQ)

  datl=Ox80;

  delay(4);

  }

  return(dat);

  }

  WriteOneChar(unsigned char dat)

  /*写一个字节*/

  {

  unsigned char i=O;

  for(i=8:i>O:i--)

  {

  DO=0;

  DQ=dat&Ox01;

  delay(5);

  DQ=1:

  dat>>=1;

  }

  delay(4);

  }

  void delay(unsigned int i)

  /*延时函数*/

  {

  while(i--);

  }

  2,串行通信程序设计

  单片机通过引脚RXD(P3.O,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯,SBUF为串行口缓冲寄存器,包括发送寄存器和接收寄存器,具有相同名字和地址空间,但不会出现冲突,因为其中一个只能被CPU读出数据,另一个只能被CPU写入数据。

  单片机的串行口的四种工作方式中,方式0和2的波特率是固定的,方式1和3的波特率是可变的,由定时器T1的溢出率控制,方式2为自动重装入初值的8位定时器/计数器模式,作为本文的波特率发生器。

  上位机编程中,本文采用最常用的通信控件MSComm,实现可视化界面。MSComm控件的常用属性有:Comm-Port设置并返回通讯端口号:Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位;PortOpen设置并返回通讯端口的状态,也可以打开和关闭端口;Input从接收缓冲区返回和删除字符;Output向传输缓冲区写一个字符串。

  串口初始化程序如下

  BOOLJWDIg::OnInitDialog()

  {

  Comport SetCommPort(1):

  if(!Comport GetPortOpen())

  Comport.SetPortOpen(TRUE);

  /*打开指定的串口*/

  Comport.

  SetlnputMode

  (cOm-Input-

  ModeBinary);

  /*设置数据

  获取方式*/

  Comport.

  SetSettings

  (“9600,n.8,1”);

  /*设置波特率及其他通信

  数*/

  Comport.

  SetRThreshOld

  (n);

  /*设定每接受n个字符触发一次

  MSComm事件*/

  Comport.SetInputLen(0);

  /设置读取方式*/

  Comport.GetInput();

  /*预置缓冲区以清除残留数据*/

  return TRU E;

  }

  系统测试

  本系统实现的电路实物图如下图所示,通过按键设置预定温度,如81.7℃,设定PID参数,比例系数Kc=O.8、积分系数KI=O.007以及微分系数KD=5,设定PWM控制信号周期为20ms,采样周期Ts=1S,测量的实验数据经串行通信传递到上位机后实时显示的响应曲线实验中,测量温度由低升高,最后与设定温度值一致。

  结论

  本文介绍的温控实验系统即有单片机主控的可靠性,又有上位机监测的方便性,同时基于1-Wire总线DS18820实现多路温度测控,具有现场安装简单、控制方便、系统性能好、易于扩展和成本低等优点,应用领域和市场前景非常广。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单