单片机-简易温度控制设计.doc_第1页
单片机-简易温度控制设计.doc_第2页
单片机-简易温度控制设计.doc_第3页
单片机-简易温度控制设计.doc_第4页
单片机-简易温度控制设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

常州大学硬件实习报告 目录1前言21.1概述21.2课题分析21.3设计思路22.硬件电路设计描述32.1系统的基本组成32.2系统框图如下:32.3温度控制模块原理图:32.4系统原理图:43.软件设计流程54.程序代码64.1延迟函数代码64.2 LCD显示模块74.3 A/D转换模块114.4 报警模块164.5 温度转换模块164.6 主程序175.实习感想216.参考文献21单片机硬件实习任务书一、设计题目简易温度控制器设计二、设计内容及目标利用实验仪,设计一个简易温度控制器,具体任务包括:具有低温上电和高温断电功能;利用按键进行温度上限和温度下限设置,并且实时显示温度到LED数码管;声音报警。温度检测采用热敏电阻。热敏电阻是利用半导体的电阻值随温度显著变化设计而成的,它具有温度系数大、灵敏度高、体积小、结构简单、响应速度快、使用方便、寿命长等优点,应用非常广泛。采用普通的热敏电阻,需要A/D 转换器。三、进度安排周次工 作 内 容2.21-2.22题目安排,图书馆查相关资料2.23-2.26硬件设计,设计原理图和PCB图,搭建硬件电路, 2.27软件总体设计2.28-3.2软件开发,并开始准备实习报告初稿3.3整体调试 3.4在实习现场进行结果演示,答辩四、设计时间:2011 年 02 月 21 日到 2011 年 03 月 4 日 通信工程 系 指导教师: 万军 _1前言 1.1概述现代信息技术的三大基础是信息采集控制(即温控器技术)、信息传输(通信技术)和信息处理(计算机技术)。温控器属于信息技术的前沿尖端产品,尤其是温控器被广泛用于工农业生产、科学研究和生活等领域,数量日渐上升。近百年来,温控器的发展大致经历了以下二个阶段; (1)模拟、集成温度控制器;(2)智能数码温控器。目前,国际上新型温控器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。 在20世纪90年代中期最早推出的智能温控器,采用的是8位A/D转换器,其测温精度较低,分辨力只能达到2。目前,国外已相继推出多种高精度、高分辨力的智能温度传感器,所用的是912位A/D转换器,分辨力一般可达0.50.0625。为了提高多通道智能温控器的转换速率,也有的芯片采用高速逐次逼近式A/D转换器。 本设计的温度控制器是以单片机为核心的。单片微型计算机称为单片机,它在一片芯片上集成了中央处理器、存储器、定时器/计数器和各种输入输出设备等接口部件。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。 1.2课题分析 单片机控制系统由微机和工农业生产对象两部分组成,其中包括硬件电路和软件程序,整个控制系统是通过接口将计算机和生产过程中产生的温度联系起来实现计算机对生产过程中的数据处理和控制。本文介绍了MCS51单片机对温度控制系统硬件接口和软件设计的基本思想。包括单片机系统的程序设计、输入输出接口设计、温度控制电路的设计及键盘显示电路的设计。 1.3设计思路 此外整个控制系统可分为硬件电路设计和软件程序设计两大部分。可分别对它们进行分析设计。当确定好自己的方案后,就分模块进行软件和硬件的设计与调试。当个模块都调试完毕后,最后将所有模块组合在一起进行总调,直到达到理想的效果为止。2.硬件电路设计描述 2.1系统的基本组成 本系统是由核心处理器模块、温度采集模块、A/D转换模块、及控制执行模块等组成。采用用80C51单片机作为控制核心,1206LCD显示,PCF8951作为模数转换器,四个独立按键,以及温度控制模块。2.2系统框图如下:Lcd显示温度及最高、低温度按键输入设置单片机89c51温度控制加热降温保温模块高温报警模块PCF89512.3温度控制模块原理图:2.4系统原理图:3.软件设计流程主程序流程图如下:调整最高最低温度初始化4.程序代码4.1延迟函数代码/*delay.h*/#ifndef _DELAY_H_#define _DELAY_H_void DelayUs2x(unsigned char t);void DelayMs(unsigned char t);#endif/*delay.c*/#include delay.hvoid DelayUs2x(unsigned char t) while(-t);void DelayMs(unsigned char t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); 4.2 LCD显示模块 /*- LCD1602.h 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK-*/#include /包含头文件#include#ifndef _1602_H_#define _1602_H_ bit LCD_Check_Busy(void) ; void LCD_Write_Com(unsigned char com) ; void LCD_Write_Data(unsigned char Data) ; void LCD_Clear(void) ; void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; void LCD_Init(void) ; void Lcd_User_Chr(void); #endif/*-LCD1602显示模块子程序-*/#include 1602.h#include delay.h#define CHECK_BUSYsbit RS = P24; /定义端口 sbit RW = P25;sbit EN = P26;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*- 判忙函数-*/ bit LCD_Check_Busy(void) #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80);#else return 0;#endif /*- 写入命令函数- -*/ void LCD_Write_Com(unsigned char com) while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数-*/ void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数-*/ void LCD_Init(void) LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ /*- 设定二个自定义字符,LCD1602中自定义字符的地址为0x00-0x07,即可定义8个字符这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)-*/void Lcd_User_Chr(void) /第一个自定义字符 LCD_Write_Com(0x40); /01 000 000 第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0-7),D2D1D0为字符行地址(0-7)) LCD_Write_Data(0x00); /XXX 11111 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) LCD_Write_Com(0x41); /01 000 001 第2行地址 LCD_Write_Data(0x04); /XXX 10001 第2行数据 LCD_Write_Com(0x42); /01 000 010 第3行地址 LCD_Write_Data(0x0e); /XXX 10101 第3行数据 LCD_Write_Com(0x43); /01 000 011 第4行地址 LCD_Write_Data(0x0e); /XXX 10001 第4行数据 LCD_Write_Com(0x44); /01 000 100 第5行地址 LCD_Write_Data(0x0e); /XXX 11111 第5行数据 LCD_Write_Com(0x45); /01 000 101 第6行地址 LCD_Write_Data(0x1f); /XXX 01010 第6行数据 LCD_Write_Com(0x46); /01 000 110 第7行地址 LCD_Write_Data(0x04); /XXX 11111 第7行数据 LCD_Write_Com(0x47); /01 000 111 第8行地址 LCD_Write_Data(0x00); /XXX 00000 第8行数据 /第二个自定义字符 LCD_Write_Com(0x48); /01 001 000 第1行地址 LCD_Write_Data(0x03); /XXX 00001 第1行数据 LCD_Write_Com(0x49); /01 001 001 第2行地址 LCD_Write_Data(0x03); /XXX 11011 第2行数据 LCD_Write_Com(0x4a); /01 001 010 第3行地址 LCD_Write_Data(0x00); /XXX 11101 第3行数据 LCD_Write_Com(0x4b); /01 001 011 第4行地址 LCD_Write_Data(0x00); /XXX 11001 第4行数据 LCD_Write_Com(0x4c); /01 001 100 第5行地址 LCD_Write_Data(0x00); /XXX 11101 第5行数据 LCD_Write_Com(0x4d); /01 001 101 第6行地址 LCD_Write_Data(0x00); /XXX 11011 第6行数据 LCD_Write_Com(0x4e); /01 001 110 第7行地址 LCD_Write_Data(0x00); /XXX 00001 第7行数据 LCD_Write_Com(0x4f); /01 001 111 第8行地址 LCD_Write_Data(0x00); /XXX 00000 第8行数据 4.3 A/D转换模块/*- IIC协议 头文件-*/ #ifndef _I2C_H_#define _I2C_H_ #include /头文件的包含#include #define _Nop() _nop_() /定义空指令/*- 启动总线-*/void Start_I2c();/*- 结束总线-*/void Stop_I2c();/*- 字节数据传送函数 -*/void SendByte(unsigned char c);/*- 字节数据传送函数 -*/unsigned char RcvByte();/*- 应答子函数-*/void Ack_I2c(void);/*- 非应答子函数-*/void NoAck_I2c(void);/*- 向无子地址器件发送字节数据函数 -*/bit ISendByte(unsigned char sla,unsigned char c);/*- 向有子地址器件发送多字节数据函数 -*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);/*- 向无子地址器件读字节数据函数 -*/bit IRcvByte(unsigned char sla,unsigned char *c);/*- 向有子地址器件读取多字节数据函数 -*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);#endif/*-AD模块子程序-*/ #include i2c.h#include delay.h#define _Nop() _nop_() /定义空指令 bit ack; /应答标志位sbit SDA=P21;sbit SCL=P20;/*- 启动总线-*/void Start_I2c() SDA=1; /发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();/*- 结束总线-*/void Stop_I2c() SDA=0; /发送结束条件的数据信号 _Nop(); /发送结束条件的时钟信号 SCL=1; /结束条件建立时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop();/*- 字节数据传送函数 -*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /要传送的数据长度为8位 if(cBitCnt)&0x80)SDA=1; /判断发送位 else SDA=0; _Nop(); SCL=1; /置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop(); /保证时钟高电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /判断是否接收到应答信号 SCL=0; _Nop(); _Nop();/*- 字节数据传送函数 -*/unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /置数据线为输入方式 for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /置时钟线为低,准备接收数据位 _Nop(); _Nop(); /时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1; /置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /读数据位,接收的数据位放入retc中 _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);/*- 非应答子函数-*/void NoAck_I2c(void) SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); 4.4 报警模块#include /包含头文件sbit SPK=P23; /定义喇叭端口void DelayUs2xo(unsigned char t) while(-t);void DelayMso(unsigned char t) while(t-) /大致延时1mS DelayUs2xo(245); DelayUs2xo(245); /*- 喇叭程序函数-*/laba() DelayMso(1); /发出大约500Hz的方波 频率越大声音越尖 SPK=!SPK;4.5 温度转换模块#include /包含头文件sbit SPK=P23; /定义喇叭端口void DelayUs2xo(unsigned char t) while(-t);void DelayMso(unsigned char t) while(t-) /大致延时1mS DelayUs2xo(245); DelayUs2xo(245); /*- 喇叭程序函数-*/laba() DelayMso(1); /发出大约500Hz的方波 频率越大声音越尖 SPK=!SPK;4.6 主程序/*- 简易温度控制器设计-*/#include /包含头文件#include/#include 18b20.h#include 1602.h#include delay.h#include laba.h#include wendu.h#include i2c.h#define KeyPort P1 /定义按键端口sbit LED =P22;/LED端口sbit hot =P27;/加热模块端口bit ReadTempFlag;/定义读时间标志void Init_Timer0(void);/定时器初始化unsigned char KeyScan(void);/键盘扫描/*- 串口通讯初始化-*/void UART_Init(void) SCON = 0x50; / SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; / TH1: 重装值 9600 波特率 晶振 11.0592MHz TR1 = 1; / TR1: timer 1 打开 /EA = 1; /打开总中断 /ES = 1; /打开串口中断TI=1;/*- 主函数-*/void main (void) int tempH=60,tempL=50;float temp,temperature;unsigned char TempFlag=0;char displaytemp16,num;/定义显示区域临时存储数组LCD_Init(); /初始化液晶DelayMs(20); /延时有助于稳定LCD_Clear(); /清屏Init_Timer0();UART_Init();Lcd_User_Chr(); /写入自定义字符while (1) /主循环 num=KeyScan(); switch(num) case 1:if(tempH-55)tempH-;break;case 3:if(tempL-55)tempL-;break;default:break; sprintf(displaytemp,H.%3d L.%3d ,tempH,tempL); LCD_Write_String(0,1,displaytemp);/显示第二行if(ReadTempFlag=1) ReadTempFlag=0; temp=wendu(); temperature=temp*1.00000;if(temptempH) TempFlag=1; /高于高温标志 else if(temptempL) TempFlag=2; /低于低温标志 else TempFlag=0; /正常显示标志 sprintf(displaytemp,Temp %6.0f ,temperature);/打印温度值 LCD_Write_String(0,0,displaytemp);/显示第一行 LCD_Write_Char(13,0,0x01);/写入温度右上角点 LCD_Write_Char(14,0,C); /写入字符C LED=1; /hot=1;switch(TempFlag) case 1:laba();break;case 2:LED=0;break;default:break; /*- 定时器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论