课程设计时的一点小感触,设计内容是利用单片机对DS18B20采集的温度进行处理,并且当温度达到一定值时相应的继电器动作。温度值由数码管显示。
总体概要:
单片机采集DS18B20里的温度转换数据,将数据转换后送入数码管显示,数码管的扫描采用定时器0定时扫描;如果采集到的温度值大于设定的值时,发光二极管亮灯、蜂鸣器报警;如果检测到按键信号就关闭报警单元,解除报警。同时单片机将采集到的温度数据上传至PC机,PC机可以设定温度报警值上限,并可以发出解除解除报警信号以解除报警。扩展功能:PC机可以根据采集的一组温度信号描绘出一组曲线;PC机可以接收多个采集点的温度数据信息也可以实现对其控制。
设计要点:
一.单片机与DS18B20通信:
注意DS18B20的四个时隙:复位时隙、应答时隙、写时隙、读时隙。必须应当明确读时隙、写时隙中的“读”与“写”指单片机,读写时隙后应少用延时,以保证单片机可以可靠的取数据或写数据。
1.复位和应答脉冲时隙
每个通信周期起始于微控制器发出的复位脉冲,其后紧跟DS18B20发出的应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20的数据。在每一个时隙,总线只能传输一位数据。
2.写时隙
当主机将单总线DQ从逻辑高拉为逻辑低时,即启动一个写时隙,所有的写时隙必须在60~120us完成,且在每个循环之间至少需要1us的恢复时间。写0和写1时隙如图所示。在写0时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线。
总之单片机应当在写时隙后15us之内完成写操作,因为15us后18B20开始读取写入的数据。应当引起重视。
3.读时隙
当主机将单总线DQ从逻辑高拉为逻辑低时,并且保持低1us,再将DQ拉高才启动一个读时隙,读数据必须在DQ拉高后,并且距起始时刻15us内完成,即读数据时DQ为高电平,读完数据时刻与起始时刻(下降沿)间隔小于15us。
DS18B20器件仅在主机发出读时隙时,才向主机传输数据。所以在主机发出读数据命令后,必须马上产生读时隙,以便DS18B20能够传输数据。所有的读时隙至少需要60us,且在两次独立的读时隙之间,至少需要1us的恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发起读时隙之后,DS18B20器件才开始在总线上发送0或1,若DS18B20发送1,则保持总线为高电平。若发送为0,则拉低总线当发送0时,DS18B20在该时隙结束后,释放总线,由上拉电阻将总线拉回至高电平状态。DS18B20发出的数据,在起始时隙之后保持有效时间为15us。因而主机在读时隙期间,必须释放总线。并且在时隙起始后的15us之内采样总线的状态。特别应当注意这句话也就是说单片机必须在15us以内取走数据,否则数据无法读出。
特别应当注意在进行四种时序操作时应当关闭程序中的中断,最直接的方法是关总中断,之后再打开。在进行严格的时序操作时记住这一点是很有必要的。
二.单片机与PC机通信:
确定通信协议:第一个字节,0~3位表示小数部分,4位表示报警状态信息,
5~7位表示采集点序号;的二个字节,0~6位表示温度数据的整数部分,7位表示数据符号位;第三个字节,0~3位循环冗余校验,4位表示奇偶校验,5~7位保留。双方采用确认重传机制进行通信。
知识总结:
一.延时时间计算
void delay(unsigned char i)
{
for(;i>0;i--)
;
}
delay(1)占用的时间:晶振频率11059200HZ,机器周期为1us,delay(1)时间为6us。
二.AT89S52单片机IO口的驱动能力:
有下面的参数:P1.7口串联一个电阻接地,P1.7输出高电平,改变电阻的值,测得如下参数:电阻两端电压:26mv,电阻1.94K;电阻两端电压:1.3mv,电阻阻值100;电阻两端电压:0.3mv,电阻阻值:30;通过以上三组数据不难得出,IO口高电平时,流过的电流仅为13uA左右,网上解释说:“51单片机IO口为集电极上拉输出方式,高电平输出电流等于上拉电阻的电流,这个电流比较小”。
故而用NPN的三极管(三极管发达模式下电流放大倍数100)无法驱动12V直流继电器(内阻为150,端电压超过8.5v时可以有效吸合),因为计算得到的基极电流约为800uA,IO口高电平时是无法提供如此大的电流的。因此无法用一级NPN三极管驱动此继电器。解决的方法是采用两级NPN驱动,或采用PNP三极管驱动,因为采用PNP三极管时IO口输出低电平可以让三机关工作在开关状态,IO口输出低电平时,电流可以达到10mA左右,可以满足基极电流为1mA的要求,网上说:“低电平输出是内部晶体管吸收的电流,最大可以达到10mA,但是整个端口的总电流不能超过24mA。”。故而驱动继电器时常采用PNP三极管。
特别应当注意:三极管驱动继电器时,工作在开关状态(饱和与截止状态),而不是放大状态,上面基极电流的计算采用放大时的参数计算,因为在饱和模式下集电极电流与基极电流也有关系,但比放大模式下的倍数要小,但可以如此计算。(实际计算发现,由于IO口最高电平为5V,PNP三极管基极电压为5v,发射机为12v,也就是说此时三极管无法由饱和状态转变为截止状态,要想达到截止状态基极电压至少为11.3v,因此上述设计方案只能适合5V的继电器。如想驱动12V继电器可以用MOS管驱动,实际发现此法案确实可行,栅极直接接IO口,漏极接地,源极接继电器加电源。因为一般MOS管开启电压小于5V(约3.6V),IO口可以控制MOS截止、饱和状态转换。)
三.设计继电器驱动电路的一点收获:
a.单片机IO口的驱动能力,高电平约13uA,5v/10K=0.5mA剩余的大部分被内部分流,低电平时10mA,设计时应充分考虑端口驱动能力。
b.对三极管有了更近一步的认识:满足双结反偏时为截止状态,双结正偏时为饱和状态,并以此计算基极电阻。
c.对各种IO口继电器驱动电路的效果有了了解,5V时考虑用PNP驱动,基极限流电阻的计算选择,特别是计算;驱动大于5V的继电器时采用MOS管。
d.继电器两端加续流二极管是很有必要的,对继电器的可靠关断与吸合是必须的。
四.关于复位电路的设计
首先要明白复位电路是利用电容的充放电实现自动获取低电平或高电平然后稳定于一个固定的电平。充电时间常数为RC乘积,充电时间常数表示电压由0V上升至最高电压的时间,这个值应远远大于复位时所需的时间。例如典型的51单片机可靠复位时所需时间为至少两个机器周期(晶振12MHZ,就是2us)但此时的时间常数为10ms(RC乘积约为0.01,R为10K,C为10uF)就很好的说明此问题。
五.单片机写IO口之前,应先进行读操作,目的是激活IO口,否则写操作可能无效。
六.单总线挂接多个传感器时,操作的顺序为:所有传感器启动转换,匹配序列号,从暂存器中去数据.
reset(); //复位应答信号
write(0xcc); //跳过总线操作
write(0x44);
reset();
write(0x55);
for(part_i=0;part_i<8;part_i++)
write(g_id[g_numbe][part_i]);
write(0xbe); //开始读取暂存器中的数据
b1=read();
b2=read();
datachange(b1,b2);
以上三部分分别对应采集、匹配、读取.
start(); //用于获取传感器的ID号,并将8字节ID在发光二极管上显示
for(part_i=0;part_i<8;part_i++)
g_id[0][part_i]=read();
for(part_i=0;part_i<8;part_i++)
{ P1=g_id[0][part_i];
delay1(45000);
}
七.程序初始化部分,定时器应当先付初值,再打开,如果使用定时器1作为串口波特率发生器,那么串口的工作方式设置一定要先于定时器付初值操作。因为串口不同的工作方式波特率的计算方法不一样。如果先付初值再设置串口工作方式,就不能得到想要的结果。开总中断一般放在最后。
自己总结的,过路的多多指正,谢过。
tengjingshu_112148725 2009-8-4 00:17
用户208176 2009-8-3 19:56
tengjingshu_112148725 2009-7-29 09:27