资源描述
盐城工学院本科生毕业设计说明书 2016
目 录
1 绪论 1
2 组合机床总体设计 2
2.1 总体方案论证 2
2.1.1 被加工零件的特点 2
2.1.2 工艺路线的确立 2
2.1.3 机床配置型式的选择 2
2.1.4 定位基准的选择 3
2.1.5 选用滑台传动型式 3
2.2 确定切削用量及选择刀具 3
2.2.1 选择切削用量 3
2.2.2 计算切削力、切削扭矩及切削功率 4
3 组合机床主轴箱设计 5
3.1 绘制主轴箱原始依据图 5
3.4 主轴箱坐标计算、绘制干涉检查图 20
3.4.1 计算传动轴的坐标 21
3.5.2 齿轮的校核 23
5 结论 26
参考文献 27
致 谢 28
附 录 29
摘要:随着科技的不断发展,温度作为被常用的被控参数,在工业生产中起到至关重要的作用。如何精确的测量控制这些被控参数是我们急需解决的问题。本文系统的介绍了数字温度测试系统的设计和实验分析。详细的介绍了以AT89C52单片机为核心的温度测试系统的工作原理和设计过程。该系统的主要组成部分:AT89C52单片机、DS18B20温度传感器、显示电路、温度测试电路、蜂鸣器、自锁开关、外接电源电路。该系统可以实时监测温度、显示温度和设定温度。并且该系统设有超限、底限温报警程序。实验测试表明,本系统设计对温度的测试有简单、方便的特点,并且提高了被控温度的精度。温度信号的采集采用温度芯片DS18B20,以数字信号的形式传送给单片机。
关键词:温度测试 , AT89C52 , DS18B20 , 蜂鸣器
前言:在物理学中,表征物体冷热程度的物理量就是温度。在工业生产过程中,尤其在化工、建材、冶金、机械等工业中,温度的监测直接影响生产安全、生产效率、产品质量、能源节约等。所以在当今社会中,温度的测量和控制越来越重要,应该引起高度的重视。
单片机的的应用应该说是当今工业测量与控制领域的一场技术变革, 单片机就是把复杂的东西简单化,所以自动化、智能化均与单片机息息相关。温度测试系统采用单片机控制方式,可以解决温度测试系统中严重滞后的问题。并且可以提高采样频率,控制效果和测试精度也可以得到很大程度的提高。现代自动控制发展的必然趋势是智能化,如今在大多数自动控制系统中都应用到了工控机,小型机,有的甚至采用巨型机处理机。在这些处理机中,有一个共同的特点——运行速度高、内存大、数据存储器多。所以这就带来了一个问题,成本大大提高。而对于小型的系统来说,配置这样一些高速的处理机违背了这些小系统经济效益的原则。所以采用成本低廉的单片机控制是不二的选择。
在当今社会,电子技术及应用需求的飞速发展,促使单片机技术发展迅速,因此单片机在各个方面均取得了很大的发展。如今,完全可以应用单片机和温度传感器对某一物体进行实时监测。不仅可以监测一个地方,而且在监测某一处的同时可以监测多点温度。
第1章 系统总体设计
1.1 系统设计任务与要求
1.1.1 系统设计任务与要求
该温度测试系统的组成主要以AT89C52为核心的主控电路、测温电路(DS18B20)、LED显示电路、蜂鸣器发光二极管报警系统、电源模块、复位模块,实现对温度的实时监测。
主要技术指标:温度测量范围是-55℃—+125℃。
根据任务设计说明书,系统的分析温度测试系统的设计需求,并分别对硬件和软件进行总体的设计。完成硬件和软件的设计后,运用Protues仿真软件对设计的结果进行验证和修改。
1.2系统模块结构论证
1.2.1方案一
非线性校正方法应用铂电阻测试温度,利用桥式电路的热敏电阻的感温效应,采集测量温度变化的电流或电压信号,通过放大器将信号放大,然后经过A/D转换器,最后通过显示电路,就可以将被测量的温度以数字的形式在LCD1602液晶显示器上显示出来。
图1-1铂电阻桥式测温电路
1.2.2方案二
如今电子技术飞速发展,温度测试的方法也越来越多,因此考虑采用数字温度传感器测试温度,结合单片机电路的设计。根据设计要求、设计任务,选取适当的温度传感器。由设计要求可知,测量范围是-55℃—+125℃,因此很容易得到DS18B20温度传感器完全符合测量要求,所以直接采用DS18B20温度传感器,可以直接读取被测量的温度数值,简单、方便、快捷。然后进行转换,一步步完成设计要求。
图1-2 DS18B20测温系统框图
1.2.3方案比较
方案一采用了模拟温度传感器的方式,数据处理比较繁琐,而且容易发生信号失真现象。方案二DS18B20温度传感器可以直接把被测量的温度转换为串行数字信号,交给单片机处理,这种测试方式的优点是功耗低、性能高、抗干扰能力强等。所以对比方案一和方案二,很容易看出方案二优于方案一,因此采用电路简单、软件设计容易的方案二,方案二的电路设计方框图如图1-3所示
图1-3 温度计电路总体设计方案
DS18B20是达拉斯公司生产的数字传感器,该数字温度传感器具有以下特征:1、独特的单线接口,而且进行通讯只需要一个端口引脚。2、每个元器件都有独一无二的64位的序列号存储在内部存储器中。3、多点分布式测温。4、不需要外部器件。5、供电范围是3.0V—5.5V,可以通过简单地数据线供电。6、测温范围是-55℃—+125℃。7、使用者可以将温度计分辨率选择为9—12位等等。
1.3.电源模块的确定
我们所设计的系统所需要的电压不是很大,所以我们拟采用电池供电,因此给出以下几种供电方案以便比较,筛选出最合理、最恰当的方案。
方案1:
考虑采用12V蓄电池为温度测试系统供电。从蓄电池的特点考虑,蓄电池具有以下几个特点:使用寿命长 ;放电倍率高,电池内阻非常小,可以大电流放电 ;自放电低;蓄电池具备很强的电流驱动能力,电压输出性能也非常稳定。唯一不足的是,蓄电池的体积太大,携带不方便,而且价格较贵,所以如果本次设计采用蓄电池便会大大的增加了成本。因此方案1我们应该舍弃。
方案2
考虑到单片机传感器的受压范围3.0V—5.5V,所以拟选择三节五号干电池串联组成电源,4.5V的电压在温度传感器工作电压之内,不会烧坏电路,满足温度测试系统的要求。并且温度测试系统运行稳定,电源的更换也十分方便,所以方案2是电源模块的不二选择。
综合以上两个方案的比较,方案2更加便捷、便宜、合理。
1.4、显示模块
方案1:
采用液晶显示频LCD1602显示。液晶显示频LCD1602最大的特点就是显示速度快,使用便捷、简单,液晶屏显示的结果简单明了,让人一目了然。而且我们要求显示两行结果,LCD1602液晶显示屏也符合系统设计的要求。因此可以考虑选用LCD1602液晶显示屏。
方案2:
采用LED数码管显示 。LED数码管的基本满足我们温度测试系统的设计要求,唯一不能满足的是LED数码管不能显示两行结果,因此应该舍弃该方案。
以上两种方案相比较,选择方案1更符合温度测试系统的设计要求。
2 硬件实现及单元电路设计
2.1 主控制模块
主控制最小系统电路如图5所示。
图 5
2.2 电源模块
采用3节1.5 V 五号干电池串联共4.5V给系统供电。实物图如图6。
图 6
2.4 显示模块
显示模块采用1602液晶显示接口电路如图7
图 7
2.5 单片机最小运行系统
(1)晶振
晶振为单片机提供时钟信号。单片机XIAL1和XIAL2分别接30PF的电容,中间再并个12MHZ的晶振,形成单片机的晶振电路。
图8 晶振电路
(2)复位电路
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。
图9 复位电路
ALE引脚悬空,复位引脚接到复位电路、VCC接电源、VSS接地、EA接电源
2.6 温度传感器(DS18B20)电路
(1) DS18B20基本介绍
DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号处理器处理。
DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7K上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。
因此,下图电路只适应于单一温度传感器测温情况下使用,不适宜采用电池供电系统中。并且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。
图10 温度传感器电路引脚图
(2) DS18B20控制方法
DS18B20有六条控制命令:
温度转换 44H 启动DS18B20进行温度转换
读暂存器 BEH 读暂存器9个字节内容
写暂存器 4EH 将数据写入暂存器的TH、TL字节
复制暂存器 48H 把暂存器的TH、TL字节写到E2RAM中
重新调E2RAM B8H 把E2RAM中的TH、TL字节写到暂存器TH、TL字节
读电源供电方式 B4H 启动DS18B20发送电源供电方式的信号给主CPU
(3) DS18B20供电方式
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图3.1所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个三极管来完成对总线的上拉。本设计采用电源供电方式, P2.3口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个上拉电阻和STC89C52的P2.3来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10 μs。采用寄生电源供电方式是VDD和GND端均接地。由于单线制只有一根线,因此发送接收口必须是三状态的。主机控制DS18B20完成温度转换必须经过3个步骤:
l 初始化。
l ROM操作指令。
l 存储器操作指令。
2.7 蜂鸣器、发光二极管报警电路
电路主要是用来设定温度报警温度的、有高温和低温报警。
图11 蜂鸣器、发光二极管驱动引脚图
3.系统软件设计
3.1 程序结构分析
主程序调用了3个子程序,分别是LCD1602液晶显示程序、温度信号处理程序、按键设定报警温度程序。温度信号处理程序:对温度芯片送过来的数据进行处理,进行判断和显示。LCD1602液晶显示程序:向LCD1602液晶的显示送数,控制系统的显示部分。按键设定程序:可以设定低温和高温报警可精确到0.1度。
3.2 系统程序流图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的当前温度值,与设定的报警温度比较,其程序流程见图11所示。
通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中,然后通过调用显示子程序显示出来。
调用显示子程序
初始化
1s到?
初次上电
发温度转换开始命令
读出温度值
温度计算处理
显示数据刷新
图11 DS18B20温度流程图
3.3 DS18B20初始化程序流程图
在DS18B20工作之前需要进行初始化,流程图如下:
发复位命令
发跳过ROM命令
初始化成功
结束
图11 初始化程序流程图
3.4 读温度子程序流程图
读温度子程序的主要功能是从DS18B20中读出温度数据,移入温度暂存器保存。其程序流程图如下:
发复位命令
发跳过ROM命令
发读取温度命令
移入温度暂存器
结束
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include <intrins.h>
#include "eeprom52.h"
sbit dq = P1^5; //18b20 IO口的定义
sbit beep = P1^4; //蜂鸣器IO口定义
uint temperature ; //
bit flag_300ms ;
bit flag_lj_en; //按键连加使能
bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了
uchar key_time,key_value; //用做连加的中间变量
bit key_500ms ;
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P1^2; //片选信号 下降沿触发
uchar menu_1; //菜单设计的变量
uint t_high = 300,t_low = 100;
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/******************把数据保存到单片机内部eepom中******************/
void write_eeprom() //保存数据
{
SectorErase(0x2000);
byte_write(0x2000, t_high % 256);
byte_write(0x2001, t_high / 256);
byte_write(0x2002, t_low % 256);
byte_write(0x2003, t_low / 256);
byte_write(0x2055, a_a);
}
/******************把数据从单片机内部eepom中读出来*****************/
void read_eeprom() //读出保存数据
{
t_high = byte_read(0x2001);
t_high <<= 8;
t_high |= byte_read(0x2000);
t_low = byte_read(0x2003);
t_low <<= 8;
t_low |= byte_read(0x2002);
a_a = byte_read(0x2055);
}
///**************开机自检eeprom初始化*****************/
void init_eeprom() ////开始初始化保存的数据
{
read_eeprom(); //读出保存数据
if(a_a != 1) //新的单片机初始单片机内问EEPROM
{
t_high = 300;
t_low = 100;
a_a = 1;
write_eeprom(); //保存数据
}
}
/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
while(q--);
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(25);
e=1;
delay_uint(100);
e=0;
}
/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(25);
e=1;
delay_uint(100);
e=0;
}
/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/***********************lcd1602上显示特定的字符************************/
void write_zifu(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(date);
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm3_18B20(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data('.');
write_data(0x30+date%10);
}
/***********************lcd1602初始化设置************************/
void init_1602()
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0," temp: . ");
write_string(2,0,"H: . L: . ");
write_zifu(1,12,0xdf); //显示度
write_zifu(2,6, 0xdf); //显示度
write_zifu(2,14,0xdf); //显示度
}
/***********************18b20初始化函数*****************************/
void init_18b20()
{
bit q;
dq = 1; //把总线拿高
delay_uint(1); //15us
dq = 0; //给复位脉冲
delay_uint(80); //750us
dq = 1; //把总线拿高 等待
delay_uint(10); //110us
q = dq; //读取18b20初始化信号
delay_uint(20); //200us
dq = 1; //把总线拿高 释放总线
}
/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //写数据是低位开始
dq = 0; //把总线拿低写时间隙开始
dq = dat & 0x01; //向18b20总线写数据了
delay_uint(5); // 60us
dq = 1; //释放总线
dat >>= 1;
}
}
/*************读取18b20内的数据***************/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0; //把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
dq = 1; //释放总线
if(dq == 1) //开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
}
return value; //返回数据
}
/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
uint value;
uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0x44); //启动一次温度转换命令
delay_uint(50); //500us
init_18b20(); //初始化18b20
EA = 0;
write_18b20(0xcc); //跳过64位ROM
write_18b20(0xbe); //发出读取暂存器命令
EA = 1;
low = read_18b20(); //读温度低字节
value = read_18b20(); //读温度高字节
value <<= 8; //把温度的高位左移8位
value |= low; //把读出的温度低位放到value的低八位中
value *= 0.625; //转换到温度值 小数
return value; //返回读出的温度 带小数
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P3 |= 0xf0;
if(key_500ms == 1) //连加
{
key_500ms = 0;
key_new = 1;
}
if((P3 & 0xf0) != 0xf0) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P3 & 0xf0)
{
case 0xd0: key_can = 3; break; //得到k1键值
case 0xb0: key_can = 2; break; //得到K2键值
case 0x70: key_can = 1; break; //得到k3键值
}
flag_lj_en = 1; //连加使能
}
}
else
{
if(key_new == 0)
{
key_new = 1;
write_eeprom(); //保存数据
flag_lj_en = 0; //关闭连加使能
flag_lj_3_en = 0; //关闭3秒后使能
key_value = 0; //清零
key_time = 0;
}
}
}
/****************按键显示函数***************/
void key_with()
{
if(key_can == 1) //设置键
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0;
}
if(menu_1 == 0)
{
write_com(0x0c); //关闭光标
}
}
if(menu_1 == 1) //设置高温报警
{
if(key_can == 2)
{
if(flag_lj_3_en == 0)
t_high ++ ; //按键按下未松开自动加三次
else
t_high += 10; //按键按下未松开自动加三次之后每次自动加10
if(t_high > 990)
t_high = 990;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_high -- ; //按键按下未松开自动减三次
else
t_high -= 10; //按键按下未松开自动减三次之后每次自动减10
if(t_high <= t_low)
t_high = t_low + 1;
} write_sfm3_18B20(2,2,t_high);
write_com(0x80+0x40+2); //将光标移动到秒个位
write_com(0x0f); //显示光标并且闪烁
write_eeprom(); //保存数据
}
if(menu_1 == 2) //设置低温报警
{
if(key_can == 2)
{
if(flag_lj_3_en == 0)
t_low ++ ; //按键按下未松开自动加三次
else
t_low += 10; //按键按下未松开自动加三次之后每次自动加10
if(t_low >= t_high)
t_low = t_high - 1;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_low -- ; //按键按下未松开自动减三次
else
t_low -= 10; //按键按下未松开自动加三次之后每次自动加10
if(t_low <= 10)
t_low = 10;
}
write_sfm3_18B20(2,10,t_low);
write_com(0x80+0x40+10); //将光标移动到秒个位
write_com(0x0f); //显示光标并且闪烁
write_eeprom(); //保存数据
}
}
/********************菜单对应的处理函数***********************/
void menu_dispaly()
{
if((menu_1 == 1)) //对光标不处理,要不然光标不会显示在正确的位置
{
write_com(0x80+0x42); //将光标移动到
write_com(0x0f); //显示光标并且闪烁
}else if((menu_1 == 2))
{
write_com(0x80+0x4a); //将光标移动到
write_com(0x0f); //显示光标并且闪烁
}
}
/****************报警函数***************/
void clock_h_l()
{
static uchar value;
if((temperature <= t_low) || (temperature >= t_high))
{
value ++; //消除实际距离在设定距离左右变化时的干扰
if(value >= 2)
{
beep = ~beep; //蜂鸣器报警
}
}
else
{
beep = 1;
}
}
/****************主函数***************/
void main()
{
beep = 0; //开机叫一声
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff;
init_1602(); //1602初始化
temperature = read_temp(); //先读出温度的值
time_init(); //初始化定时器
init_eeprom(); //开机自检eeprom初始化
write_sfm3_18B20(2,2,t_high);
write_sfm3_18B20(2,10,t_low);
delay_1ms(650);
temperature = read_temp(); //先读出温度的值
write_sfm3_18B20(1,8,temperature);
while(1)
{
if(flag_300ms == 1) //300ms 处理一次温度程序
{
flag_300ms = 0;
temperature = read_temp(); //先读出温度的值
clock_h_l(); //报警函数
write_sfm3_18B20(1,8,temperature);
menu_dispaly(); //不同级的菜单对应显示1602对应显示不同
}
key(); //按键程序
if(key_can < 10)
{
key_with(); //设置报警温度
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
展开阅读全文