数字温度计设计汇编源程序
基于STC89C52单片机的数字温度计(附源代码,完美实现)
基于STC89C52单片机的数字温度计学院:信息科学与工程学院专业:电子信息科学与技术一、摘要温度的检测是工业生产中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发。
本文设计了一种基于STC89C52单片机的温度检测系统,该系统将温度传感器DS18B20接在控制器的端口上,对温度进行采集,将采集到的温度值显示在1602液晶屏上。
经实验测试表明,该系统设计和布线简单,结构紧凑,有可读性高,反应速度快,测量准确,抗干扰能力强,性价比高,扩展方便等优点,具有关阔的应用前景。
关键词:STC89C52 数字温度计 DS18B20二、前言随着人民生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子。
单片机控制温度检测系统的温感系统主要是DS18B20芯片,该芯片由一根总线控制,电压范围为3.0v--5.5v。
DS18B20具有测温方便、测温范围广、测温精度高等特点。
出于对此类问题的探索,我们设计并制作了此温度检测系统。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确。
其输出温度采用数字显示,主要用于对测温比较准确的场所,该设计控制器模块主要使用STC89C52单片机,测温传感模块使用DS18B20;显示模块使用1602液晶显示屏,可以只管、准确的显示所测温度值。
三、系统组成及工作原理3.1、总体设计方案经分析,将系统分为两个部分,一个是由温度传感器DS18B20组成的检测部分,另一个是由单片机和1602液晶组成的主控与显示部分。
如图所示DS18B20将检测到的数据送到单片机,单片机对接收到的数据进行处理并送到1602显示,6V电源给各个部分供电。
3.2系统单元的选择与论证3.2.1单片机控制模块的选择与论证方案一:采用XC9000系列的FPGA。
单片机数字式温度计设计说明书(附带源程序)
附件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)数字式温度计的设计摘要温度是一种最基本的环境参数,人民的生活、生产与环境的温度息息相关。
在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置也有重要的意义。
C51单片机数字温度计汇编程序及说明书
1绪论1.1选题背景随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中,有特别重要的意义。
现在所使用的温度计通常都是精度为1℃和0.1℃的水银、煤油或酒精温度计。
这些温度计的刻度间隔通常都很密,不容易准确分辨,读数困难,而且他们的热容量还比较大,达到热平衡所需的时间较长,因此很难读准,并且使用非常不方便。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等优点,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。
因此本课题就尝试通过编程与芯片的结合来解决传统数字温度计的弊端,设计出新型数字温度计。
1.2课题现状分析及研究意义温度传感器的发展现状:温度传感器使用范围广,数量多,居各种传感器之首,其发展大致经历了以下3个阶段:①传统的分立式温度传感器(含敏感元件)——热电偶传感器,主要是能够进行非电量和电量之间转换。
②模拟集成温度传感器/控制器。
集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。
③智能温度传感器。
它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。
智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。
本课题的研究可以应用领域生产、生活等很多领域。
对于家用电器从洗衣机、微波炉到音响等等到处都可以用到温度控制器来方便大家的日常生活。
开发此产品后也可方便应用安装在小至家庭大到工厂车间,小至一个芯片大到一个机械设备。
例如在家庭客厅卧室等必要地方显示室温,可防止家里食物是否变质及早采取措施。
数字温度汇编程序
数字温度汇编程序概述:数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。
它可以接收各种温度输入,如摄氏度、华氏度或开尔文度,并将其转换为数字格式,以便于存储、处理和分析。
程序设计:数字温度汇编程序的设计主要包括输入模块、转换模块和输出模块。
1. 输入模块:输入模块负责接收用户输入的温度数据。
可以通过命令行参数、文本文件或图形用户界面等方式进行输入。
程序应该能够处理不同单位的温度输入,如摄氏度、华氏度或开尔文度。
2. 转换模块:转换模块负责将输入的温度数据转换为数字格式。
根据输入的单位,程序应该能够进行相应的转换计算。
例如,将摄氏度转换为华氏度的公式为:华氏度 = 摄氏度 * 9/5 + 32。
3. 输出模块:输出模块负责将转换后的数字温度数据进行输出。
可以将结果显示在命令行界面、保存到文本文件或通过网络发送给其他系统。
输出的格式应该清晰易读,并且包含必要的单位信息。
示例代码:下面是一个简单的数字温度汇编程序的示例代码:```assembly; 输入模块input:; 读取用户输入的温度值; 可以通过命令行参数或其他方式获取输入; 转换模块convert:; 判断输入的温度单位,并进行相应的转换计算; 如果输入的是摄氏度,则进行摄氏度到华氏度的转换; 如果输入的是华氏度,则进行华氏度到摄氏度的转换; 如果输入的是开尔文度,则进行开尔文度到摄氏度的转换; 输出模块output:; 将转换后的温度值进行输出; 可以将结果显示在命令行界面或保存到文件```示例数据:假设用户输入的温度为摄氏度,数值为25°C。
程序将进行摄氏度到华氏度的转换,计算结果为77°F。
最后,程序将输出转换后的温度值:77°F。
总结:数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。
它通过输入模块接收用户输入的温度数据,然后通过转换模块将其转换为数字格式,最后通过输出模块将转换后的温度值进行输出。
51单片机程序(数字温度计)
数字温度计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[]={ //纵向字节倒序。
数字温度计设计汇编源程序
;================================================================ ;DS18B20温度计;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃;用AT89C51单片机,12MHz晶振;DS1302时钟芯片实现日历年月日时分秒的显示;============================常数定义============================= TIMEL EQU 0E0H ;20ms,定时器0时间常数TIMEH EQU 0B1HSECOND EQU 30HMINUTE EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPHEAD EQU 38HTEMP_UPPER EQU 2AHTEMP_LOWER EQU 2BH;==========================工作内存定义============================ BITST DATA 20HTIME1SOK BIT BITST.1TEMPL DATA 26HTEMPH DATA 27HTEMPHC DATA 28HTEMPLC DATA 29H;============================= 引脚定义=========================== TEMPDIN B IT P3.7ALARMDIN BIT P1.6RST BIT P1.2CLK BIT P1.1IO BIT P1.0;============================= 中断向量区========================= ORG 0000HLJMP STARTORG 000BHLJMP T0IT;=============================系统初始化========================== ORG 0100HSTART: MOV SP,#60HCLSMEM: MOV R0,#20HMOV R1,#60HCLSMEM1: MOV @R0,#00HINC R0DJNZ R1,CLSMEM1MOV TMOD,#00010001B ;定时器0工作方式1(16BIT)MOV TH0,#TIMEHMOV TL0,#TIMEL ;20msMOV SECOND,#00HMOV MINUTE,#00HMOV HOUR,#14HMOV DAY,#17HMOV MONTH,#01HMOV WEEK,#01HMOV YEAR,#13HMOV TEMP_UPPER,#0AHMOV TEMP_LOWER,#8AHSETB ET0SETB EAMOV PSW,#00H;================================================================= ;============================= 主程序============================= ;=================================================================LCALL SETDS1302START1: LCALL R EAD_TEMP ;读出温度值子程序LCALL CONVTEMP ;温度BCD码计算处理子程序LCALL REFBCD ;显示区BCD码温度值刷新子程序LCALL GETDS1302SETB TR0LCALL ALARM_JUDGEJNB F0,MAINLCALL ALARM_BEEPMAIN: LCALL DISP_TEMP ;调用显示子程序LCALL DISPLAY_TIMEJNB TIME1SOK,MAINCLR TIME1SOK ;测温每1s一次MAIN1: LCALL DISP_TEMP ;调用显示子程序LCALL DISPLAY_DA TEJNB TIME1SOK,MAIN1CLR TIME1SOK ;测温每1s一次LJMP START1;====================== 定时器0中断服务程序=======================T0IT: PUSH PSWMOV PSW,#10HMOV TH0,#TIMEHMOV TL0,#TIMELINC R7CJNE R7,#50,T0IT1MOV R7,#00HSETB TIME1SOK ;1s定时到标志T0IT1: POP PSWRETI;================================================================= ;============================= 子程序区=========================== ;=================================================================;=============================初始化DS18B20======================= INITDS1820:SETB TEMPDINNOPNOPCLR TEMPDINMOV R6,#0A0HDJNZ R6,$MOV R6,#0A0HDJNZ R6,$SETB TEMPDINMOV R6,#32HDJNZ R6,$MOV R6,#3CHLOOP1820: MOV C,TEMPDINJC INITDS1820OUTDJNZ R6,LOOP1820MOV R6,#064HDJNZ R6,$SJMP INITDS1820INITDS1820OUT: SETB TEMPDINRET;====== 读DS18B20的程序,从DS18B20中读出一个字节的数据============= READDS1820: MOV R7,#08HSETB TEMPDINNOPNOPREADDS1820LOOP: CLR TEMPDINNOPNOPNOPSETB TEMPDINMOV R6,#07H ;DELAY 15usDJNZ R6,$MOV C,TEMPDINMOV R6,#3CH ;DELAY 120usDJNZ R6,$RRC ASETB TEMPDINDJNZ R7,READDS1820LOOPMOV R6,#3CH ;DELAY 120 usDJNZ R6,$RET;======== 写DS18B20的程序,从DS18B20中写一个字节的数据============= WRITEDS1820: MOV R7,#08HSETB TEMPDINNOPNOPWRITEDS1820LOP: CLR TEMPDINMOV R6,#07H ;DELAY 15usDJNZ R6,$RRC AMOV TEMPDIN,CMOV R6,#34H ;DELAY 104usDJNZ R6,$SETB TEMPDINDJNZ R7,WRITEDS1820LOPRET;========================= READ TEMP =========================== READ_TEMP: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#44HLCALL WRITEDS1820 ;START CONVERSIONMOV R6,#34H ;DELAY 104DJNZ R6,$READTEMP1: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#0BEHLCALL WRITEDS1820 ;SCRATCHPADMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV R5,#09HMOV R0,#TEMPHEADMOV B,#00HREADTEMP2: LCALL READDS1820MOV @R0,AINC R0DJNZ R5,READTEMP2MOV 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,R7JZ TEMPC12ANL A,#0FHSWAP AMOV 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码温度值子程序=============== REFBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,AMOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,AMOV A,TEMPHCANL A,#0FHMOV 72H,AMOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,AMOV A,TEMPHCANL A,#0F0HCJNE A,#010H,REFBCD0SJMP REFBCD2REFBCD0: MOV A,TEMPHCANL A,#0FHJNZ REFBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号REFBCD2: RET;======================= 即时温度显示子程序===============================;显示数据在70H~73H单元内,用4位LED共阳数码管显示,P0口输出段码数据,;P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。
DS18B20汇编程序(完整版)
DS18B20汇编程序(完整版)DS18B20汇编程序;实验目的:熟悉DS18B20的使用;六位数码管显示温度结果,其中整数部分2位,小数部分4位;每次按下RB0键后进行一次温度转换。
;硬件要求:把DS18B20插在18B20插座上; 拨码开关S10第1位置ON,其他位置OFF; 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF;*****************以下是暂存器的定义*****************************#INCLUDE#DEFINE DQ PORTA,0 ;18B20数据口__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF &_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS _OSC CBLOCK 20HDQ_DELAY1DQ_DELAY2TEMPTEMP1TEMP2 ;存放采样到的温度值TEMP3COUNTCOUNT1ENDCTMR0_VALUE EQU 0AH ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000usDQ_DELAY_VALUE1 EQU 0FAHDQ_DELAY_VALUE2 EQU 4H;**********************以下是程序的开始************************ ORG 00HNOPGOTO MAIN ;入口地址ORG 04HRETFIE ;在中断入口出放置一条中断返回指令,防止干扰产生中断TABLEADDWF PCL,1RETLW 0C0H ;0的编码(公阳极数码管)RETLW 0F9H ;1的编码RETLW 0A4H ;2的编码RETLW 0B0H ;3的编码RETLW 99H ;4的编码RETLW 92H ;5的编码RETLW 082H ;6RETLW 0F8H ;7RETLW 080H ;8RETLW 090H ;9;***************************主程序******************************* MAINCLRF PORTACLRF PORTBBANKSEL TRISACLRF TRISA ;A口所有先设置为输出CLRF TRISDMOVLW 01HMOVWF TRISB ;B0口为输入,其他为输出MOVLW 06HMOVWF ADCON1 ;关闭所有A/D口MOVLW 01HMOVWF OPTION_REG ;分频比1:4,定时器,内部时钟源BCF STATUS,RP0CLRF TEMPCLRF TEMP1CLRF TEMP2 ;清零临时寄存器MOVLW 8HMOVWF COUNTMOVLW 38HMOVWF FSRCLRF INDFINCF FSR,1DECFSZ COUNT,1GOTO $-3;****************************循环处理部分************************;先启动18B20温度转换程序,在判断温度转换是否完成(需750us);未完成则调用显示子程序,直到完成温度转换;完成后读取温度值;送LCD显示LOOPBTFSC PORTB,0 ;判断温度转换按键是否按下GOTO LOOP1 ;否,转显示CALL DELAY ;消抖BTFSC PORTB,0 ;再次判断GOTO LOOP1CALL RESET_18B20 ;调用复位18B20子程序MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 44HMOVWF TEMPCALL WRITE_18B20 ;温度转换命令CLRF STATUSCALL DELAY_750MS ;调用温度转换所需要的750MS延时NOPCALL RESET_18B20MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 0BEHMOVWF TEMPCALL WRITE_18B20 ;读温度命令CALL READ_18B20 ;调用读温度低字节MOVFW TEMPMOVWF TEMP1 ;保存到TEMP1CALL READ_18B20 ;调用读温度高字节MOVFW TEMPMOVWF TEMP2 ;保存到TMEP2CALL RESET_18B20LOOP1CALL TEMP_CHANGE ;调用温度转换程序CALL DISPLAY ;调用LCD显示程序GOTO LOOP ;循环工作;*********************复位DS18B20子程序************************** RESET_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;主控制器把总线拉低至少480us,;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF DQMOVLW 0A0HMOVWF COUNT ;160USDECFSZ COUNT,1GOTO $-1 ;拉低480usBSF DQ ;释放总线MOVLW 14HMOVWF COUNTDECFSZ COUNT,1GOTO $-1 ;等待60usBANKSEL TRISABSF TRISA,0 ;DQ设置为输入BCF STATUS,RP0BTFSC DQ ;数据线是否为低GOTO RESET_18B20 ;否则继续复位MOVLW 4HMOVWF COUNTDECFSZ COUNT,1 ;延时一段时间后再次判断GOTO $-1BTFSC DQGOTO RESET_18B20MOVLW 4BHMOVWF COUNTDECFSZ COUNT,1GOTO $-1BANKSEL TRISABCF TRISA,0 ;DQ设置为输出BCF STATUS,RP0RETURN;*********************写DS18B20子程序**************************** WRITE_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;写数据0时,主控制器把总线拉低至少60us;写数据1时,主控制器把总线拉低,但必须在15us内释放MOVLW 8HMOVWF COUNT ;8位数据BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF STATUS,CWRITE_18B20_1BSF DQ ;先保持DQ为高MOVLW 5HMOVWF COUNT1BCF DQ ;拉低DQ15usDECFSZ COUNT1,1GOTO $-1RRF TEMP,1BTFSS STATUS,C ;判断写的数据为0还是1GOTO WRITE_0BSF DQ ;为1,立即拉高数据线GOTO WRITE_ENDWRITE_0BCF DQ ;继续保持数据线为低WRITE_ENDMOVLW 0FHMOVWF COUNT1 ;保持45msDECFSZ COUNT1,1GOTO $-1BSF DQ ;释放总线DECFSZ COUNT,1 ;是否写完8位数据GOTO WRITE_18B20_1RETURN;**********************读DS18B20子程序**************************** READ_18B20;根据DATASHEET介绍,读数据时应遵照如下规定:;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us ;读数据1时,主控制器把总线拉低后,保持总线状态不变;主控制器在数据线拉低后15us内读区数据线上的状态。
数字温度计论文 C语言+汇编语言
前言温度的测量对人类日常生活、工业生产、气象预报、物资仓储等都起着极其重要的作用,因此研究温度的测量方法和装置具有重要的意义。
近年来,温度检测领域发展迅速,并且随着数字技术的发展,温度的测控芯片也相应的登上历史的舞台,能够在工业、农业等各个领域中广泛使用。
温度的测量的关键之处是温度传感器,其往往决定着一个温度检测系统的性能。
传统的温度检测以热敏电阻和AD590为温度敏感元件。
热敏电阻虽成本低,但需信号处理电路,电路复杂,可靠性较低,测温准确度及抗干扰能力也有一定的不足。
近年来,传感器正处于传统型向新型传感器转型的发展阶段。
新型的温度传感器的特点是微型化、数字化、智能化、多功能化、系统化、网络化,它提高了抗干扰能力和可靠性,而且使系统结构更简洁,维护方便,缩小了空间。
单片机具有集成度高、功能强、体积小、价格低、抗干扰能力等优于一般CPU的优点,因此往往采用单片机作为数字控制器取代模拟控制器。
温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。
成熟的温控产品主要以“点位”控制及常规的PID控制器为主,它们只能适应一般温度系统控制,而用于较高控制场合的智能化、自适应控制仪表,国内技术还不十分成熟,形成商品化并广泛应用的控制仪表较少。
随着我国经济的发展及加入WTO,我国政府及企业对此都非常重视,对相关企业资源进行了重组,相继建立了一些国家、企业的研发中心,开展创新性研究,使我国仪表工业得到了迅速的发展。
[关键字]AT89C52、DS28B20温度传感器目录正文 (1)1 设计目的及意义 (1)1.1 设计意义 (1)1.2设计目的 (1)2 目标与总体方案 (1)2.1设计目标 (1)2.2设计总体方案 (2)3 设计方法与内容 (2)3.1 系统组成 (2)3.2 AT89C52简介 (3)3.3 DS18B20温度传感器简介 (7)4 程序流程设计 (12)4.1 主程序 (12)4.2 DS18B20 复位子程序 (13)4.3 读温度子程序 (13)4.4 写DS18B20命令子程序 (14)4.5 数据处理子程序 (14)结论 (15)参考文献 (15)附录一 (16)附录二 (19)正文1 设计目的及意义1.1 设计意义随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。
DS18B20温度计完整单片机程序(汇编语言)
end
sjmp dis1
dis :
movc a,@a+dptr
CLR P2.2
clr P2.1 ;低位灭
mov p0,a
call delay3
dis1:
mov a,b
movc a,@a+dptr
setb P2.2
clr P2.1 ;高位灭
mov p0,a
call delay3
djnz r1,write_bit
ret
;*****************************************
;读一个字节(内容放在在A中)
read_byte:
mov r2,#8
read_bit:
clr p1.7
nop
nop
nop
nop
setb p1.7 ;释放总线的目的是为了读18b20发出的数据,低电平是不能读的。
sjmp f1
f:clr 20h.0 ;初始化失败置0
f1:
ret
;*****************************************
;写一个字节(内容在A中)
write_byte:
mov r1,#8
;写一位
write_bit:
rrc a ;先写低位
clr 20h.0
mov a, #0cch ;跳过序列号
call write_byte
mov a,#0BEH ;送入读内部ram命令
call write_byte
call read_byte
mov r6,a
call read_byte
小明汇编语言版数字温度控制源程序
数字温度控制源程序TEMP_ZH EQU 24H ;实测温度存放单元TEMPL EQU 25HTEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU 28H ;低温报警值存放单元TEMPHC EQU 29H ;正负温度值标记TEMPLC EQU 2AHTAMPFC EQU 2BHK1 EQU P1.4 ;查询按键K2 EQU P1.5 ;设置/调整按键K3 EQU P1.6 ;调整键K4 EQU P1.7 ;确定键BEEP EQU P3.7 ;蜂鸣器RELAY EQU P1.3 ;指示灯LCD_X EQU 2FH ;LCD字符显示位置LCD_RS EQU P2.0 ;LCD寄存器选择信号LCD_RW EQU P2.1 ;LCD读写信号LCD_EN EQU P2.3 ;LCD允许信号FLAG1 EQU 20H.1 ;DS18B20是否存在标志KEY_UD EQU 20H.1 ;设定按键的增减标志DQ EQU P3.3 ;DS18B20数据信号ORG 0000HLJMP MAINORG 0030HMAIN: MOV SP,#60H ;堆栈指针MOV A,#00HMOV R0,#20H ;将20H—2FH单元清零MOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARLCALL SET_LCDLCALL RE_18B20START: LCALL RSTJNB FLAG1,START1 ;DS18B20不存在LCALL MENU_OK ;DS18B20存在MOV TEMP_TH,#055H ;设置TH初值为85°CMOV, TEMP_TL ,#019H ;设置TL初值为25°CLCALL RE_18B20A ;调用暂存器操作子程序LCALL WRITE_E2 ;写入DS18B20LCALL TEMP_BJ ;显示温度标记JMP START2START1: LCALL MENU_ERROR ;调用显示出错子程序LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST ;调用DS18B20复位子程序JNB FLAG1 START1 ; DS18B20不存在MOV A,#0CCH ;跳过ROM匹配命令LCALL WRITEMOV A,#44H ;温度转换命令LCALL WRITELCALL RSTMOV A,#0CCH ;跳过ROM匹配命令LCALL WRITEMOV A,#0BEH ;读温度命令LCALL WRITELCALL READ ;调用DS18B20数据读取操作子程序LCALL CONVTEMP ;调用温度数据BCD码处理子程序LCALL DISPBCD ;调用温度处理显示子程序LCALL CONV ;调用LCD显示处理子程序LCALL TEMP_COMP ;调用实测温度值与温度值比较子程序LCALL PROC_KEY ;调用键扫描子程序SJMP START2;****************键扫描子程序***********************PROC_KEY:JB K1, PROC_K1LCALL BEEP_BLJNB K1,$MOV DPTR ,#M_ALAX1MOV A ,#1LCALL LCD_PRINTLCALL LOOK_ALARMJB K3 ,$LCALL BEEP_BLJMP PROC_K2PROC_K1:JB K2, PROC_ENDLCALL BEEP_BLJNB K2,$MOV DPTR ,#RST_A1MOV A ,#1LCALL LCD_PRINTLCALL SET_ALARMLCALL BE_18B20 ;将设定的TH、TL值写入DS18B20LCALL WRITE_E2PROC_K2:LCALL MENU_OKLCALL TEMP_BJPROC_END: RET;****************设定温度的报警值TH、TL*********************** SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWN标记AS00: JB 20H.1,ASZ01 ;20H.1=1增加JMP ASJ01 ;20H.1=0减少ASZ01: JB K2 ,ASZ02 ;TH值调整(增加)LCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值增加LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#09,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02 ;TH值调整(减少)LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ01JMP ASJ022ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB “SET ALERT CODE” ,0;**********实测温度值与设定温度的报警值比较子程序*********** TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH;减数>被减数,则JC CHULI1 ;借位标志C=1,转MOV A,TEMPFCCJNE A,#0BH,COMPSJMP CHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志C=1,转MOV DPTR,BJ5LCALL TEMP_BJ3CLR DELAY ;点亮指示灯RETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETTEMP_BJ3:MOV A,#0CEHLCALL WCOMMOV R1 ,#0MOV R0 ,#2BBJJ3: MOV A,R1MOVC A,@+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB “>H”BJ4: DB “<L”BJ5: BD “ !”;**********显示温度标记子程序子程序*********** TEMP_BJ:MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1 ;指针指到显示消息MOV R1 ,#0MOV R0 ,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H, “C”;**********显示正确信息子程序子程序*********** MENU_OK:MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2LCALL LCD_PRINTRETM_OK1: DB “DS18B20 OK ”,0M_OK2: DB “ TEMP: ”,0;**********显示出错信息子程序子程序***********MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,# 1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息MOV A,# 2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB “DS18B20 OK ”,0M_OK2: DB “ TEMP: ---- ”,0;**********DS18B20复位子程序***********RST: SETB DQNOPCLR DQMOV R0 ,#6BH ;主机发出延时复位低脉冲MOV R1 ,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1 TSR1SETB DQ ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3 ;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ;延时TSR3: SETB FLAG1 ;置1标志位,表示DS18B20存在JMP TSR5TSR4: CLR FLAG1 ;清0标志位,表示DS10B20不存在JMP TSR7TSR5: MOV R0 ,#06BHTSR6: DJNZ R0,$ ;时序要求延时一段时间TSR7: SETB DQRET;**********DS18B20暂存器操作子程序***********RE_18B20:JB FLAG1 , RE_18B20ARETRE_18B20A:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH ;写暂存器LCALL WRITEMOV A ,TEMP_TH ;TH报警上限LCALL WRITEMOV A,TEMP_TL ;TL报警上限LCALL WRITEMOV A ,#7FH ;12位精度LCALL WRITERET;**********复制暂存器操作子程序***********WRITE_E2:LCALL RSTMOV A ,#0CCH ;跳过ROM匹配LCALL WRITEMOV A ,#48H ;把报警器里温度报警值复制到EEROMLCALL WRITERET;**********重读EEROM子程序***********READ_E2:LCALL RSTMOV A ,#0CCH ;跳过ROM匹配LCALL WRITEMOV A ,#0B8H ; 把EEROM里温度报警值复制到暂存器LCALL WRITERET;**********将自定义的字符写入LCD的CGRAM中*********** STORE_DATA:MOV A ,#40HLCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA: M OV A ,R3MOVC A ,@A+DPTRLCALL WDATA ;写入数据INC R3DJNZ R2,S_DA TARETD_TADA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H;**********DS18B20数据写入操作子程序***********WRITE: MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ ;开始写入DS18B20总线要处于复位低状态MOV R3,#07HDJNZ R3,$ ;总线复位保持16us以上RRC A ;把一个字节DATA分成8个BIT环移给CMOV DQ,C ;写入下一位MOV R3,#3CHDJNZ R3,$ ;等待200usSETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;**********DS18B20数据读取操作子程序***********READ: MOV R4 #4 ;将温度低位高位TH、TL从DS18B20读出MOV R1,#TEMPL ;存入25H,26H,27H,28H单元RE00: MOV R2,#8RE01:CLR CYSETB DQNOPNOPCLR DQ ;读前总线保持为低NOPNOPNOPSETB DQ ;开始读总线释放MOV R3,#09 ;延时18usDJNZ R3,$MOV C,DQ ;从DS18B20总线读得一位MOV R3,#3CHDJNZ R3,$ ;等待100usRRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读取下一位MOV @R1,AINC R1DJNZ R4,RE00RET;**********温度值BCD码处理子程序*********** CONVTEMP:MOV A,TEMPH ;判断温度是否为0下ANL A,#08HJZ TEMPC1 ;温度为零上则跳转CLR CMOV A TEMPL ;二进制数求补(双字节)CPL A ;取反+1ADD A,#01HMOV TEMPL,AMOV A ,TEMPHCPL AADDC A, #00HMOV TEMPH ,AMOV TEMPHC ,#0BH ;负温度标志MOV TEMPFC ,#0BHSJMP TEMPC11TEMPC1:MOV TEMPHC ,#0AH ;正温度标志MOV TEMPFC ,#0AHTEMPC11: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 ,#0F0H ;取出高四位ANL A,#0FHSWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位SWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH ,ALCALL 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,R4JZ TEM PC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI=百位数部BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMP12:RET;**********二-十进制转换子程序***********HEX2BCD1:MOV B ,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABS WAP A,BRETDEMPDOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04H ;小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H,;**********查询温度报警子程序***********LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行LCALL LCD_PRINTMOV A,#0C6HLCALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV LCD_X,#3 ;设置显示位置LCALL SHOW_DIG2H ;显示数据MOV A ,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置显示位置LCALL SHOW_DIG2L ;显示数据RETM_ALAX1: DB “LOOK ALERT CODE”,0M_ALAX2: DB “TH: TL: ”,0TEMP_BJ1:LCALL WCOMMOV DPTR ,#BJ2 ;指针指到显示信息区MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ2RETBJ2: DB 00H, “C”;**********LCD显示子程序***********SHOW_DIG2H:MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L:MOV B,#100DIV ABXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;**********显示区BCD码温度值刷新子程序***********DISPBCD:MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A ,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A ,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位DISPBCD2: RET;**********LCD显示数据处理子程序*********** CONV: MOV A,73H ;加载百位数据MOV LCD_X ,#6 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#“-”;“—”号显示JMP CONV111CONV11:MOV A,#“”;“+”不显示CONV111:MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2 ;显示数据CONV3: INC LCD_XMOV A,72H ;十位LCALL SHOW_DIG2INC LCD_XMOV A,71H ;个位LCALL SHOW_DIGINC LCD_XMOV A,#“.”MOV B ,LCD_XLCALL LCDP2MOV A,70H ;加载小数点位INC LCD_X ;设置显示位置LCALL SHOW_DIG2 ;显示数据RET;**********第二行显示数字子程序*********** SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET;**********第二行显示子程序***********LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD第二行的地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;**********对LCD做初始化设置及测试***********SET_LCD:CLR LCD_ENLCALL INIT_LCD ;初始化LCDLCALL STORE_DA TA ;将自定义的字符存入LCD的CGROMRET;**********LCD初始化***********INIT_LCD:MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁LCALL WCOMLCALL DELAY1MOV A,#01H ;清除LCD显示屏LCALL WCOMLCALL DELAY1RET;**********清除LCD第一行字符***********CLR_LINE1:MOV A,#08H ;设置LCD第一行地址LCALL WCOMMOV R0 ,#24 ;设置计数值C1: MOV A,#‘’;载入空格到LCDLCALL WDATA ;输入字符到LCDDJNZ R0 ,C1 ;计数结束RET;********** LCD第一行或第二行显示字符***********LCD_PRINT:CJNE A,#1,LINE2LINE1: MOV A,#08H ;设置LCD第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD第二行地址LCALL WCOM ;写入命令FILL: CLR A ;填入字符MOVC A, @A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1:LCALL WDATA ;写入数据INC DPTR ;指针加入JMP FILL ;继续填入字符RET;**********清除一行LCD字符***********CLR_LINE:MOV R0 ,#24CL1:MOV A,#‘’LCALL WDATADJNZ R0 ,CL1RETDE: MOV R7,#250DJNZ R7,$RET;**********LCD间接控制方式命令写入*********** WCOM: MOV P0 ,ACLR LCD_RSCLR LCD_RWSETB LCD_ENLCALL DELAY1CLR LCD_ENRET;**********LCD间接控制方式数据写入*********** WDATA: MOV P0,ASETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENLCALL DERET;**********在LCD第一行显示字符***********LCDP1: PUSH ACCMOV A,BADD A,#80HLCALL WCOMPOP ACCLCALL WDATARET;**********声光报警子程序***********BEEP_BL:MOV R6,#100BL2:LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10LCALL,DELAYRETREX1: MOV R7,#180DE2:NOPDJNZ R7,DE2RET;**********延时子程序*********** DELAY: MOV R6,#50DL1:MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R7,DELAYRETDELAY1: MOV R6,#25 ;延时5ms DL2:MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND。
数字温度计源程序(使用89C2051控制)
程序源代码;***数字温度计源程序(使用89C2051控制)***dq bit p3.0f1820 bit 38h ;18B20标记dspctrl1 bit p3.1 ;显示控制信号1dspctrl2 bit p3.2dspctrl3 bit p3.3TMP DATA 24HTMP_B DATA 25HDBUF1 DATA 41HDBUF2 DATA 42HDBUF3 DATA 43HBUF DATA 45H ;缓冲区ORG 0000HLJMP MAINORG 0100HMAIN: MOV SP,#60HMOV TMP,#0MOV TMP_B,#0MOV DBUF1,#0 ;显示初始值(0000)MOV DBUF2,#0MOV DBUF3,#0CLR F1820GET_TMP: SETB DQLCALL RST1820JB F1820,NEXTAGAIN: MOV DBUF1,#5MOV DBUF2,#5MOV DBUF3,#5LCALL DISPLAY ;2秒内显示555SJMP GET_TMPNEXT: MOV A,#0CCHLCALL WR1820MOV A,#44H ;温度转换LCALL WR1820LCALL DISPLAY ;显示温度2秒,等待转换LCALL RST1820MOV A,#0CCHLCALL WR1820MOV A,#0BEH ;写命令LCALL WR1820LCALL RD1820 ;读18B20低8位至TMPMOV A,TMPANL A,#0F0H ;取TMP高4位至TMP_BMOV TMP_B,ALCALL RD1820 ;读出温度的高8位至TMP MOV A,TMPANL A,#0FHORL A,TMP_BRR A ;向右循环,移动4次RR ARR ARR A .MOV B,#10DIV ABMOV DBUF1,#0MOV DBUF2,AMOV DBUF3,BLJMP GET_TMP;********子程序********;*****复位子程序*****RST1820: SETB DQNOP ;用于程序的延时CLR DQ ;DQ=0MOV R0,#5 ;延时500usDL Y: MOV R1,#50DJNZ R1,$DJNZ R0,DL YSETB DQ ;DQ=1NOPNOPNOPNOPMOV R0,#35RS2: JNB DQ,RS3 ;等待18B20信号,RQ=0则执行RS3 DJNZ R0,RS2CLR F1820 ;70us后,若DQ=1,则F1820=0AJMP RS4RS3: SETB F1820 ;置“1”F18B20MOV R0,#250 ;延时500usDJNZ R0,$RS4: SETB DQRET;*****写子程序*****WR1820: MOV R2,#8 ;写8位WR1: CLR DQMOV R3,#6 ;延时12usDJNZ R3,$RRC AMOV DQ,CMOV R3,#24 ;延时48usDJNZ R3,$SETB DQNOP ;延时2usNOPDJNZ R2,WR1 ;写下一位SETB DQRET;*****读子程序*****RD1820: MOV R2,#8 ;读取8位RD1: CLR CSETB DQNOPNOPCLR DQNOPMOV R3,#6SETB DQDJNZ R3,$ ;延时12usMOV C,DQ ;读出1位至CPURRC AMOV R4,#40 ;80us后总线空闲DJNZ R4,$DJNZ R2,RD1 ;若R2>0读下一位MOV TMP,A ;将温度值从A传送到TMPSETB DQRET;***** 显示子程序*****DISPLAY: MOV R4,#5LOOP1: MOV R5,#60LOOP2: MOV DPTR,#TABMOV A,DBUF2MOVC A,@A+DPTRMOV P1,A ;显示十位数字SETB DSPCTRL1CLR DSPCTRL2SETB DSPCTRL3ACALL D1MSMOV A,DBUF3MOVC A,@A+DPTRMOV P1,A ;显示一位数字SETB DSPCTRL1SETB DSPCTRL2CLR DSPCTRL3ACALL D1MSMOV A,#0MOVC A,@A+DPTRMOV P1,ACLR DSPCTRL1SETB DSPCTRL2SETB DSPCTRL3ACALL D1MSDJNZ R5,LOOP2 ;循环DJNZ R4,LOOP1RET;***** 延时1ms子程序*****D1MS: MOV R7, #50 ;12M时钟下延时1MS DELAY0: MOV R6, #10DELAY1: DJNZ R6, DELAY1DJNZ R7, DELAY0RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;(0-9)共阳段码表END。
数字温度计原程序.pdf
ACALL RE_CONFIG ACALL GET_TEMPER ACALL TEMPER_COV RET ; ***************************************** ;DS18B20 初始化程序 ; ***************************************** INIT_1820: SETB P2.0 NOP CLR P2.0 MOV R0,#06BH MOV R1,#03H TSR1: DJNZ R0,TSR1 ; 延时 MOV R0,#6BH DJNZ R1,TSR1 SETB P2.0 NOP NOP NOP MOV R0,#25H TSR2: JNB P2.0,TSR3 DJNZ R0,TSR2 LJMP TSR4 ; 延时 TSR3: SETB 20H.1 ; 置标志位,表示 DS1820 存在 LJMP TSR5 TSR4: CLR 20H.1 ; 清标志位,表示 DS1820 不存在
LCAL; 将读出的温度数据保存 RET
; ***************************************** ; 写 DS18B20 的程序 ; ***************************************** WRITE_1820:
MOV R2,#8 CLR C WR1:CLR P2.0 NOP NOP NOP NOP RRC A MOV P2.0,C MOV R3,#35 DJNZ R3,$ SETB P2.0 NOP
数字温度汇编程序
数字温度汇编程序数字温度汇编程序是一种用于将温度值从摄氏度转换为华氏度或其他温度单位的程序。
这个程序可以通过输入一个摄氏度的数值,然后计算并输出对应的华氏度值。
为了编写数字温度汇编程序,我们可以按照以下步骤进行: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架构)。
数字温度计—单片机课设(真实的汇编程序和proteus仿真)
微机原理课程设计报告温度计姓名: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开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示。
它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
51单片机设计数字温度计(流程图+源码+实物图片)
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。
DS18B20初始化程序流程图DS18B20读字节程序流程图DS18B20写字节程序流程图DS18B20获取温度程序流程图图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示。
N图按键程序流程图附1 源程序代码/********************************************************************* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
* 编程者:ZPZ* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫描函数get_temperature(0); //获取温度函数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’关闭报警)。
数字温度汇编程序
数字温度汇编程序数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。
它可以将从传感器或其他温度测量设备获取的模拟信号转换为数字信号,以便计算机可以对其进行处理和分析。
本文将详细介绍数字温度汇编程序的原理、功能和实现方法。
一、原理数字温度汇编程序的核心原理是将模拟温度信号转换为数字形式。
这个过程通常涉及到模数转换(ADC)技术。
传感器测量到的温度信号是模拟信号,需要经过ADC转换为数字信号,才能被计算机处理。
ADC将连续的模拟信号转换为离散的数字信号,通过对模拟信号进行采样和量化来实现。
二、功能1. 温度测量:数字温度汇编程序可以准确测量温度,并将其转换为数字形式。
通过传感器获取温度信号,程序可以将其转换为计算机可以理解和处理的数字信号。
2. 数据处理:数字温度汇编程序可以对测量到的温度数据进行处理和分析。
它可以实现温度数据的存储、计算、统计和显示等功能。
通过对温度数据的处理,可以得出温度的变化趋势、平均值、最大值、最小值等信息。
3. 报警功能:数字温度汇编程序可以设置温度报警功能。
当温度超过或低于设定的阈值时,程序可以触发报警,通知用户或其他系统进行相应的处理。
4. 数据通信:数字温度汇编程序可以通过串口、网络或其他通信方式将温度数据传输给其他设备或系统。
这样,其他设备或系统可以实时监测和接收温度数据,进行进一步的处理和分析。
三、实现方法1. 硬件准备:实现数字温度汇编程序需要一些基本的硬件设备,包括温度传感器、模数转换器、微控制器或单片机等。
温度传感器用于测量温度,模数转换器用于将模拟信号转换为数字信号,微控制器或单片机用于控制和处理温度数据。
2. 程序编写:使用汇编语言编写数字温度汇编程序。
程序需要包括温度测量、数据处理、报警和数据通信等功能的实现。
编写程序时需要考虑温度传感器的特性和模数转换器的工作原理,以确保数据的准确性和稳定性。
3. 硬件连接:将温度传感器和模数转换器连接到微控制器或单片机上。
数字温度计仿真图+源程序
源程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intucharyear,mon,day,xinqi;ucharsecond,minute,hour;ucharReadValue;uchardown,count;uchar flag; // 加减标志位char newsec,newmin,newhour; //重写数据用的秒,分,时char newyear,newmon,newday,newxinqi;uchar q;//---------------------ucharbai,shi,ge,fen,miao;#define t_cont 0.0625#define conever 0x44#define config 0x5f#define read 0xbe#define write 0x4e#define jmp 0xcc#define copy 0x48#define recall 0xb8sbitfmq=P2^3;sbitrs = P2^0;sbitrw = P2^1;sbit e = P2^2;sbit K1=P3^4;sbit K2=P3^5;sbit K3=P3^6;sbit K4=P3^7;sbit DATA=P1^0; //位定义1302芯片的接口sbit SCLK=P1^1; //位定义1302芯片的接口sbit RST =P1^4; //位定义1302芯片的接口bit t_sign;bit flag1;sbit a=ACC^0;sbitdq=P1^5;float temp=0;//----------------------------------------//函数声明//----------------------------------------void delayus(uint n);void delayms(uint k);void mingling(uchar com);void Write1302(uchardat);uchar Read1302(void);void WriteSet1302(ucharCmd,uchardat);uchar ReadSet1302(ucharCmd);void Int1302(void);void readtime(void);void display(void);void Setdisplay(void);void menu(void);void inmenu(void);void max();void min();void funcinc();void turn_sub(ucharnewval,ucharnewaddr); void scanquit();void funcquit();//--------------------------------------------------------//函数功能:us延时//-------------------------------------------------------- void delayus(uint n){uchar i;for(i=0;i<n;i++);}void delayms(uint k){uchar i;for(i=0;i<k;i++)delayus(100);}void delaya(uint m){while(m--);}void init_1820(){uchar i=1;while(flag1==0){dq=1;delaya(8);dq=0;delaya(52);dq=1;delaya(2);while(1){i=dq;if(i==0){flag1=1;delaya(10);break;}}}flag1=0;}/*************向1820发送字节************/ void byte_1820(uchardat){uchar i=0;for(i=0;i<8;i++){dq=0;ACC=dat&0x01;dq=a;delaya(5);dq=1;dat>>=1;}}/**************读1820的数据*************/ uchar read_1820(void){uchari,indat;indat=0;for(i=0;i<8;i++){dq=0;indat>>=1;dq=1;if(dq) indat|=0x80;delaya(4);}return(indat);}/************获取TEM*****************/ void readtem(){uint y;uchar td=0;uchartg=0;uchar k;init_1820();byte_1820(jmp);byte_1820(conever);init_1820();byte_1820(jmp);byte_1820(read);td=read_1820();tg=read_1820();k=tg&0x08;if(k==0x08){t_sign=1;tg=tg&0x07;temp=(tg*256+td)*t_cont;temp=(-temp*100+52800);}else {t_sign=0;tg=tg&0x07;temp=(tg*256+td)*t_cont;temp=temp*100;}bai=(uint)temp/10000;y=(uint)temp%10000;shi=y/1000;y=(uint)y%1000;ge=y/100;y=(uint)y%100;fen=y/10;miao=(uint)y%10;}//----------------------------------------------------------------------//函数功能:向1302写一个字节数据//----------------------------------------------------------------------void Write1302(uchardat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备delayus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delayus(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delayus(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位}}//-----------------------------------------------------------------------//函数功能:从1302读一个字节数据//-----------------------------------------------------------------------uchar Read1302(void){uchari,dat;delayus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delayus(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delayus(2); //稍微等待}return dat; //将读出的数据返回}//-----------------------------------------------------------------------//函数功能:根据命令字,向1302写一个字节数据//-----------------------------------------------------------------------void WriteSet1302(ucharCmd,uchardat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delayus(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}//----------------------------------------------------------------------//函数功能:根据命令字,从1302读取一个字节数据//----------------------------------------------------------------------uchar ReadSet1302(ucharCmd){uchardat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}//----------------------------------------------------------------------//读取1302内部时间到second,minute,hour;//----------------------------------------------------------------------void readtime(void){ReadValue = ReadSet1302(0x81); //从秒寄存器读数据second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x83); //从分寄存器读minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x85); //从分寄存器读hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x87); //从分寄存器读day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89); //从分寄存器读mon=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d); //从分寄存器读year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8b); //从分寄存器读xinqi=(ReadValue&0x0F);}//--------------------------------------------------------------------------------//DS1302的充电设置//--------------------------------------------------------------------------------void Int1302(void){second=ReadSet1302(0x81);second=((second&0x70)>>4)*10+(second&0x0f);WriteSet1302(0x8e,0x00); //允许写入1302WriteSet1302(0x90,0xa9); //打开充电二极管WriteSet1302(0x80,(((second&0x7f)/10)<<4)|(second%10)); //保存当前秒并允许ds1302工作WriteSet1302(0x8e,0x10); //禁止写入1302}//----------------------------------------------------//调时菜单进入//----------------------------------------------------void menu(void){if(!K1){delayms(1);if(!K1){down=1;while(K1!=1); //等待按键松开,如果按键不松,while条件成立进行空的死循环count++; //记录menu按下的次数if(count>7)count=1;WriteSet1302(0x8e,0x00); //允许写入1302second=ReadSet1302(0x81);WriteSet1302(0x80,0x80|second); //按下menu键后禁止ds1302工作,把秒写回1302WriteSet1302(0x8e,0x10); //禁止写入1302}}}//----------------------------------------------------------------------//进入菜单,调时程序//----------------------------------------------------------------------void inmenu(void){switch(count){case 1:{max();min();mingling(0xc7);mingling(0x0f);//开显示显示光标scanquit();}break;case 2:{max();min();mingling(0xc4);mingling(0x0f);//开显示显示光标scanquit();}break;case 3:{max();min();mingling(0xc1);mingling(0x0f);//开显示显示光标scanquit();}break;case 4:{max();min();mingling(0x89);mingling(0x0f);//开显示显示光标scanquit();}break;case 5:{max();min();mingling(0x86);mingling(0x0f);//开显示显示光标scanquit();}break;case 6:{max();min();mingling(0x83);mingling(0x0f);//开显示显示光标scanquit();}break;case 7:{max();min();mingling(0x8d);mingling(0x0f);//开显示显示光标scanquit();}break;default:break;}}//---------------------------------------------------//---------------------------------------------------void max() //判断加{if(!K2){delayms(1);if(!K2)while(!K2);flag=1;funcinc();}}void min() //判断减{if(!K3){delayms(1);if(!K3)while(!K3);flag=0;funcinc();}}//----------------------------------------------------void funcinc(){switch(count){case 1:turn_sub(newsec,0x81);second=ReadSet1302(0x81);WriteSet1302(0x80,0x80|second);break;case 2:turn_sub(newmin,0x83);break;case 3:turn_sub(newhour,0x85);break;case 4:turn_sub(newday,0x87);break;case 5:turn_sub(newmon,0x89);break;case 6:turn_sub(newyear,0x8d);break;case 7:turn_sub(newxinqi,0x8b);break;default: break;}}//--------------------------------------------------------------- void turn_sub(ucharnewval,ucharnewaddr){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制if(flag==1)newval++;else newval--;switch(count){case 1: if(newval>59) newval=0;break;case 2: if(newval>59) newval=0;break;case 3: if(newval>23) newval=0;break;case 4: if(newval>31) newval=0;break;case 5: if(newval>12) newval=0;break;case 6: if(newval>99) newval=0;break;case 7: if(newval>6) newval=0;break;default:break;}WriteSet1302(0x8e,0x00); //允许写入1302WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器WriteSet1302(0x8e,0x10); //禁止写入1302display(); //将修改后的值显示出来}//-----------------------------------------------------//-----------------------------------------------------void scanquit(){if(!K4){mingling(0x0c);delayms(1);if(!K4)while(!K4);funcquit();}}void funcquit(){mingling(0x0c);count=0;down=0;second=ReadSet1302(0x81);second=((second&0x70)>>4)*10+(second&0x0f);WriteSet1302(0x8e,0x00);WriteSet1302(0x80,(((second&0x7f)/10)<<4)|(second%10)); //保存当前秒并允许ds1302工作WriteSet1302(0x8e,0x10);}//---------------------------------------------------------------------- //显示程序//---------------------------------------------------------------------- //////////////命令/////////////////////void delay(uint m){uinti,j;for(i=0;i<m;i++)for(j=0;j<570;j++);}bit lcd_bz(){bit result;rs=0;rw=1;e=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);e=0;return(result);}void mingling(uchar com){while(lcd_bz());rs=0;e=0;rw=0;P0=com;e=1;e=0;delay(1);}void lcd_pos(ucharpos){mingling(pos);}//////////////数据/////////////////////void shuju(ucharshu){rs=1;rw=0;e=0;P0=shu;e=1;e=0;delay(1);}////////////初始化//////////////////////void init_1602(void){mingling(0X38);//功能设置delay(1);mingling(0X0c);//显示开关控制delay(1);mingling(0X06);//输入方式设置delay(1);mingling(0X01);//清显示delay(1);}//////////////显示//////////////////void date(void){switch(xinqi){case 0: shuju('S');shuju('u');shuju('n');break;case 1: shuju('M');shuju('o');shuju('n');break;case 2: shuju('T');shuju('u');shuju('e');break;case 3: shuju('W');shuju('e');shuju('d');break;case 4: shuju('T');shuju('h');shuju('u');break;case 5: shuju('F');shuju('r');shuju('i');break;case 6: shuju('S');shuju('a');shuju('t');break;default:break;}}void display(void){readtem();readtime();while(lcd_bz());delay(100);lcd_pos(0x80);shuju('2');shuju('0');shuju(year/10+0x30);lcd_pos(0x83);shuju(year%10+0x30);shuju('/');shuju(mon/10+0x30);shuju(mon%10+0x30);shuju('/'); shuju(day/10+0x30);shuju(day%10+0x30);lcd_pos(0xc0);shuju(hour/10+0x30);shuju(hour%10+0x30);shuju(':'); shuju(minute/10+0x30);shuju(minute%10+0x30);shuju(':'); shuju(second/10+0x30);shuju(second%10+0x30);lcd_pos(0x8c);date();lcd_pos(0xc8);if(t_sign==1){shuju(0x2d);delaya(10);if(bai!=0)shuju(0x20);shuju(shi+0x30);shuju(ge+0x30);shuju(0x2e);shuju(fen+0x30);shuju(miao+0x30);shuju(0xdf);shuju(0x43);}else{shuju(0x20);delaya(10);if(bai!=0)shuju(bai+0x30);else shuju(0x20);shuju(shi+0x30);shuju(ge+0x30);shuju(0x2e);shuju(fen+0x30);shuju(miao+0x30);shuju(0xdf);shuju(0x43);}/********/if((shi>=3&&ge>=3)||(shi<=2&&ge<=9)){fmq=0;}if((shi<=3&&ge<3)||(shi>=2&&ge>9))fmq=1;}//---------------------------------------------------------------------- //函数功能:主函数//---------------------------------------------------------------------- void main(void){Int1302();init_1602();init_1820();down=0;count=0;while(1){menu(); //检测是否调时if(down==1){inmenu(); //进入调时模式}else{while(lcd_bz());display();}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;================================================================ ;DS18B20温度计;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃;用AT89C51单片机,12MHz晶振;DS1302时钟芯片实现日历年月日时分秒的显示;============================常数定义============================= TIMEL EQU 0E0H ;20ms,定时器0时间常数TIMEH EQU 0B1HSECOND EQU 30HMINUTE EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPHEAD EQU 38HTEMP_UPPER EQU 2AHTEMP_LOWER EQU 2BH;==========================工作内存定义============================ BITST DATA 20HTIME1SOK BIT BITST.1TEMPL DATA 26HTEMPH DATA 27HTEMPHC DATA 28HTEMPLC DATA 29H;============================= 引脚定义=========================== TEMPDIN B IT P3.7ALARMDIN BIT P1.6RST BIT P1.2CLK BIT P1.1IO BIT P1.0;============================= 中断向量区========================= ORG 0000HLJMP STARTORG 000BHLJMP T0IT;=============================系统初始化========================== ORG 0100HSTART: MOV SP,#60HCLSMEM: MOV R0,#20HMOV R1,#60HCLSMEM1: MOV @R0,#00HINC R0DJNZ R1,CLSMEM1MOV TMOD,#00010001B ;定时器0工作方式1(16BIT)MOV TH0,#TIMEHMOV TL0,#TIMEL ;20msMOV SECOND,#00HMOV MINUTE,#00HMOV HOUR,#14HMOV DAY,#17HMOV MONTH,#01HMOV WEEK,#01HMOV YEAR,#13HMOV TEMP_UPPER,#0AHMOV TEMP_LOWER,#8AHSETB ET0SETB EAMOV PSW,#00H;================================================================= ;============================= 主程序============================= ;=================================================================LCALL SETDS1302START1: LCALL R EAD_TEMP ;读出温度值子程序LCALL CONVTEMP ;温度BCD码计算处理子程序LCALL REFBCD ;显示区BCD码温度值刷新子程序LCALL GETDS1302SETB TR0LCALL ALARM_JUDGEJNB F0,MAINLCALL ALARM_BEEPMAIN: LCALL DISP_TEMP ;调用显示子程序LCALL DISPLAY_TIMEJNB TIME1SOK,MAINCLR TIME1SOK ;测温每1s一次MAIN1: LCALL DISP_TEMP ;调用显示子程序LCALL DISPLAY_DA TEJNB TIME1SOK,MAIN1CLR TIME1SOK ;测温每1s一次LJMP START1;====================== 定时器0中断服务程序=======================T0IT: PUSH PSWMOV PSW,#10HMOV TH0,#TIMEHMOV TL0,#TIMELINC R7CJNE R7,#50,T0IT1MOV R7,#00HSETB TIME1SOK ;1s定时到标志T0IT1: POP PSWRETI;================================================================= ;============================= 子程序区=========================== ;=================================================================;=============================初始化DS18B20======================= INITDS1820:SETB TEMPDINNOPNOPCLR TEMPDINMOV R6,#0A0HDJNZ R6,$MOV R6,#0A0HDJNZ R6,$SETB TEMPDINMOV R6,#32HDJNZ R6,$MOV R6,#3CHLOOP1820: MOV C,TEMPDINJC INITDS1820OUTDJNZ R6,LOOP1820MOV R6,#064HDJNZ R6,$SJMP INITDS1820INITDS1820OUT: SETB TEMPDINRET;====== 读DS18B20的程序,从DS18B20中读出一个字节的数据============= READDS1820: MOV R7,#08HSETB TEMPDINNOPNOPREADDS1820LOOP: CLR TEMPDINNOPNOPNOPSETB TEMPDINMOV R6,#07H ;DELAY 15usDJNZ R6,$MOV C,TEMPDINMOV R6,#3CH ;DELAY 120usDJNZ R6,$RRC ASETB TEMPDINDJNZ R7,READDS1820LOOPMOV R6,#3CH ;DELAY 120 usDJNZ R6,$RET;======== 写DS18B20的程序,从DS18B20中写一个字节的数据============= WRITEDS1820: MOV R7,#08HSETB TEMPDINNOPNOPWRITEDS1820LOP: CLR TEMPDINMOV R6,#07H ;DELAY 15usDJNZ R6,$RRC AMOV TEMPDIN,CMOV R6,#34H ;DELAY 104usDJNZ R6,$SETB TEMPDINDJNZ R7,WRITEDS1820LOPRET;========================= READ TEMP =========================== READ_TEMP: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#44HLCALL WRITEDS1820 ;START CONVERSIONMOV R6,#34H ;DELAY 104DJNZ R6,$READTEMP1: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#0BEHLCALL WRITEDS1820 ;SCRATCHPADMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV R5,#09HMOV R0,#TEMPHEADMOV B,#00HREADTEMP2: LCALL READDS1820MOV @R0,AINC R0DJNZ R5,READTEMP2MOV 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,R7JZ TEMPC12ANL A,#0FHSWAP AMOV 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码温度值子程序=============== REFBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,AMOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,AMOV A,TEMPHCANL A,#0FHMOV 72H,AMOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,AMOV A,TEMPHCANL A,#0F0HCJNE A,#010H,REFBCD0SJMP REFBCD2REFBCD0: MOV A,TEMPHCANL A,#0FHJNZ REFBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号REFBCD2: RET;======================= 即时温度显示子程序===============================;显示数据在70H~73H单元内,用4位LED共阳数码管显示,P0口输出段码数据,;P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。