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实现多路温度测控,具有现场安装简单、控制方便、系统性能好、易于扩展和成本低等优点,应用领域和市场前景非常广。