单片机数字温度计汇编程序
- 格式:doc
- 大小:21.50 KB
- 文档页数:9
数字温度计(程序设计部分)摘要:本设计完成了一种基于DS18B20的高精度的数字温度计。
我们设计温度系统是由中央控制器AT89S51、DS18B20温度传感器、LED数码管组成。
温度传感器DS18B20高精度的数字温度信号送给单片机AT89S51处理后,实现将温度数据送LED显示,实现了高精度的数字温度显示。
关键词:温度计数字控制 DS18B20 AT89S51一系统方案设计1.1 方案设计由于本设计是测温电路,可以使用热敏电阻之类的器件将温度转换为电学量,便于电路处理。
而具体的处理方案和电路较多,一般来说,有下面两种情况。
方案一:利用热敏元件的感温效应,流过这类元件的电压或电流的随被测温度变化而变化,将这种变化的电压或电流采集过来,通过一系列的电路处理后,再进行A/D转换,就可以用单片机进行数据的处理并送显示电路,就可以将被测温度显示出来。
这种方案需要用到A/D转换电路,缺点是感温电路后的信号处理比较复杂和不易克服干扰,其优点是通过细致的电路处理后,能达到较高的精度。
方案二:采用集成的温度传感器,在这类器件中,已经集成了热敏器件、信号调理电路、AD 转换电路,输出的数据也是处理后的已经编码的数字量。
因而其外部电路简单,但其内部电路固定,所以其精度有限。
在单片机电路设计中,大多都是使用这类集成温度传感器,可以很容易直接读取被测温度对应的数据,进行适当的运算和处理,就可以满足设计要求。
1.2方案选择从以上两种方案,很容易看出其优缺点,本设计中的设计指标不是很高,为了可靠和降低成本,系统采用方案二进行设计,选择使用一只温度传感器DS18B20作为系统的核心器件。
同时,为了能够可靠的工作,能够使电路比较简单,软件设计也比较简单,故采用了AT89S52作为系统的控制芯片。
1.3 系统功能和模块的描述1.3.1 系统功能本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。
附件1:学号:0121218700312课程设计题目数字式温度计学院物流工程学院专业物流工程班级姓名指导教师2015年1月18日附件2:课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 数字式温度计设计初始条件:1、设计与仿真软件:Keil uVision 和Proteus要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.18B20 设计一款能够显示当前温度值的温度计;2. 切换按钮可以切换华氏度和摄氏度显示;3.其他功能时间安排:2015年1月4 - 5日选择题目,布置任务2015年1月6 - 8日功能分析,硬件设计及修改2015年1月9 -13日软件设计与编程2015年1月14-18日调试并修改硬件组成2015年1月19-20日编写任务说明书2015年1月21-22日确认提交版、答辩指导教师签名:年月日系主任(或责任教师)签名:年月日附件6:本科生课程设计成绩评定表指导教师签字:年月日目录1 设计任务 (2)2设计方案 (3)2.1 任务分析 (3)2.2 方案设计 (3)3系统硬件设计 (5)3.1时钟电路设计 (5)3.2复位电路设计 (5)3.3 1602控制电路 (5)3.4 DS18B20通信电路,开关电路设计 (6)3.5系统原理图 (7)4系统软件设计 (8)4.1 1ms定时 (8)4.2 DS18B20初始化程序 (8)4.3对DS1802写一个字节的数据 (8)4.4 1602的操作程序 (8)4.5温度测算及转换程序 (10)5仿真与性能分析 (11)5.1系统仿真过程 (11)5.2系统性能分析 (11)6.小结与展望 (13)参考文献 (14)附录1 元件清单 (15)附录2 系统程序 (16)数字式温度计的设计摘要温度是一种最基本的环境参数,人民的生活、生产与环境的温度息息相关。
在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置也有重要的意义。
基于STC89C52的数字温度计目录1、简介....... .......... ..... 3 _ _2、计划选择2.1。
主控片选 (3)2.2.显示模块.............................. (3)2.3、温度检测模块………………………………… .. 43、系统硬件设计3.1。
51单片机最小系统设计………………………… .4 .电源电路设计…………………… .. 5.液晶显示电路设计……………………………… ..63.4.温度检测电路设计………… . . . 74.系统软件设计4.1。
温度传感器数据读取流程图......... .. (9)4.2.系统编程………………… .105. 编程与仿真5.1、Keil编程软件………………… .. .. 115.2.变形杆菌 (11)5.3.模拟界面……………………… ..116.总结........ .......... ........ 12 _ _ _ _ _七、附录附录 1. 原理图........ .......... (12)附录 2. 程序清单…………………………………………………………………… ..131 简介进入信息飞速发展的21世纪,科学技术的发展日新月异。
科学技术的进步带动了测量技术的发展,现代控制设备的性能和结构发生了翻天覆地的变化。
我们已经进入高速发展的信息时代,测量技术也成为当今技术的主流,已经渗透到研究和应用工程的各个领域。
温度与人们的生活息息相关,温度的测量变得非常重要。
2.系统方案选择2.1 主控芯片选型方案一:STC89C52RCSTC89C52RC是8051内核的ISP在线可编程芯片,最高工作时钟频率为80MHz,芯片内含8KB Flash ROM,可反复擦写1000次。
该器件兼容MCS-51指令系统和8051引脚结构。
该芯片集成了通用8位中央处理器和ISP Flash存储单元,具有在线可编程特性,在PC端有控制程序,用户程序代码可下载到单片机部门,无需购买通用编程器,速度更快。
1绪论1.1选题背景随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中,有特别重要的意义。
现在所使用的温度计通常都是精度为1℃和0.1℃的水银、煤油或酒精温度计。
这些温度计的刻度间隔通常都很密,不容易准确分辨,读数困难,而且他们的热容量还比较大,达到热平衡所需的时间较长,因此很难读准,并且使用非常不方便。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等优点,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。
因此本课题就尝试通过编程与芯片的结合来解决传统数字温度计的弊端,设计出新型数字温度计。
1.2课题现状分析及研究意义温度传感器的发展现状:温度传感器使用范围广,数量多,居各种传感器之首,其发展大致经历了以下3个阶段:①传统的分立式温度传感器(含敏感元件)——热电偶传感器,主要是能够进行非电量和电量之间转换。
②模拟集成温度传感器/控制器。
集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。
③智能温度传感器。
它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。
智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。
本课题的研究可以应用领域生产、生活等很多领域。
对于家用电器从洗衣机、微波炉到音响等等到处都可以用到温度控制器来方便大家的日常生活。
开发此产品后也可方便应用安装在小至家庭大到工厂车间,小至一个芯片大到一个机械设备。
例如在家庭客厅卧室等必要地方显示室温,可防止家里食物是否变质及早采取措施。
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示结束DS18B20初始化程序流程图写0x44启动DS18B20延时500 s_____ 、一DS18B20 初始化写0xcc跳过读RCMDS18B20获取温度程序流程图DS18B20读字节程序流程图图3-4 DS18B20程序流程图DS18B20写字节程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示N附 1 源程序代码******************************************************************* 程序名 ; 基于 DS18B20 的测温系统* 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。
K1 是用来 * 进入上下限调节模式的,当按一下 K1 进入上限调节模式,再按一下进入下限 * 调节模式。
在正常模式下,按一下K2 进入查看上限温度模式,显示 1s 左右自动* 退出;按一下 K3 进入查看下限温度模式,显示 1s 左右自动退出;按一下 K4 消除 * 按键音,再按一下启动按键音。
在调节上下限温度模式下, K2 是实现加 1 功能, * K1 是实现减 1 功能, K3 是用来设定上下限温度正负的。
* 编程者: ZPZ * 编程时间: 2009/10/2*******************************************************************bit s=0;〃s 是调整上下限温度时温度闪烁的标志位, s=0不显示200ms , s=1 显示 1s 左右bit s1=0; void display1(uint z); #include"ds18b20.h" //s1 标志位用于上下限查看时的显示//声明 display1 ()函数//将 ds18b20.h 头文件包含到主程序#include"keyscan.h" #include"display.h"/***********************//将 keyscan.h 头文件包含到主程序 //将 display.h 头文件包含到主程序 主函数 ************************/#include<AT89X52.h> #include<intrins.h>// 将 AT89X52.h 头文件包含到主程序 //将 intrins.h 头文件包含到主程序(调用其中的 函数延时)_nop_() 空操作#define uint unsigned int #define uchar unsigned char uchar max=0x00,min=0x00;//变量类型宏定义,用 //变量类型宏定义,用//max 是上限报警温度, uint 表示无符号整形( 16 位) uchar 表示无符号字符型( 8 位)min 是下限报警温度void main(){beer=1;led=1; timer1_init(0); get_temperature(1);while(1){keyscan();get_temperature(0);//获取温度函数//关闭蜂鸣器// 关闭LED 灯//初始化定时器1(未启动定时器1)// 首次启动DS18B20 获取温度(DS18B20 上点后自动将EEPROM 中的上下限温度复制到TH 和TL 寄存器)//主循环//按键扫描函数keyscan(); // 按键扫描函数display(temp,temp_d*0.625);// 显示函数 alarm(); //报警函数 keyscan();// 按键扫描函数}}/******************************************************************** * 程序名 ; __ds18b20_h__ * 功 能: DS18B20 的 c51 编程头文件 * 编程者: ZPZ * 编程时间: 2009/10/2* 说 明:用到的全局变量是:无符号字符型变量temp ( 测得的温度整数部分 ),temp_d* ( 测得的温度小数部分 ),标志位 f (测量温度的标志位‘ 0'表示“正温度”‘ 1'表 * 示“负温度”),标志位 f_max (上限温度的标志位‘ 0'表示“正温度”、‘ 1'表 * 示“负温度”),标志位f_min (下限温度的标志位‘ 0'表示“正温度”、‘ 1'表* 示“负温度”),标志位 w ( 报警标志位‘ 1'启动报警‘ 0'关闭报警 ) 。
用单片机显示温度的汇编程序汇编语言是一种底层的机器语言,可以直接对硬件进行控制。
使用汇编语言编写单片机程序可以实现更加高效的代码和更低的资源消耗。
下面将介绍一种使用汇编语言编写单片机显示温度的程序。
首先需要明确使用的单片机型号和温度传感器类型。
在这里我们假设使用的单片机型号为STC89C52和模拟温度传感器LM35。
接下来我们将列出主要的程序框架,然后逐步进行详细的解释。
1.引入头文件:包含必要的寄存器定义和宏定义。
2.定义端口:为了简化程序,我们可以定义将数码管连接的端口为P0口。
3.定义变量:我们需要定义一些变量,包括温度变量和显示变量,用于存储和操作温度值和显示数据。
4.初始化:在程序开始时,需要对单片机进行一些初始化操作,包括设置端口引脚方向和清空显示变量等。
5.读取温度:通过与温度传感器的通信读取当前的温度值,并将其保存到温度变量中。
6.温度转换:由于LM35输出的是模拟电压值,我们需要将其转换为摄氏温度值。
具体的转换公式可根据LM35的数据手册获取。
7.显示温度:将温度值转换为数码管可以显示的格式,并输出到P0口。
8.延时:为了使温度值在数码管上显示一段时间,需要添加适当的延时函数。
9.重复以上步骤:使用循环语句,不断地读取温度、转换和显示,以实现持续的显示温度值。
以上是一个基本的单片机显示温度的汇编程序框架。
具体的实现可能与单片机型号和温度传感器有关,可以根据具体的硬件和需求进行相应的修改。
编写汇编程序需要熟悉硬件和寄存器的操作,对汇编语言有一定的了解。
在编写程序时,需要注意保持代码的清晰和规范,使用注释进行必要的解释,提高程序的可读性和可维护性。
单片机温度显示的汇编程序属于物联网和嵌入式系统的应用,常见于各种温度检测和控制的场景。
除了显示温度,该程序还可以进行一些其他的操作,例如报警,记录历史温度等。
通过学习和理解这个简单的例子,可以进一步了解汇编语言的应用和单片机的编程原理,为进一步深入学习嵌入式系统打下坚实的基础。
数字温度汇编程序概述:数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。
它可以接收各种温度输入,如摄氏度、华氏度或开尔文度,并将其转换为数字格式,以便于存储、处理和分析。
程序设计:数字温度汇编程序的设计主要包括输入模块、转换模块和输出模块。
1. 输入模块:输入模块负责接收用户输入的温度数据。
可以通过命令行参数、文本文件或图形用户界面等方式进行输入。
程序应该能够处理不同单位的温度输入,如摄氏度、华氏度或开尔文度。
2. 转换模块:转换模块负责将输入的温度数据转换为数字格式。
根据输入的单位,程序应该能够进行相应的转换计算。
例如,将摄氏度转换为华氏度的公式为:华氏度 = 摄氏度 * 9/5 + 32。
3. 输出模块:输出模块负责将转换后的数字温度数据进行输出。
可以将结果显示在命令行界面、保存到文本文件或通过网络发送给其他系统。
输出的格式应该清晰易读,并且包含必要的单位信息。
示例代码:下面是一个简单的数字温度汇编程序的示例代码:```assembly; 输入模块input:; 读取用户输入的温度值; 可以通过命令行参数或其他方式获取输入; 转换模块convert:; 判断输入的温度单位,并进行相应的转换计算; 如果输入的是摄氏度,则进行摄氏度到华氏度的转换; 如果输入的是华氏度,则进行华氏度到摄氏度的转换; 如果输入的是开尔文度,则进行开尔文度到摄氏度的转换; 输出模块output:; 将转换后的温度值进行输出; 可以将结果显示在命令行界面或保存到文件```示例数据:假设用户输入的温度为摄氏度,数值为25°C。
程序将进行摄氏度到华氏度的转换,计算结果为77°F。
最后,程序将输出转换后的温度值:77°F。
总结:数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。
它通过输入模块接收用户输入的温度数据,然后通过转换模块将其转换为数字格式,最后通过输出模块将转换后的温度值进行输出。
基于单片机的数字温度计设计1引言随着现代信息技术的飞速发展和传统工业改造的逐步实现.能够独立工作的温度检测和显示系统应用于诸多领域。
传统的温度检测以热敏电阻为温度敏感元件。
热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。
与传统的温度计相比,这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
选用AT89C51型单片机作为主控制器件,DSl8B20作为测温传感器通过4位共阳极LED数码管串口传送数据,实现温度显示。
通过DSl8B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.1℃。
该器件可直接向单片机传输数字信号,便于单片机处理及控制。
另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。
2 系统硬件设计方案根据系统功能要求,构造图1所示的系统原理结构框图。
图1 系统原理结构框图2.1单片机的选择AT89C51作为温度测试系统设计的核心器件。
该器件是INTEL公司生产的MCS一5l系列单片机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS—51的CMOS产品。
不仅结合了HMOS的高速和高密度技术及CHMOS 的低功耗特征,而且继承和扩展了MCS —48单片机的体系结构和指令系统。
单片机小系统的电路图如图2所示。
图2 单片机小系统电路AT89C51单片机的主要特性:(1)与MCS-51 兼容,4K 字节可编程闪烁存储器;(2)灵活的在线系统编程,掉电标识和快速编程特性;(3)寿命为1000次写/擦周期,数据保留时间可10年以上;(4)全静态工作模式:0Hz-33Hz ;(5)三级程序存储器锁定;(6)128*8位内部RAM ,32可编程I/O 线;(7)两个16位定时器/计数器,6个中断源;(8)全双工串行UART 通道,低功耗的闲置和掉电模式;(9)看门狗(WDT )及双数据指针;(9)片内振荡器和时钟电路;2.2 温度传感器介绍DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C 。
数字温度计1、LCD.c#include <reg51.h>#include<LCD.h>unsigned char code number_X[]={ //宽x高=8x16,纵向字节倒序0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //00x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, //10x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, //20x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, //30x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, //40x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, //50x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, //60x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, //70x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, //80x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //90x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //-0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //nop 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};void LCD_WriteCommandE1(unsigned char com) {while(CRADD1 & 0x80);CWADD1 = com;}void LCD_WriteDataE1(unsigned char dat)while(CRADD1 & 0x80);DWADD1 = dat;}void LCD_WriteCommandE2(unsigned char com) {while(CRADD2 & 0x80);CWADD2 = com;}void LCD_WriteDataE2(unsigned char dat){while(CRADD2 & 0x80);DWADD2 = dat;}void LCD_Init(){LCD_WriteCommandE1(0xe2);LCD_WriteCommandE2(0xe2);LCD_WriteCommandE1(0xa4);LCD_WriteCommandE2(0xa4);LCD_WriteCommandE1(0xa9);LCD_WriteCommandE2(0xa9);LCD_WriteCommandE1(0xa0);LCD_WriteCommandE2(0xa0);LCD_WriteCommandE1(0xc0);LCD_WriteCommandE2(0xc0);LCD_WriteCommandE1(0xaf);LCD_WriteCommandE2(0xaf);}void LCD_Clear(void){unsigned char i,j;for(i=0;i<4;i++){LCD_WriteCommandE1(i+0xb8);LCD_WriteCommandE2(i+0xb8);LCD_WriteCommandE1(0x00);LCD_WriteCommandE2(0x00);for(j=0;j<0x50;j++){LCD_WriteDataE1(0x00);LCD_WriteDataE2(0x00);}}void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p) {unsigned int seg,i,j;unsigned char a,L,n;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}for(i=0;i<len;i++){for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<16;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(*p++);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(*p++);}L++;}}col=col+16;}}void display_number(unsigned char lin,unsigned int col,unsigned char num){unsigned int seg,i,j;unsigned char a,L,n,k;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}k=num*16;for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<8;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(number_X[k++]);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(number_X[k++]);}L++;}}}void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat) {unsigned int seg;unsigned char k[4];k[3]=dat%10;k[2]=((dat/10)%10);k[1]=((dat/100)%10);k[0]=((dat/1000)%10);if(k[0]==0) {k[0]=12;}if((k[0]==12)&&(k[1]==0)){ k[0]=12;k[1]=12;}if((k[0]==12)&&(k[1]==12)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=12;}for(seg=0;seg<4;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_signed_int(unsigned char lin,unsigned int col,signed int dat){unsigned int seg;unsigned char k[5],a;k[0]=12;if(dat<0){dat=(~dat)+1;k[0]=11;}k[4]=dat%10;k[3]=((dat/10)%10);k[2]=((dat/100)%10);k[1]=((dat/1000)%10);a=k[0];if(k[1]==0) {k[0]=12;k[1]=a;}if((k[1]==a)&&(k[2]==0)){ k[0]=12;k[1]=12;k[2]=a;}if((k[1]==12)&&(k[2]==a)&&(k[3]==0)){k[0]=12;k[1]=12;k[2]=12;k[3]=a;}for(seg=0;seg<5;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat) {unsigned int seg;unsigned char k[3];k[1]=dat%10;k[0]=((dat/10)%10);for(seg=0;seg<2;seg++){display_number(lin,col,k[seg]);col=col+10;}}2、LCD.h#include <reg51.h>#include <absacc.h>#ifndef __LCD__#define __LCD__#define CWADD1 XBYTE[0x8000]#define DWADD1 XBYTE[0x8001]#define CRADD1 XBYTE[0x8002]#define DRADD1 XBYTE[0x8003]#define CWADD2 XBYTE[0x8004]#define DWADD2 XBYTE[0x8005]#define CRADD2 XBYTE[0x8006]#define DRADD2 XBYTE[0x8007]extern void LCD_Init();extern void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p);extern void display_signed_int(unsigned char lin,unsigned int col,signed int dat);extern void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat);extern void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat);extern void LCD_Clear(void);#endif3、DS18B20.c#include <reg51.h>#include "string.h"#include "intrins.h"#include "DS18B20.h"sbit DQ=P1^0;void delay(unsigned int uSeconds){for(;uSeconds>0;uSeconds--);}unsigned char ow_reset(void){unsigned char xdata presence;DQ = 0;delay(48);DQ = 1;delay(7);presence = DQ;delay(48);return(presence);}unsigned char read_byte(void){unsigned char i;unsigned char value = 0;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start read timeslotDQ = 1; // then rlease DQ_nop_();_nop_();_nop_();_nop_();_nop_(); // read DQ data at 1 to 15us,here delay 6us;if(DQ)value|=0x80;delay(7); // wait for rest of timeslot,72us }return(value);}void write_byte(char val){unsigned char i;for (i=8; i>0; i--) // writes byte, one bit at a time{DQ = 0; // pull DQ low to start timeslotDQ = val&0x01;delay(7); // hold value for remainder of timeslot,here 72us DQ = 1;val=val/2;}delay(5);}float Read_Temperature(void){unsigned char Hdata,Ldata,b;int a;bit flag;float x,y,z;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Paddelay(100);Ldata=read_byte(); // Low byte firstHdata=read_byte(); // High byte afterow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversiona=Hdata*256+Ldata;x=(float)(Ldata&0x0f);x=x/16;if(a<0)flag=1;else flag=0;b=a>>4;z=(float)(b);if(flag==1){b=~b+1;z=(float)(b);z=0-z;}y=z+x;return y;}4、DS18B20.h#ifndef __DS18B20__#define __DS18B20__extern float Read_Temperature(void); #endif5、main.c#include <reg51.h>#include<LCD.h>#include<main.h>#include "DS18B20.h"void wait(unsigned int x){unsigned int i;i=0;for(i=0;i<x;i++);}void main(void){float F;signed int a;LCD_Init();LCD_Clear();display_cn(0,20,5,szwdj);display_cn(1,0,3,wdz);while(1){F=Read_Temperature( );a=(signed int)F;display_signed_int(1,40,a);wait(5000);}}6、main.h#ifndef MAIN_H__#define MAIN_H__// 中文字模库16x16点阵code unsigned char szwdj[]={ //纵向字节倒序。
数字温度汇编程序数字温度汇编程序是一种用于将温度值从摄氏度转换为华氏度或其他温度单位的程序。
这个程序可以通过输入一个摄氏度的数值,然后计算并输出对应的华氏度值。
为了编写数字温度汇编程序,我们可以按照以下步骤进行:1. 程序开始:- 在程序开始处,我们需要初始化相关的变量和寄存器,以确保程序正常运行。
- 可以使用汇编语言中的数据段和堆栈段来声明和分配内存空间。
2. 输入温度值:- 程序需要提示用户输入一个摄氏度的数值。
- 可以使用汇编语言中的输入函数或系统调用来获取用户的输入。
3. 温度转换计算:- 接下来,程序需要将输入的摄氏度值转换为华氏度或其他温度单位。
- 可以使用以下公式进行摄氏度到华氏度的转换:华氏度 = 摄氏度 * 9 / 5 + 32。
- 在汇编语言中,可以使用乘法、除法和加法指令来执行这个计算。
4. 输出结果:- 计算完成后,程序需要将转换后的温度值输出给用户。
- 可以使用汇编语言中的输出函数或系统调用来显示结果。
5. 程序结束:- 在程序结束时,需要清理和释放之前分配的内存空间,并恢复寄存器的初始状态。
- 可以使用汇编语言中的退出函数或系统调用来结束程序的执行。
编写数字温度汇编程序的关键是熟悉汇编语言的指令和寄存器的使用。
在开始编写程序之前,建议先了解所使用的汇编语言的基本语法和指令集。
以下是一个简单的示例程序,用于演示如何实现数字温度汇编程序:```section .datamessage db '请输入摄氏度值:', 0result db '华氏度值为:', 0section .bsscelsius resb 4fahrenheit resb 4section .textglobal _start_start:; 显示提示信息mov eax, 4mov ebx, 1mov ecx, messageint 0x80; 获取用户输入mov eax, 3mov ebx, 0mov ecx, celsiusmov edx, 4int 0x80; 将输入的摄氏度值转换为华氏度 mov eax, dword [celsius]imul eax, 9idiv dword 5add eax, 32mov dword [fahrenheit], eax; 显示转换后的结果mov eax, 4mov ebx, 1mov ecx, resultmov edx, 12int 0x80mov eax, 4mov ecx, fahrenheitmov edx, 4int 0x80; 程序结束mov eax, 1xor ebx, ebxint 0x80```以上示例程序使用Linux系统的汇编语言(x86架构)。
微机原理课程设计报告温度计姓名:WW学号:班级:电气1005学院:电气工程学院合作者:WY上课教师:杨少兵指导老师:***时间:2013年3月20日微机原理课程设计成绩评定表指导教师签字:2013年 3 月20 日微机原理课程设计任务书学生姓名:指导教师:王健强一、课程设计题目:数字温度计选用温度传感器AD590实现温度采集、摄氏温度显示,温度精度达到0.1度,测量范围零下10度到零上100度。
二、课程设计要求1. 根据具体设计课题的技术指标和给定条件,独立进行方案论证和电路设计,要求概念清楚、方案合理、方法正确、步骤完整;2. 查阅有关参考资料和手册,并能正确选择有关元器件和参数,对设计方案进行仿真;3. 完成预习报告,报告中要有设计方案,设计电路图,还要有仿真结果;4. 进实验室进行编程和电路调试,边调试边修正方案;5. 撰写课程设计报告——最终的电路图、调试过程中遇到的问题和解决问题的方法。
三、进度安排1.时间安排序号内容学时安排(天)1 方案论证和系统设计 12 完成电路仿真,写预习报告 13 电路调试 24 写设计总结报告与答辩 1合计 5设计调试地点:电气楼4062.执行要求课程设计共多个选题,每组不得超过2人,要求学生在教师的指导下,独力完成所设计的详细电路(包括计算和器件选型)。
严禁抄袭,严禁两篇设计报告雷同。
摘要随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。
本文主要介绍了一个基于STC89C52单片机的测温系统,详细描述了利用温度传感器AD590开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示。
它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
数字温度汇编程序数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。
它可以将从传感器或其他温度测量设备获取的模拟信号转换为数字信号,以便计算机可以对其进行处理和分析。
本文将详细介绍数字温度汇编程序的原理、功能和实现方法。
一、原理数字温度汇编程序的核心原理是将模拟温度信号转换为数字形式。
这个过程通常涉及到模数转换(ADC)技术。
传感器测量到的温度信号是模拟信号,需要经过ADC转换为数字信号,才能被计算机处理。
ADC将连续的模拟信号转换为离散的数字信号,通过对模拟信号进行采样和量化来实现。
二、功能1. 温度测量:数字温度汇编程序可以准确测量温度,并将其转换为数字形式。
通过传感器获取温度信号,程序可以将其转换为计算机可以理解和处理的数字信号。
2. 数据处理:数字温度汇编程序可以对测量到的温度数据进行处理和分析。
它可以实现温度数据的存储、计算、统计和显示等功能。
通过对温度数据的处理,可以得出温度的变化趋势、平均值、最大值、最小值等信息。
3. 报警功能:数字温度汇编程序可以设置温度报警功能。
当温度超过或低于设定的阈值时,程序可以触发报警,通知用户或其他系统进行相应的处理。
4. 数据通信:数字温度汇编程序可以通过串口、网络或其他通信方式将温度数据传输给其他设备或系统。
这样,其他设备或系统可以实时监测和接收温度数据,进行进一步的处理和分析。
三、实现方法1. 硬件准备:实现数字温度汇编程序需要一些基本的硬件设备,包括温度传感器、模数转换器、微控制器或单片机等。
温度传感器用于测量温度,模数转换器用于将模拟信号转换为数字信号,微控制器或单片机用于控制和处理温度数据。
2. 程序编写:使用汇编语言编写数字温度汇编程序。
程序需要包括温度测量、数据处理、报警和数据通信等功能的实现。
编写程序时需要考虑温度传感器的特性和模数转换器的工作原理,以确保数据的准确性和稳定性。
3. 硬件连接:将温度传感器和模数转换器连接到微控制器或单片机上。
#include <REGX51.H>//51单片机头文件typedef unsigned char uchar;//类型定义typedef unsigned int uint; //类型定义uchar code SEGCODE[]= //定义LED段码{0X03,0X9F,0X25,0X0D,0X99,0X49,0X21,0X1F,0X01,0X09,0xff,//blank0XFD,//LINE};//定义按键扫描码表uchar code KEYCODE[]={0XEE,0XED,0XEB,0XE7,0XDE,0XDD,0XDB,0XD7,0XBE,0XBD,0XBB,0XB7,0X7E};#define NEGCHAR 11 //定义字符'-'常量#define POSICHAR 10 //定义字符空格常量#define KEYPORT P2//定义按键端口#define NO_KEY 13 //定义无按键常量#define KEYNEXT 10//定义下一位按键常量#define KEYSET 11//定义SET按键常量#define KEYSIGN 12//定义符号按键常量bit DispCon;//是否刷新LED显示器bit freshcon;//是否闪烁显示bit DisplayNormal;//正常显示还是显示空白字符uchar SysMode;//系统模式变量0:正常显示1:设置上限报警值2:设置下限报警值uchar PT;//设置报警值时,指示设置的数位uchar Inputt;// 设置时,存放当前设置值uchar TimeCnt;//记录定时器中断的次数#define TEMPSECOND 1#define SIGNPOSI 0sbit SDA= P1^3;//定义时钟的SDA线sbit SCL= P1^2;//定义时钟的SCL线sbit MSDA= P1^4;//定义A/D转换器的SDA线sbit MCLK= P1^5;//定义A/D转换器的SCL线sbit CS187=P1^6; //定义A/D转换器的片选线sbit LEDREDCON=P0^0;//定义红色灯控制引脚sbit LEDGREENCON=P0^1;//定义绿色灯控制引脚sbit SPEAKERCON=P0^3;////定义蜂鸣器控制引脚uchar DB[4];//定义显示及设置缓冲区561uint upperv;//保存设置的上限报警值uint lowerv;//保存设置的下限报警值/*入口参数:无出口参数:按键值或无按键*/uchar Scan_Key(){uchar KeyTemp,i;//定义局部变量KEYPORT=0xf0;//行线输出0,列线输出全1KeyTemp=KEYPORT;//读按键端口值if(KeyTemp==0xf0)return NO_KEY;//无键按下,返回Delay15Ms();//延时去抖KEYPORT=KeyTemp|0x0f;//列线输出,行线输入KeyTemp=KEYPORT;//读取按键端口值for(i=0;i<12;i++){if(KeyTemp==KEYCODE[i])//根据按键端口扫描值,查找按键值break;}KEYPORT=0xf0;//行线输出0,列线输出全1while(KEYPORT!=0xf0) ;//等待按键是否释放Delay15Ms();//延时return i;}/*入口参数:Key:待处理的按键值出口参数:无*/void Process_Key(uchar Key){switch(SysMode){case 0://正常显示模式――显示温度值if(Key==KEYSET) //用户按下设置键{Ini_Ms1();//初始化上限报警设置562DispCon=1;}break;case 1://设置上限模式case 2://设置下限模式DispCon=1;Set_Alarm(Key,SysMode);//对按键进行处理break;}}/*入口参数:num:待显示的字符出口参数:无*/void Disp_One_Led(uchar num){uchar i;SCL=0;//控制SCL输出低电平for(i=0;i<8;i++)//需要发送8位二进制数{SDA=num&0x80;//将数据最高位通过SDA引脚发送出SCL=1; //控制SCL输出高电平SCL=0; //控制SCL输出低电平num<<=1;//生成下次发送的最高位}}void Disp_All_Led(){uchar i,j;for(i=0;i<4;i++)//4位LED数码管{j=SEGCODE[DB[i]];if(i==2) //有一位要带点显示j-=0x80;Disp_One_Led(j); //将显示缓冲区的某个字符显示}}563/*入口参数:num:填充缓冲区的温度值出口参数:无*/void Fill_Buf(uint mm){uchar i;if (mm>498){DB[0]=POSICHAR;//生成+号mm-=499;//得到温度值}else{DB[0]=NEGCHAR;//生成负号mm=499-mm;}for(i=3;i>0;i--)//温度值填充显示缓冲区{DB[i]=mm%10;mm/=10;}}void Fresh_LED(){uint j;if(DispCon==1)//是否刷新显示{DispCon=0;switch(SysMode){case 0://正常显示与报警处理j=Read_Temp();Fill_Buf(j);Disp_All_Led();Process_Alarm(j);//报警处理break;case 1:564case 2://设置上、下限报警值,闪烁显示操作if(DisplayNormal==1)DB[PT]=Inputt;//正常显示值elseDB[PT]=POSICHAR;//空白字符值Disp_All_Led();}}}/*入口参数:无出口参数:温度转化后的数字量。
单片机温度计完整汇编语句汇编程序;================================================================;;============================常数定义============================= TIMEL EQU 0E0H ;20ms,定时器0时间常数TIMEH EQU 0B1HTEMPHEAD EQU 36H;==========================工作内存定义============================ BITST DATA 20HTIME1SOK BIT BITST.1TEMPH DATA 27HTEMPHC DATA 28HTEMPLC DATA 29H;============================= 引脚定义=========================== TEMPDIN BIT P3.7;============================= 中断向量区========================= ORG 0000HLJMP STARTORG 00BHLJMP T0IT;=============================系统初始化========================== ORG 100HSTART: MOV SP,#60HCLSMEM: MOV R0,#20HMOV R1,#60HCLSMEM1: MOV @R0,#00HSJMP INITERROR: NOPLJMP STARTNOPINIT: NOPSETB ET0SETB TR0SETB EAMOV PSW,#00HCLR TEMPONEOKLJMP MAIN;====================== 定时器0中断服务程序======================= T0IT: PUSH PSWCJNE R7,#32H,T0IT1MOV R7,#00HSETB TIME1SOK ;1s定时到标志T0IT1: POP PSWRETI;============================= 主程序============================= MAIN: LCALL DISP1 序JNB TIME1SOK,MAINCLR TIME1SOKJNB TEMPONEOK,MAIN2LCALL READTEMP1 ;LCALL CONVTEMPLCALL DISPBCDLCALL DISP1MAIN2: LCALL READTEMP ;SETB TEMPONEOKLJMP MAIN;============================= 子程序区=========================== ;RESET DS18B20;================================================================ INITDS1820:SETB TEMPDINNOPNOPCLR TEMPDINMOV R6,#0A0H ;DELAY 480usDJNZ R6,$MOV R6,#0A0HDJNZ R6,$DJNZ R6,LOOP1820MOV R6,#064HDJNZ R6,$SJMP INITDS1820RETINITDS1820OUT: SETB TEMPDINRET;====== 读DS18B20的程序,从DS18B20中读出一个字节的数据=============READDS1820: MOV R7,#08HSETB TEMPDINNOPNOPREADDS1820LOOP: CLR TEMPDINNOPNOPSETB TEMPDINDJNZ R7,READDS1820LOOPMOV R6,#3CH ;DELAY 120 usDJNZ R6,$RET;======== 写DS18B20的程序,从DS18B20中写一个字节的数据=============WRITEDS1820: MOV R7,#08HSETB TEMPDINNOPNOPWRITEDS1820LOP: CLR TEMPDIN04usDJNZ R6,$SETB TEMPDINDJNZ R7,WRITEDS1820LOPRET;========================= READ TEMP =========================== READTEMP: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#44HLCALL WRITEDS1820 ;START CONVERSIONMOV R6,#34H ;DELAY 104DJNZ R6,$RETREADTEMP1: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROM04usDJNZ R6,$MOV R5,#09HMOV R0,#TEMPHEADMOV B,#00HREADTEMP2: LCALL READDS1820MOV @R0,AINC R0READTEMP21: LCALL CRC8CALDJNZ R5,READTEMP2MOV A,BJNZ R EADTEMPOUTMOV A,TEMPHEAD+0MOV TEMPL,AMOV A,TEMPHEAD+1MOV TEMPH,AREADTEMPOUT: RET;================== 处理温度BCD码子程序========================== CONVTEMP: MOV A,TEMPHANL A,#80HJZ TEMPC1CLR CMOV A,TEMPLCPL AADD A,#01HMOV TEMPL,AMOV A,TEMPH ;-CPL AADDC A,#00HMOV TEMPH,A ;TEMPHC HI=符号位MOV TEMPHC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;+TEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCDMOV A,TEMPL ;整数部分ANL A,#0F0HSWAP AMOV TEMPL,AMOV A,TEMPHANL A,#0FHSWAP AORL A,TEMPLLCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW=十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI=个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R7MOV R7,AMOV A,TEMPHC ;TEMPLC HI=百位数BCDANL A,#0FHORL A,R7MOV TEMPHC,ATEMPC12: RET;========================= 小数部分码表=========================== TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06HDB 06H,07H,08H,08H,09H,09H;====================== 显示区BCD码温度值刷新子程序=============== DISPBCD: MOV A,TEMPLCMOV 71H,AMOV A,TEMPHCANL A,#0FHMOV 72H,AMOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,AMOV A,TEMPHCANL A,#0F0HCJNE A,#010H,DISPBCD0SJMP DISPBCD2DISPBCD0: MOV A,TEMPHCANL A,#0FHJNZ D ISPBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号DISPBCD2: RET;======================= 显示子程序=============================== ;显示数据在70H~73H单元内,用4位LED共阳数码管显示,P1口输出段码数据,;P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。