740 likes | 902 Views
项目 13 数字温度计的设计. ★ 知识目标 : 1. 掌握独立式键盘的编程方法。 2. 掌握单片机定时器的编程方法。 3. 熟练运用 C 语言程序中的数组、指针、字符串等知识。 ★ 能力目标 : 1. 培养学生系统的熟悉单片机 C 语言体系内容,熟悉程序设计方法和开发流程。 2. 培养学生具有综合运用所学的理论知识去解决实际问题的能力。 3. 培养学生调查研究、查阅技术文献、资料、手册的能力。. 项目 13 数字温度计的设计.
E N D
项目13 数字温度计的设计 ★ 知识目标: 1. 掌握独立式键盘的编程方法。 2. 掌握单片机定时器的编程方法。 3. 熟练运用C语言程序中的数组、指针、字符串等知识。 ★ 能力目标: 1. 培养学生系统的熟悉单片机C语言体系内容,熟悉程序设计方法和开发流程。 2. 培养学生具有综合运用所学的理论知识去解决实际问题的能力。 3. 培养学生调查研究、查阅技术文献、资料、手册的能力。
项目13 数字温度计的设计 • 随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。为此,我们设计一个具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等的数字温度计。
要求: (1)测量并显示温度值, 温度测量误差≤±1℃。 (2)测量范围:0℃~100℃。 (3)交替显示当前测量时间、温度。 (4)可调整显示时间。 (5)测量温度超过设定的温度上、下限,启动蜂鸣器和指示灯报警。 (6)连接多个温度传感器,微控制器能够识别不同的传感器,显示相应的温度值,用于监测多个区域的环境温度 项目13 数字温度计的设计 一、提出任务
项目13 数字温度计的设计 二、分析任务 • 1.系统硬件电路设计 • 根据设计任务的方框图,设计出如图13.1所示的电路原理图,根据电路原理图制作出如图13.2所示的电路板图。在电路原理图中微控制器采用AT89S52单片机,温度传感器采用DS18B20,用LCM1602液晶显示器显示当前时间和温度,用独立式按键来调整时间、设置最高报警温度和最低报警温度,当前温度超出预设的温度范围时用蜂鸣器和发光二极管来作为声光报警提示。单片机的I/O端口分配如表13.1所示。
项目13 数字温度计的设计 表13.1 单片机I/O端口分配表
项目13 数字温度计的设计 图13.1 系统硬件电路原理图
项目13 数字温度计的设计 图13.1 系统硬件电路板图
(1)主程序 图13.2 主程序流程图 主程序主要是对系统进行初始化,包括设置定时器、液晶显示初始化、调用时间显示子程序,根据按键K1还是K2按下来选择是显示1号温度传感器的温度还是2号温度传感器的温度。图13.2是主程序的流程图。 项目13 数字温度计的设计 2.系统软件的设计 图13.2 主程序流程图
项目13 数字温度计的设计 • (2)读取温度子程序 • 读出温度子程序的主要功能是读出RAM中的9个字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图13.3所示。 • (3)时间调整子函数 • 调整时间时,先按下K3进入时间调整状态,此时按下K1则时间的分加一,K2按下则分减一,K4按下则时加一,K5按下则时减一,K6按下则确认退出。时间调整程序流程图如图13.4所示。 • (4)设置报警温度子程序 • 由于有2个温度传感器DS18B20,每一路都要设置最高和最低报警温度。使得设置报警温度子程序比较复杂,其程序流程如图13.5所示。
项目13 数字温度计的设计 图13.3 读出温度流程图 图13.4 时间调整程序流程图
项目13 数字温度计的设计 图13.5 设置报警温度子程序流程图
#include<reg52.h> typedef bit bool; unsigned char bol; typedef unsigned char bl; unsigned char t_1,t_2,t_3,t_4,t_5,t_6; unsigned char th1=20; // 预置1号DS18B20最高报警温度20℃ unsigned char tl1=10; // 预置1号DS18B20最低报警温度10℃ unsigned char th2=21; // 预置2号DS18B20最高报警温度21℃ unsigned char tl2=11; // 预置2号DS18B20最低报警温度11℃ unsigned char tab_1,tab_2,tab_3,tab_4,n=0; unsigned int t,h,m,s; sbit DQ=P3^7; // 接DS18B20 sbit fm=P1^3; //接蜂鸣器 sbit RS=P1^0; //接液晶1602RS端 sbit RW=P1^1; // 接液晶1602RWW端 sbit E=P1^2; // 接液晶1602E端 项目13 数字温度计的设计 3.参考源程序
sbit k1=P3^0; //接按键K1 sbit k2=P3^1; //接按键K2 sbit k3=P3^2; //接按键K3 sbit k4=P3^3; //接按键K4 sbit k5=P3^4; //接按键K2 sbit k6=P3^5; // 接按键K6 bl code tab_lcd[10]={'0','1','2','3','4','5','6','7','8','9'};//显示字符 bl code from[1]={'.'}; bl code from1[1]={" "}; unsigned char data temp_alarm[2]={0x00,0x00};//温度报警值存放处 unsigned char data tab_18b20[2]={0x00,0x00};//高低8位温度存放 unsigned char data dip[3]={0x00,0x00,0x00};//显示位存放 unsigned char code db[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数转表格 项目13 数字温度计的设计 3.参考源程序
unsigned char code Romcode[2][8] = {{0x28,0x66,0x92,0x8c,0x01,0x00,0x00,0x3b}, //18B20的64位ROM(1号传感器ROM) {0x28,0x5c,0xd2,0xb7,0x01,0x00,0x00,0x2c}}; //2号传感器ROM /*******************延时程序*****************************/ void delay_us(unsigned int num) { while( --num ); } /*******************MS级延时子程序***************************/ void delay_ms(int ms) { int i; while(ms--) { for(i=0;i<125;i++) { ; } } } 项目13 数字温度计的设计 3.参考源程序
/***********************蜂鸣器响函数***************************//***********************蜂鸣器响函数***************************/ //用于键盘操作的按键声 void feng () { fm=0;//启动蜂鸣器 delay_ms(20); fm=1;//关闭蜂鸣器 } /**********************液晶忙碌检测函数***************************/ bool manglu ()//LCD忙碌检测 { bool fanhui; RS=0; RW=1; E=1; fanhui=(bool)(P0&0x80);// 提取忙碌标志位D7 E=0; return fanhui; //返回给fanhiu变量 } 项目13 数字温度计的设计 3.参考源程序
/******************液晶写命令函数**********************************//******************液晶写命令函数**********************************/ write (bl wrin)//写入指令 { while(manglu ());//忙碌检测 RS=0; RW=0; E=0; P0=wrin; //写入指令数据 E=1; E=0; } /*********************液晶写字符函数********************************/ date (int dat)//写入字符 { while(manglu ());//忙碌检测 RS=1; RW=0; E=0; P0=dat; //写入字符 E=1; E=0; } 项目13 数字温度计的设计 3.参考源程序
/**********************液晶初始化函数********************************//**********************液晶初始化函数********************************/ init_1602()//初始化1602 { write(0x38); //显示设定(设置成8位数据接口,双行,5*7点阵字符显示) delay_ms(1); write(0x0c); //显示屏设定(设置成开显示,关光标) delay_ms(1); write(0x01); //清屏 delay_ms(1); } /*********************初始化DS18B20函数*******************************/ bit init_18B20 (void) { DQ=1; delay_us(8); DQ=0; delay_us(90); DQ=1; delay_us(8); bol=DQ; //等待应答 delay_us(100); return(bol);//返回给bol } 项目13 数字温度计的设计 3.参考源程序
/****************向DS18B20读字节函数***********************************//****************向DS18B20读字节函数***********************************/ readchar (void) { unsigned char i=0; unsigned char adat=0; for(i=8;i>0;i--) { DQ=0; adat>>=1;//将数据从18B20移出 DQ=1; if(DQ==1) adat|=0x80;//提取移出的数据 delay_us(4); } return adat;//将提取数值返回给adat变量吸收 /*****************向DS18B20写字节函数*******************************/ winchar(unsigned char bdat)//定义写入变量为bdat { unsigned char x=0; for(x=8;x>0;x--) { DQ=0; DQ=bdat&0x01;//取出数据低位 delay_us(5); DQ=1; bdat>>=1;//将数据按位移入18B20 } } 项目13 数字温度计的设计 3.参考源程序
/*******************从DS18B20读取温度函数**************************//*******************从DS18B20读取温度函数**************************/ read_18b20 (unsigned char x) { unsigned char i; init_18B20();//初始化18B20 winchar(0xcc); winchar(0x44);//启动温度转换 init_18B20(); //初始化18B20 winchar(0x55); for(i=0;i<8;i++) { winchar(Romcode[x][i]); } winchar(0xbe);//读取温度寄存器 tab_18b20[0]=readchar();//低8位温度数据存放区 tab_18b20[1]=readchar();//高8位温度数据存放区 } 项目13 数字温度计的设计 3.参考源程序
/**********************温度显示函数********************************//**********************温度显示函数********************************/ void lcd(unsigned char y) { dip[2]=tab_18b20[0]&0x0f;//提取小数部分 dip[0]=db[dip[2]]; //查表得小数位的值 dip[1]=((tab_18b20[0]&0xf0)>>4)|((tab_18b20[1]&0x0f)<<4);//提取整数部分 tab_1=dip[0];//小数位 tab_2=dip[1]%10;//个位 tab_3=dip[1]%100/10;//十位 tab_4=dip[1]/100;//百位 if(y==1) //1号传感器温度显示 { write(0x8b); //液晶显示地址 date('T'); delay_ms(1); write(0x8c); date('H'); delay_ms(1); write(0x8d); date(tab_lcd[(th2/100)]);//百位 delay_ms(1); write(0x8e); date(tab_lcd[(th2%100/10)]);//十位 delay_ms(1); write(0x8f); 项目13 数字温度计的设计 3.参考源程序
date(tab_lcd[(th2%10)]);//个位 delay_ms(1); write(0xc0); date('t'); write(0xc1); date('1'); if(dip[1]/100==0)//百位为0不显示 { write(0xc2); date(from1[0]); //百位 } else { write(0xc2); date(tab_lcd[tab_4]); //百位 } if(dip[1]/100<0) { if(dip[1]/100<0)//百位,十位都为0;则百位,十位都不显示 { write(0xc3); date(from1[0]); delay_ms(1); } } 项目13 数字温度计的设计 3.参考源程序
else { write(0xc3); date(tab_lcd[tab_3]);//十位 delay_ms(1); } write(0xc4); date(tab_lcd[tab_2]);//个位 delay_ms(1); write(0xc5); date(from[0]);//小数点位 write(0xc6); date(tab_lcd[tab_1]);//小数位 delay_ms(1); write(0xc7); date(0xdf);//显示 ° delay_ms(1); write(0xc8); date('C');//显示C delay_ms(1); write(0xcb); date('T'); delay_ms(1); write(0xcc); date('L'); 项目13 数字温度计的设计 3.参考源程序
delay_ms(1); write(0xcd); date(tab_lcd[(tl2/100)]);//百位 delay_ms(1); write(0xce); date(tab_lcd[(tl2%100/10)]);//十位 delay_ms(1); write(0xcf); date(tab_lcd[(tl2%10)]);//个位 delay_ms(1); } else//2号传感器温度显示 { write(0x8b); date('T'); delay_ms(1); write(0x8c); date('H'); delay_ms(1); write(0x8d); date(tab_lcd[(th1/100)]);//百位 delay_ms(1); write(0x8e); date(tab_lcd[(th1%100/10)]);//十位 项目13 数字温度计的设计 3.参考源程序
delay_ms(1); write(0x8f); date(tab_lcd[(th1%10)]);//个位 delay_ms(1); write(0xc0); date('t'); write(0xc1); date('2'); if(dip[1]/100==0)//百位为0不显示 { write(0xc2); date(from1[0]); //百位 } else { write(0xc2); date(tab_lcd[tab_4]); //百位 } if(dip[1]/100<0) { if(dip[1]/100<0)//百位,十位都为0;则百位,十位都不显示 { write(0xc3); date(from1[0]); delay_ms(1); } } else { write(0xc3); date(tab_lcd[tab_3]);//十位 delay_ms(1); } 项目13 数字温度计的设计 3.参考源程序
write(0xc4); date(tab_lcd[tab_2]);//个位 delay_ms(1); write(0xc5); date(from[0]);//小数点位 write(0xc6); date(tab_lcd[tab_1]);//小数位 delay_ms(1); write(0xc7); date(0xdf);//显示 ° delay_ms(1); write(0xc8); date('C');//显示C delay_ms(1); write(0xcb); date('T'); delay_ms(1); write(0xcc); date('L'); delay_ms(1); 项目13 数字温度计的设计 3.参考源程序
write(0xcd); date(tab_lcd[(tl1/100)]);//百位 delay_ms(1); write(0xce); date(tab_lcd[(tl1%100/10)]);//十位 delay_ms(1); write(0xcf); date(tab_lcd[(tl1%10)]);//个位 delay_ms(1); } } /******************报警温度显示函数********************************/ lcd_alarm() { //--T1高温报警显示 write(0x80);//显示地址 date('T'); //显示字符 delay_ms(1);//延时抗干扰 write(0x81); date('H'); delay_ms(1); write(0x82); date('1'); delay_ms(1); write(0x83); 项目13 数字温度计的设计 3.参考源程序
date(':'); delay_ms(1); write(0x84); date(tab_lcd[(th2/100)]);//报警值百位显示 delay_ms(1); write(0x85); date(tab_lcd[th2%100/10]);//报警值十位显示 delay_ms(1); write(0x86); date(tab_lcd[th2%10]); //报警值个位显示 delay_ms(1); //--T1低温报警显示 write(0x89);//显示地址 date('T'); //显示字符 delay_ms(1);//延时抗干扰 write(0x8a); date('L'); delay_ms(1); write(0x8b); date('1'); delay_ms(1); write(0x8c); date(':'); 项目13 数字温度计的设计 3.参考源程序
delay_ms(1); write(0x8d); date(tab_lcd[(tl2/100)]);//报警值百位显示 delay_ms(1); write(0x8e); date(tab_lcd[tl2%100/10]);//报警值十位显示 delay_ms(1); write(0x8f); date(tab_lcd[tl2%10]); //报警值个位显示 delay_ms(1); //--T2高温报警显示 write(0xc0);//显示地址 date('T'); //显示字符 delay_ms(1);//延时抗干扰 write(0xc1); date('H'); delay_ms(1); write(0xc2); date('2'); delay_ms(1); write(0xc3); 项目13 数字温度计的设计 3.参考源程序
date(':'); delay_ms(1); write(0xc4); date(tab_lcd[(th1/100)]);//报警值百位显示 delay_ms(1); write(0xc5); date(tab_lcd[th1%100/10]);//报警值十位显示 delay_ms(1); write(0xc6); date(tab_lcd[th1%10]); //报警值个位显示 delay_ms(1); //--T2低温报警显示 write(0xc9);//显示地址 date('T');//显示字符 delay_ms(1);//延时抗干扰 write(0xca); date('L'); delay_ms(1); write(0xcb); date('2'); delay_ms(1); write(0xcc); 项目13 数字温度计的设计 3.参考源程序
date(':'); delay_ms(1); write(0xcd); date(tab_lcd[(tl1/100)]);//报警值百位显示 delay_ms(1); write(0xce); date(tab_lcd[tl1%100/10]);//报警值十位显示 delay_ms(1); write(0xcf); date(tab_lcd[tl1%10]); //报警值个位显示 delay_ms(1); } /*****************设置报警温度函数***********************************/ void larm() { if(k1==0) { feng();//按键声 while(1) { if(k5==0) 项目13 数字温度计的设计 3.参考源程序
{ th1++; feng(); } else if(k6==0) { th1--; feng(); } lcd_alarm(); delay_ms(20); if (k1==0) { feng(); delay_ms(20); feng(); break; } } } else if(k2==0) { feng(); while(1) { 项目13 数字温度计的设计
if(k5==0) { tl1++; feng(); } else if(k6==0) { tl1--; feng(); } lcd_alarm(); delay_ms(20); if(k2==0) { feng(); delay_ms(20); feng(); break; } } } else if(k5==0) { feng(); while(1) { if(k1==0) { th2++; 项目13 数字温度计的设计
feng(); } else if(k2==0) { th2--; feng(); } lcd_alarm(); delay_ms(20); if(k5==0) { feng(); delay_ms(20); feng(); break; } } } else if(k6==0) { feng(); while(1) { if(k1==0) { tl2++; feng(); } else if(k2==0) { 项目13 数字温度计的设计 3.参考源程序
tl2--; feng(); } lcd_alarm(); delay_ms(20); if(k6==0) { feng(); delay_ms(20); feng(); break; } } } } /*******************温度报警函数*******************************/ write_tempere_alarm() { if(k4==0) { feng(); delay_ms(20); feng(); write(0x01); //清屏 while(1) { larm(); //报警温度值写入 lcd_alarm();//报警显示子函数 if(k4==0) 项目13 数字温度计的设计 3.参考源程序
{ feng(); delay_ms(20); feng(); write(0x01); break; } } } } /*******************时间显示函数**********************************/ void time_display() { write(0x80); date('T'); delay_ms(1); write(0x81); delay_ms(1); date(0x7e); t_1=s%10; //秒个位 t_2=s/10; //秒十位 t_3=m%10;//分个位 t_4=m/10;//分十位 t_5=h%10;//时个位 t_6=h/10;//时十位 write(0x82);//时十位显示地址 项目13 数字温度计的设计 3.参考源程序
date(tab_lcd[t_6]); //十位 delay_ms(1); write(0x83);//时个位显示地址 date(tab_lcd[t_5]); //个位 delay_ms(1); write(0x84); date(':'); delay_ms(1); write(0x85);//分十位显示地址 date(tab_lcd[t_4]); //十位 delay_ms(1); write(0x86);// date(tab_lcd[t_3]); //个位 delay_ms(1); write(0x87); date(':'); delay_ms(1); write(0x88);// date(tab_lcd[t_2]); //十位 delay_ms(1); write(0x89); 项目13 数字温度计的设计 3.参考源程序
date(tab_lcd[t_1]); //个位 delay_ms(1); } /*************************时间调整函数************************/ void shijian_taozheng() { if(k3==0) { write(0x01); //清屏 feng(); delay_ms(20); feng(); while(1) { time_display(); if(k1==0) { feng(); delay_ms(15); m++; if(m==60) m=0; } 项目13 数字温度计的设计 3.参考源程序
else if(k2==0) { feng(); delay_ms(15); m--; if(m==-1) m=59; } else if(k4==0) { feng(); delay_ms(15); h++; if(h==24) h=0; } else if(k5==0) { feng(); delay_ms(15); h--; if(h==-1) h=23; } else if(k6==0) { 项目13 数字温度计的设计
feng(); delay_ms(20); feng(); break; } } } } /********************报警时间显示****************************/ time_alarm_show() { t_1=s%10; //秒个位 t_2=s/10; //秒十位 t_3=m%10; // 分个位 t_4=m/10; // 分十位 t_5=h%10; // 时个位 t_6=h/10; // 时十位 write(0x01); //清屏 项目13 数字温度计的设计
delay_ms(1); write(0x81); date('t'); delay_ms(1); write(0x82); date('i'); delay_ms(1); write(0x83); date('m'); delay_ms(1); write(0x84); date('e'); delay_ms(1); write(0x85); date(':'); delay_ms(1); write(0x86); date(tab_lcd[t_6]); //十位 delay_ms(1); write(0x87); date(tab_lcd[t_5]); //个位 delay_ms(1); write(0x88); date(':'); 项目13 数字温度计的设计 3.参考源程序
delay_ms(1); write(0x89); date(tab_lcd[t_4]); //十位 delay_ms(1); write(0x8a); date(tab_lcd[t_3]); //个位 delay_ms(1); write(0x8b); date(':'); delay_ms(1); write(0x8c); date(tab_lcd[t_2]); //十位 delay_ms(1); write(0x8d); date(tab_lcd[t_1]); //个位 delay_ms(1); } 项目13 数字温度计的设计 3.参考源程序
/*******************TH1温度报警显示*****************************//*******************TH1温度报警显示*****************************/ TH1_temp() { read_18b20(1); dip[2]=tab_18b20[0]&0x0f;//提取小数部分 dip[0]=db[dip[2]]; //查表得小数位的值 dip[1]=((tab_18b20[0]&0xf0)>>4)|((tab_18b20[1]&0x0f)<<4);//提取整数部分 tab_1=dip[0];//小数位 tab_2=dip[1]%10;//个位 tab_3=dip[1]%100/10;//十位 tab_4=dip[1]/100;//百位 write(0xc0); date('T'); delay_ms(1); write(0xc1); date('1'); delay_ms(1); write(0xc2); date(':'); delay_ms(1); if(dip[1]/100==0)//百位为0不显示 { 项目13 数字温度计的设计 3.参考源程序
write(0xc3); date(from1[0]); //百位 } else { write(0xc3); date(tab_lcd[tab_4]); //百位 } if(dip[1]/100<0) { if(dip[1]/100<0)//百位,十位都为0;则百位,十位都不显示 { write(0xc4); date(from1[0]); delay_ms(1); } } else { write(0xc4); date(tab_lcd[tab_3]);//十位 delay_ms(1); } 项目13 数字温度计的设计 3.参考源程序
write(0xc5); date(tab_lcd[tab_2]);//个位 delay_ms(1); write(0xc6); date(from[0]);//小数点位 write(0xc7); date(tab_lcd[tab_1]);//小数位 delay_ms(1); write(0xc8); date(0xdf);//显示 ° delay_ms(1); write(0xc9); date('C');//显示C delay_ms(1); write(0xca); date('T'); delay_ms(1); write(0xcb); date('H'); delay_ms(1); write(0xcc); 项目13 数字温度计的设计 3.参考源程序
date(':'); delay_ms(1); write(0xcd); date(tab_lcd[(th2/100)]);//百位 delay_ms(1); write(0xce); date(tab_lcd[(th2%100/10)]);//十位 delay_ms(1); write(0xcf); date(tab_lcd[(th2%10)]);//个位 delay_ms(1); } /********************TL1温度报警显示****************************/ TL1_temp() { read_18b20(1); dip[2]=tab_18b20[0]&0x0f;//提取小数部分 dip[0]=db[dip[2]]; //查表得小数位的值 dip[1]=((tab_18b20[0]&0xf0)>>4)|((tab_18b20[1]&0x0f)<<4);//提取整数部分 tab_1=dip[0];//小数位 项目13 数字温度计的设计 3.参考源程序
tab_2=dip[1]%10;//个位 tab_3=dip[1]%100/10;//十位 tab_4=dip[1]/100;//百位 write(0xc0); date('T'); delay_ms(1); write(0xc1); date('1'); delay_ms(1); write(0xc2); date(':'); delay_ms(1); if(dip[1]/100==0)//百位为0不显示 { write(0xc3); date(from1[0]); //百位 } else { write(0xc3); date(tab_lcd[tab_4]); //百位 } if(dip[1]/100<0) { if(dip[1]/100<0)//百位,十位都为0;则百位,十位都不显示 项目13 数字温度计的设计 3.参考源程序
{ write(0xc4); date(from1[0]); delay_ms(1); } } else { write(0xc4); date(tab_lcd[tab_3]);//十位 delay_ms(1); } write(0xc5); date(tab_lcd[tab_2]);//个位 delay_ms(1); write(0xc6); date(from[0]);//小数点位 write(0xc7); date(tab_lcd[tab_1]);//小数位 delay_ms(1); write(0xc8); date(0xdf);//显示 ° 项目13 数字温度计的设计
delay_ms(1); write(0xc9); date('C');//显示C delay_ms(1); write(0xca); date('T'); delay_ms(1); write(0xcb); date('L'); delay_ms(1); write(0xcc); date(':'); delay_ms(1); write(0xcd); date(tab_lcd[(tl2/100)]);//百位 delay_ms(1); write(0xce); date(tab_lcd[(tl2%100/10)]);//十位 delay_ms(1); write(0xcf); date(tab_lcd[(tl2%10)]);//个位 delay_ms(1); } 项目13 数字温度计的设计
/*******************TH2温度报警显示*****************************//*******************TH2温度报警显示*****************************/ TH2_temp() { read_18b20(0); dip[2]=tab_18b20[0]&0x0f;//提取小数部分 dip[0]=db[dip[2]]; //查表得小数位的值 dip[1]=((tab_18b20[0]&0xf0)>>4)|((tab_18b20[1]&0x0f)<<4);//提取整数部分 tab_1=dip[0];//小数位 tab_2=dip[1]%10;//个位 tab_3=dip[1]%100/10;//十位 tab_4=dip[1]/100;//百位 write(0xc0); date('T'); delay_ms(1); write(0xc1); date('2'); delay_ms(1); write(0xc2); date(':'); delay_ms(1); if(dip[1]/100==0)//百位为0不显示 项目13 数字温度计的设计
{ write(0xc3); date(from1[0]); //百位 } else { write(0xc3); date(tab_lcd[tab_4]); //百位 } if(dip[1]/100<0) { if(dip[1]/100<0)//百位,十位都为0;则百位,十位都不显示 { write(0xc4); date(from1[0]); delay_ms(1); } } else { write(0xc4); date(tab_lcd[tab_3]);//十位 delay_ms(1); 项目13 数字温度计的设计 3.参考源程序