资源描述
南 昌 大 学
学士学位论文原创性申明
本人郑重申明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果。对本文的研究作出重要贡献的个人和集体,均已在文中以明确方式表明。本人完全意识到本申明的法律后果由本人承担。
作者签名: 日期:
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权南昌大学可以将本论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保密□,在 年解密后适用本授权书。
本学位论文属于
不保密□。
(请在以上相应方框内打“√”)
作者签名: 日期:
导师签名: 日期:
In recent years, with the penetration of computers in the social sphere, the application of SCM is constantly deepening, driven by traditional control detection of the rapidly growing . In the real-time detection and automatic control microcomputer application system, the microcontroller is ofteIn recent years, with the penetration of computers in the social sphere, the application of SCM is constantly deepening, driven by traditional control detection of the rapidly growing updates. In the real-time detection and automatic control microcomputer application system, the microcontroller is often as a core component, microcontroller knowledge alone is not enough, IT should be based on the specific hardware architecture, and application-specific software features object combine to make system perfect.
In this paper,control of the temperature is achieve by 51MCU . Its main part contains of: STC89C52 microcontroller, temperature sensor, the keyboard and display circuit, temperature control circuit. It can be real-time display and set the temperature and speed of the motor, automatic temperature control.
Firstly, temperature sensor measuring the temperature in the water tank and the temperature information is converted into an analog voltage signal, the voltage signal is amplified to the MCU which can handle within the scope; then low pass filtering to filter out the interference signal is fed to the micro-controller; finally, micro-controller will detect temperature information and the LCD1602 display temperature values and then compared with the set value. If they do not match, The micro-controller to control the servo motor to the steering and speed to open the cold water valve or the hot water valve, thereby enabling the temperature to keep the temperature in required range .
In specific design process, C language is used for software programming, and then download the program into SCM STC89C51 ,various components driven by the development board thermostatically controle as a core component.
; 附录一 软件设计序 33控制器系统的核心部件是89C52单片机,它作为“大脑”控制其他硬件的运行, 首先温度传感器测量水箱内的温度采集,并存入单片机,最后单片机将检测到的温度信息用十进制数码显示温度值并与设定值进行比较,若温度超过所设定的温度,则单片机控制电机的转向,转向的角度大小为温度差的差值,开大热水阀门,关小冷水阀门,反之同理,进而使温度控制在要求的温度范围。
4. 报警信号的应用 :DS18B20 每次执行完温度转换后,温度值将与储存在TH和TL内的报警触发值比较,若测量的结果值大于TH的值或小于TL的值,则会置位内部的报警标志位,在连接多DS18B20的应用系统中,主机发出报警搜索命令(ECh)时,含有置位报警标志位的DS18B20会响应总线主机,发回标志位,其他无置位报警标志位的DS18B20则保持沉默,这样有便于主机立即识别DS18B20并读出数据。16位的温度寄存器与8位TH或TL寄存器内容进行比较时,将忽略温度寄存器高字节,而TH或TL得最高位对应温度数据的符号位。
主机发送复位脉冲 主 机 接 收 480us
480<t<960us 等待
15-60us
60-240us
图3-3-1 初始化时序图
写时序:写时序是主机力高数据线后,使数据线从逻辑高电平跳变为逻辑低电平再释放的过程,有写“1”时序和写“0”时序两种,所有写时序操作持续时间至少需要60us且两个写时序周期的间隔时间必须大于1us,如图所示
主机写时序“0” 主机写时序“1”
60us >1us
15us DS18B20采样 45us 15us DS18B20采样 45us
图3-3-2 写时序图
DS18B20在DQ数据线变低后15-60us之间采样数据线,DQ数据线为高电平既是数据“1”,DQ数据线为低电平既是数据“0:”。
主机发送写“1”时序拉低数据线至少1us,再拉高数据线,也也已在15us后拉高数据线然后释放;发送写“0”时序拉低数据线后一直保持低电平60us 在释放。
读时序:读时序是主机使数据线从逻辑高电平大地为逻辑低电平,持续至少1us后释放数据线,再接收从DS18B20传来的数据位的过陈塘关,读时序的持续时间必须大于60us,且两个读时序操作的回复时间间隔必须大于1us,如图所示。
主机读0时序 1us 主机读1时序
》1us
15us 主机采样 45us 15us 主机采样 45us
图3-3-3 读时序图
DS18B20在读时序数据线下降沿之后15us开始输出有效数据,,此时主机必须释放数据线(转为输入状态)。读时序技术后数据线由外部上拉电阻拉回至高电平图3-3-4 DS18B20在单片机中的电路图,本课题中DS18B20接P3^7口
延时 15ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
(以后每次写指令,读/写数据操作之前均需检测忙信号)
写指令38H:显示模式设置
写指令08H:显示关闭
写指令:01H:显示清屏
写指令06H:显示光标移动位置
写指令0CH:显示开及光标设置
步进电机就是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步距角)。可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时也可以通过控制脉冲的频率来控制电机转动的速度以及加速度,从而达到调速的目的。本课题使用常用的步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,电机可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。)双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
主要参数如下图:
表3-5-1 电机的主要参数
电机型号
电压
相
数
相电阻ΚΩ
步距角
减速比
起动转矩
起动频率
定位转矩
噪声dB
28BYJ48
5
4
300
5.628/64
64
>=300
>=550
>=300
<=35
因为单片机接口信号不够大故需要通过两个ULN2003电流放大器再连接到相应的电机接口,如下:
图3-5-1 ULN2003连接步进电机
红线接电源5V,橙色电线接P1.3口,黄色电线接P1.2口,粉色电线接P1.1口,蓝色接P1.0口。
表3-5-2 各端口的电平运行表
导线颜色
1
2
3
4
5
7
5红
+
+
+
+
+
+
4橙
-
-
3黄
-
-
-
2粉
-
-
-
1蓝
-
橙
黄
粉
蓝
十六制(P1口)
1
0
0
0
0x08
1
1
0
0
0x0c
0
1
0
0
0x04
0
1
1
0
0x06
0
0
1
0
0x02
0
0
1
1
0x03
0
0
0
1
0x01
1
0
0
1
0x09
本课题中需要用到两个步进电机,故需要两个ULN2003驱动,但由于两个步进电机一起工作时,整体电压明显下降,导致LCD1602显示器应电压不够而显示不清,故采用两个电机轮流工作。
定义旋转相序
uchar code step5[]={0x89,0xc1,0x43,0x62,0x26,0x34,0x1c,0x98}; //同时驱动两个电机,一个正转,一个反转
uchar code step1[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时钟旋转相序表
uchar code step2[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时钟旋转相序表
单片机的外部中断有两种触发方式可选电平触发和边沿触发,本课题因按键电路较简单,选择电瓶触发方式。
使用INT0和INT1中断分别来设置初始温度的高低,P34定义为关闭阀门,P35定义为开启阀门。电路图如下图:
DS18B20DATASHEET, and 郭国法. "MCS-51 单片机温度控制系统的设计."[M] 微计算机信息 21.7 (2005): 68-69.屠乃威, 付华, and 阎馨. "参数自适应模糊 PID 控制器在温度控制系统中的应用."[M]微计算机信息 20.6 (2004): 20-21.
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define motorstep P1 //定义P1口为步进电机驱动端口
sbit DQ=P3^7; //定义温度传感器信号线端口
sbit LCD_E=P0^5; //定义液晶使能端端口
sbit LCD_RS=P0^7; //定义LCD数据/命令选择端口
sbit BF=P2^7 ; //忙检测定义
sbit LCD_RW=P0^6; //定义LCD读写选择端口
sbit OFF=P3^4; //定义关闭阀门端口
sbit ON=P3^5; //定义开启阀门端口
uchar table_begin=0; //定义table无符号字符型
uint M=1,N=1,X2=2,X,X1=2,Pluse,TN,TD,k,M1,M2,M3,M4; //定义温度,转角值,温度差值,脉冲数为无符号整数
uint SET1=25;// 01234567890123456 // SET1为设定温度
uchar table1[]="SET: N1: "; // 定义LCD显示第一行
uchar table2[]="CUR: N2: "; // 定义LCD显示第二行
uchar table3[]="SYSTEM IS AWAIT "; //定义开机欢迎文字
uchar table4[]="PRESS ON TO START" ;
uchar table5[]=" THE TEMPERATURE "; //定义温度到达常温文字
uchar table6[]=" IS NOW CONSTANT " ;
uchar table7[]=" SYSTEM IS OFF "; //定义关机文字
uchar table8[]=" PLEASE WAIT... " ;
uchar table9[]=" SYSTEM TURNING "; //定义关机文字
uchar table10[]="ON PLEASE WAIT..." ;
uchar code table[]="0123456789"; // 定义数组
uchar code step1[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//逆时针旋转相序表
uchar code step2[]={0x90,0x10,0x30,0x20,0x60,0x40,0xc0,0x80}; //顺时针
uchar code step3[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//顺时针旋转相序表
uchar code step4[]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}; //逆时针
uchar code step5[]={0x89,0xc1,0x43,0x62,0x26,0x34,0x1c,0x98}; //同时驱动两个电机,一个正转,一个反转
//uchar code step6[]={0x98,0x1c,0x34,0x26,0x62,0x43,0xc1,0x89}; //与上面的电机转动方向相反
/***********************************************
延时(ms)函数
************************************************/
void Delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--) //延时一微妙
for(y=110;y>0;y--);
}
/*****电机初始转角**********/
void Motor_init(uint f) //电机1逆时针转
{
uint i,j;
for(i=0;i<f;i++)
{
for(j=0;j<8;j++)
{
P1=step5[j]; //取值赋给P1驱动口
Delayms(3);
}
}
}
/***********************************************
升温电机程序
************************************************/
void Temp_UP1(uint M) //电机1顺时针转 ,电机向上摆
{
uint i,j;
for(i=0;i<M;i++)
{
for(j=0;j<8;j++)
{
P1=step1[j]; //取值赋给P1驱动口
Delayms(5);
}
}
}
void Temp_UP2(uint M)
{ //电机2逆时针转
uint i,j;
for(i=0;i<M;i++)
{
for(j=0;j<8;j++)
{
P1=step2[j]; //取值赋给P1驱动口
Delayms(5);
}
}
}
/***********************************************
降温电机程序
***********************************************/
void Temp_DOWN1(uint N)
{ //电机1逆时针转
uint i,j;
for(i=0;i<N;i++)
{
for(j=0;j<8;j++)
{
P1=step3[j]; //取值赋给P1驱动口
Delayms(5);
}
}
}
void Temp_DOWN2(uint N)
{ //电机2顺时针转
uint i,j;
for(i=0;i<N;i++)
{
for(j=0;j<8;j++)
{
P1=step4[j]; //取值赋给P1驱动口
Delayms(5);
}
}
}
/***********************************************
LCD1602显示功能
************************************************/
/*****************************************************
判断液晶模块的忙碌状态
返回值:result,result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
LCD_RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
LCD_RW=1;
LCD_E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
LCD_E=0; //将E恢复低电平
return result;
}
void write_com(uchar com) //写指令函数
{
while(BusyTest()==1); //如果忙就等待
LCD_RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
LCD_RW=0;
LCD_E=0; //将E置低电平
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P2=com; //将数据送入P2口,即写入指令或地址
LCD_E=1; //E置高电平
Delayms(5); //延时,给硬件反应时间
LCD_E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void write_data(uchar date) //写数据函数
{
while(BusyTest()==1); //如果忙就等待
LCD_RS=1; //RS为高电平,RW为低电平时,可以写入数据
LCD_RW=0;
Delayms(5); //延时,给硬件反应时间
P2=date; //将数据送入P0口,即将数据写入液晶模块
Delayms(5); //延时,给硬件反应时间
LCD_E=1; //E置高电平
Delayms(5); //延时,给硬件反应时间
LCD_E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/********LCD显示位置设置*********/
/******显示关机字符*****/
void LCD_OFF(uchar num1,uchar num2) //num1表示液晶第一行有几个数显示,num2表示液晶第二行有几个数显示
{
uchar i,j;
write_com(0x80); //写入LCD第一行第一列的地址0x80
for(i=0;i<num1;i++) //LCD第一行显示
{
write_data(table7[i]);
Delayms(5);
}
write_com(0x80+0x40); //写入LCD第二行第一列的地址0x80
for(j=0;j<num2;j++) //LCD第二行显示
{
write_data(table8[j]);
Delayms(1);
}
}
/******显示温度恒定字符*****/
void LCD_Done(uchar num1,uchar num2) //num1表示液晶第一行有几个数显示,num2表示液晶第二行有几个数显示
{
uchar i,j;
write_com(0x80); //写入LCD第一行第一列的地址0x80
for(i=0;i<num1;i++) //LCD第一行显示
{
write_data(table5[i]);
Delayms(5);
}
write_com(0x80+0x40); //写入LCD第二行第一列的地址0x80
for(j=0;j<num2;j++) //LCD第二行显示
{
write_data(table6[j]);
Delayms(1);
}
}
/******显示系统等待字符*****/
void LCD_ON(uchar num1,uchar num2) //num1表示液晶第一行有几个数显示,num2表示液晶第二行有几个数显示
{
uchar i,j;
write_com(0x80); //写入LCD第一行第一列的地址0x80
for(i=0;i<num1;i++) //LCD第一行显示
{
write_data(table9[i]);
Delayms(5);
}
write_com(0x80+0x40); //写入LCD第二行第一列的地址0x80
for(j=0;j<num2;j++) //LCD第二行显示
{
write_data(table10[j]);
Delayms(1);
}
}
/******显示系统等待字符*****/
void LCD_Await(uchar num1,uchar num2) //num1表示液晶第一行有几个数显示,num2表示液晶第二行有几个数显示
{
uchar i,j;
write_com(0x80); //写入LCD第一行第一列的地址0x80
for(i=0;i<num1;i++) //LCD第一行显示
{
write_data(table3[i]);
Delayms(5);
}
write_com(0x80+0x40); //写入LCD第二行第一列的地址0x80
for(j=0;j<num2;j++) //LCD第二行显示
{
write_data(table4[j]);
Delayms(1);
}
}
/****显示温度转角******/
void LCD(uchar num1,uchar num2) //num1表示液晶第一行有几个数显示,num2表示液晶第二行有几个数显示
{
uchar i,j;
write_com(0x80); //写入LCD第一行第一列的地址0x80
for(i=0;i<num1;i++) //LCD第一行显示
{
write_data(table1[i]);
Delayms(5);
}
write_com(0x80+0x40); //写入LCD第二行第一列的地址0x80
for(j=0;j<num2;j++) //LCD第二行显示
{
write_data(table2[j]);
Delayms(1);
}
}
/**********按键中断程序****************/
void int0_interrupt(void) interrupt 0 //外部中断INT0
{
Delayms(50);
if(INT0==0) //若INT0为低电平,则设置温度上升一度
SET1++ ;
}
void int1_interrupt(void) interrupt 2 //外部中断INT1
{
Delayms(50);
if(INT1==0) //若INT1为低电平,则设置温度下降一度
SET1-- ;
}
/*********系统初始化******************/
void init()
{
IE=0x85; //外部中断允许
TCON=0x05; //定时器/计数器控制寄存器外部中断1和0为下降沿触发方式
OFF=1;
ON=1;
Delayms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间 /*****LCD初始化*****/
write_com(0x38); //显示模式设置16*2显示,5*7点阵,8位数据借口
Delayms(5); //延时5ms ,给硬件一点反应时间
write_com(0x38); //显示模式设置16*2显示,5*7点阵,8位数据借口
Delayms(5); //延时5ms ,给硬件一点反应时间
write_com(0x38); //显示模式设置16*2显示,5*7点阵,8位数据借口
Delayms(5); //连续三次,确保初始化成功
write_com(0x0c); //设置开显示,不显示光标
Delayms(5); //延时5ms ,给硬件一点反应时间
write_com(0x06); //写一个字符后地址指针加1
Delayms(5); //延时5ms ,给硬件一点反应时间
write_com(0x01); //显示清0,数据指针清0
Delayms(50); //延时0.05s开始测温度
}
/*****************************************************
DS18B20传感器初始化
出口参数:flag
***************************************************/
bit Init_DS18B20(void)
{
uchar i;
bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ = 1; //先将数据线拉高
for(i=0;i<2;i++); //略微延时约6微秒
DQ = 0; //再将数据线从高拉低,要求保持480~960us 以向DS18B20发出一持续480~960us的低电平复位脉冲
for(i=0;i<200;i++); //略微延时约600微秒
DQ = 1; //释放数据线(将数据线拉高)
for(i=0;i<10;i++); //延时约30us(释放总线后需等待15~60us让D
展开阅读全文