1 引言
自动调温光疗系统是一种医用理疗仪器,其原理是采用单片机对可控硅的控制来控制高压下的激光输出器进行理疗,在激光输出器工作的同时对其进行实时温度检测,利用检测到的温度状况决定可控硅的导通状态,达到改变激光输出器输出功率的目的,得到最佳的疗效。
根据上述特点,本文选择了单总线数字温度传感器DS18B20进行温度采集,介绍了使用DS18B20的程序代码。为了使可控硅的输出功率连续均匀变化,本文设计了一种利用外部中断和定时器中断实现可控硅移相触发的编程方法,满足治疗光的强度均匀灵敏变化的需要。
2 调温光疗系统介绍
2.1系统结构介绍
本系统由5部分组成:CUP处理单元,键盘输入单元,LCD显示单元,测量温度单元,可控硅控制激光器输出单元。
CUP处理单元运行系统程序调度所有任务,键盘用于输入系统设定参数及控制状态模式选择,LCD为系统提供了良好的操作界面,测量温度单元负责对激光输出器的温度进行实时检测,可控硅控制输出单元针对设定参数及检测到的温度来控制激光输出器的输出。本文将详细介绍测量温度单元和可控硅控制单元的软硬件设计。
2.2 系统程序流程介绍
本医疗系统的程序流程为:系统首先数据进行初始化,这里的初始化主要包括定时器和外部中断的设置,初始化完成后开外部中断,然后系统进行温度采集,根据采集的温度及系统的设置参数来决定定时器定时参数,该定时参数直接决定移相触发可控硅时导通角的大小。接着系统再进行温度采集,选择定时器定时时间参数,依次循环下去。
在系统循环工作过程中,人工可以通过按键改变系统的各种工作参数,工作参数直接影响控制可控硅导通角的定时器参数的选择。系统的主流程框图如图1(a)所示意。当系统循环执行时,外部过零脉冲信号会使系统进入外部中断服务程序,进而控制可控硅的的导通。
图1:系统程序流程图
3 测量温度单元介绍
热电偶或铂电阻,需放大电路和A/D转换实现温度信号采集。为简化系统硬件设计,选用了DALLAS公司生产的单总线数字温度传感器DS18B20。
DS18B20提供的“一线”总线接口只需一个端口进行通讯;测温范围为-55~+125℃,在-10~+85℃的范围内,精度为±0.5℃;温度以9~12位数字量读出,分辨率为0.0625℃,该精度满足本医用光疗系统的要求;同时DS18B20采用超小型的μSOP封装,体积很小,可以直接敷贴在激光器的前端。由于DS18B20提供的“一线”总线接口只需一个端口与CPU通讯,因此在硬件上,利用单片机AT89C52的一个端口P2.0与DS18B20的DQ引脚相连。
3.1 DS18B20工作原理及程序
在对DS18B20进行读写操作之前,CPU首先发出一个复位脉冲,最小脉冲宽度为480μs的低电平信号;然后CPU释放单总线,使之处于接收状态。单总线经过上拉电阻被拉至高电平。当DS18B20检测测到I/0端的上升沿时,就等待15—60μs,再向主CPU发出应答脉冲(60一240μs的低电平信号)。初始化子程序为:
bit init_18b20(void);
{ bit presence; //用于保存DS18b20对CPU的应答信号
DQ = 0; //复位脉冲低电平
delay_20us(25); // 延时500us
DQ = 1; //复位脉冲高电平
delay_20us(4); //延时80us
presence = DQ; //保存DQ的状态
delay_20us(20); //延时400us
return(presence);//返回DQ的状态 }
当主CPU将I/O线从高电平拉至低电平时,且保持时间大于1μs,就作为一个读周期的开始。DS18B20的输出数据在读时序下降沿过后的15μs内有效,在此期间,主CPU应释放I/O线,使之处于读入状态以便读取DS18B20的输出数据。15μs后读时序结束,I/O线经上拉电阻变为高电平。通常读取一位数据至少要60μs,并且在两位数据之间至少要有1μs的恢复期。读温度字节的子程序为:
byte read_byte(void)
{byte i; //变量用于循环自加
byte value = 0;//用于移位操作的临时变量
for (i=8;i》0;i--)
{value》》=1;
DQ = 0;
NOP_1uS; //延时1us的空操作宏的空操作宏
DQ = 1;
NOP_1uS; NOP_1uS; NOP_1uS;
if(DQ)value|=0x80;
delay_20us(3); // 延时60us
}return(value);//返回对到的字节 }
CPU把I/O线从高电平拉至低电平时,作为—个写周期的开始。写时序包括两种类型:写1时序和写0时序,写1或写0必须保持至少60μs,在两个写周期之间至少有1μs的恢复期。DS18B20在I/O线变低电平后的15—6Oμs的时间内进行采样。
若I/O线为高电平,即认为写入了一位1;反之,则认为写入了一位0。主CPU在开始写1周期时,必须将I/O线拉至低电平,然后释放,15μs内将I/O线拉至高电平。主CPU在开始写0时,也将I/O拉至低电平,并保持60us的时间。写字节的子程序为:
void write_byte(char val)//“val”用语传递需要写的字节
{unsigned char i;// 变量用于循环自加
for (i=8; i》0; i--)
{DQ = 0; NOP_1uS; NOP_1uS;
DQ = val&0x01;
delay_20us(5); //延时间100us
DQ = 1;val=val/2; //右移一位
}delay_20us(5); //延时间100us }
每次访问DS18B20的操作都是以初始化器件开始,然后发出ROM命令和功能命令。初始化器件会使主机接到应答信号,ROM 命令与各个从机设备的惟一64位ROM 代码相关,允许主机在1一Wire总线上连接多个从机设备时,指定操作某个从机设备。这些命令还允许主机能够检测到总线上有多少个从机设备以及其设备类型,或者有没有设备处于报警状态。
本系统是只有一个温度传感器的单点系统,利用跳过ROM(SKIP ROM)命令,主机不必发送64 b序列号,从而节约了大量时间。ROM命令后,主机就可以发出指定功能命令(温度转换、读暂存器等)来完成操作。本系统中读取温度的程序为:
unsigned int Read_Temperature(void)
{ unsigned char a,b;// 用于存储温度数据的变量
if(init_18b20()==0)
{write_byte(0xCC); //发送Skip ROM指令
write_byte(0x44); // 发送温度转换指令
delay_20us(1);
if(init_18b20()==0)
{write_byte(0xCC); //发送Skip ROM指令
write_byte(0xBE); //发送读取暂存寄存器指令
a=read_byte(); //读出低八位温度数据
b=read_byte(); //读出高八位温度数据
temperature=((b*256+a)/16);//计算出10进制温度值
}}return(temperature);}