DS18B20温度传感器和1602液晶制作温度和时间同时显示
DS18B20与LCD1602的测温显示程序

ds18B20_data = 1; // 拉高总线,延时 15us-60us 后等待ds18B20 响应
delay_15us(2); // 15us-60us
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar Minus_Flag=0;
uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={"TEMP: "};
LCD_RS = 0;
LCD_RW = Байду номын сангаас;
LCD_EN = 0;
_nop_();
_nop_();
LCD_Data = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)
#define ds18B20_ALARM_SEARCH 0xEC // 报警搜索指令
#define ds18B20_WRITE_SCRATCHPAD 0x4E // 写暂存寄存器指令
#define ds18B20_READ_SCRATCHPAD 0xBE // 读暂存寄存器指令
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
DS18B20温度传感器LCD1602显示

DS18B20温度传感器LCD1602显示#include < reg51.h >#include < intrins.h >#define uchar unsigned char#define uint unsigned intsbit DQ = P3^3 ; //定义DS18B20端口DQbit presence ; //检测18b20是否插好sbit RS = P2^4 ;sbit RW = P2^5 ;sbit EN = P2^6 ;uchar code cdis1[ ] = {" The third group"} ;uchar code cdis2[ ] = {" TEMP: . C "} ;uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;uchar code cdis4[ ] = {" PLEASE CHECK "} ;unsigned char data temp_data[2] = {0x00,0x00} ; //读出温度暂放unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ; //显示单元数据,共4个数据和一个运算暂用unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //自定义字符#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;void delay1(int ms){unsigned char y ;while(ms--){for(y = 0 ; y<250 ; y++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;}}}bit Lcd_BusyTest() //lcd_busy为1时,忙,等待。
51单片机ds18b20和lcd1602显示温度

/*本程序为基于51单片机的DS18b20与lcd1602显示温度程序,1602数据线友P0口提供*/程序已通过硬件测试直接使用作者:liuzqiang1016#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^0;//ds18b20sbit lcd_rw=P2^5;sbit lcd_rs=P2^6;sbit lcd_en=P2^7;unsigned char code str1[]={"temperature: "};unsigned char code str2[16]={" "};uchar data disdata[5];uint value;//温度值uchar flag;//正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void write_com(unsigned char com)//写指令//{ delay1ms(1);lcd_rs=0;lcd_rw=0;lcd_en=0;P0=com;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}void write_dat(unsigned char dat)//写数据//{ delay1ms(1);;lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}void lcd_init()//初始化设置//{write_com(0x38);delay1ms(5);write_com(0x08);delay1ms(5);write_com(0x01);delay1ms(5);write_com(0x06);delay1ms(5);write_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){write_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();write_com(0x80);display(str1);write_com(0xc0);display(str2);}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();value=b;value<<=8;value=value|a;if(value<0x0fff)flag=0;else{value=~value+1;flag=1;}value=value*(0.625);//温度值扩大10倍,精确到1位小数return(value);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=value/1000+0x30;//百位数disdata[1]=value%1000/100+0x30;//十位数disdata[2]=value%100/10+0x30;//个位数disdata[3]=value%10+0x30;//小数位if(flag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com(0xc0);write_dat(flagdat);//显示符号位write_com(0xc1);write_dat(disdata[0]);//显示百位write_com(0xc2);write_dat(disdata[1]);//显示十位write_com(0xc3);write_dat(disdata[2]);//显示个位write_com(0xc4);write_dat(0x2e);//显示小数点write_com(0xc5);write_dat(disdata[3]);//显示小数位}/********************主程序***********************************/ void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。
DS18b20传感器利用1602显示温度电路图

DS18b20传感器利用1602显示温度电路图(附代码)*重要注:图中没有画出单片机最小系统,另外在实际焊接中1602 的1,2,3,15,16引脚要按下图焊接,其他引脚看上图,另外要加排阻;其次ds18b20焊接时要注意引脚,不要焊反。
下面说明书中给出的是bottom view,分清引脚后18b20直接按上图焊即可。
Ds18b20说明书:代码:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit rs=P3^5;sbit wr=P3^6;sbit lcden=P3^4;uint temp;bit flag;uchar code table1[]="temperature is:"; void delay(uchar x)//延时函数_ms{uchar a,b;for(a=x;a>0;a--)for(b=120;b>0;b--);}/* 18b20 */void delayus(uint t)//延时函数_us{while(t--);}void z_reset()//单总线复位{ds=1;delayus(5);ds=0;delayus(80);ds=1;delayus(14);if(ds==0)flag=1;elseflag=0;delayus(20);}bit z_bit_read()//总线读一位{bit dat;ds=0;_nop_();_nop_();ds=1;_nop_();dat=ds;delayus(10);return dat;}uchar ds_read_byte()//18b20读一字节{uchar i,k,j;for(i=0;i<8;i++){j=z_bit_read();k=(k>>1)|(j<<7);}return k;}void ds_write_byte(uchar dat)//18b20写一字节{uchar i;for(i=0;i<8;i++){ds=0;_nop_();ds=dat&0x01;delayus(6);ds=1;dat=dat>>1;}delayus(6);}uint ds_read_temperature()//从18b20读温度{uchar a,b;z_reset();ds_write_byte(0xcc);ds_write_byte(0xbe);a=ds_read_byte();b=ds_read_byte();temp=b;temp=temp<<8;temp=temp|a;temp=temp*0.0625*10;return temp;}/* 1602 */void write_com(uchar com)//1602写命令{rs=0;wr=0;lcden=0;P0=com;lcden=1;delay(5);lcden=0;}void write_data(uchar dat)//1602写数据{rs=1;wr=0;lcden=0;P0=dat;lcden=1;delay(5);lcden=0;}void init()//1602初始化{write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0f);}main(){uint c,num;uchar i,j,k,z;P0=0;init();for(num=0;num<15;num++) //1602静态显示第一行{write_data(table1[num]);delay(300);}while(1){z_reset();ds_write_byte(0xcc);ds_write_byte(0x44);c=ds_read_temperature(); //读到温度write_com(0x80+0x40); //从第二行写i=c/100;//得十位j=c/10-c/100*10;//得各位k=c%10;//得十分位z='.';write_data(0x30+i);//1602显示数字只能输入ASCII码write_data(0x30+j);write_data(z);write_data(0x30+k);delay(300);}}。
DS18B20温度传感器 1602液晶显示

单片机轻松入门之十DS18B20温度传感器+1602液晶显示本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一个入门指导。
本文章会陆续推出,隔几天一个章节。
所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境下的注释,希望对广大即将接触单片机的人有所帮助,如果有错误欢迎回帖指出与本人交流或QQ 联系(QQ:56)。
DS18B20数字温度传感器是由美国DALLAS公司生产的,体积小,使用方便,测温范围-55℃~+125℃,测温分辨率0.5℃,工作电压DC3-5V,不需要任何外围元件,采用SPI单线接口方式,在与微处理器连接时仅需要一条口线即可实现双向通讯,广泛适用于各种温度控制领域。
原理图如下:程序如下:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit RS=P3^0;sbit EN=P3^2;sbit RW=P3^1;sbit wela=P3^3;sbit DQ=P3^4;uchar i;uint num;uint shi,ge,xiaoshu;uchar code t0[]="The temperature ";uchar code t1[]=" is ";uchar code wendu[]="09";void delay(uint x){uint m,n;for(m=x;m>0;m--)for(n=10;n>0;n--);}void delay1(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}/*****************液晶写指令***************/void write_com(uchar com){wela=1;P2=com;wela=0;RS=0;EN=0;RW=0;delay(10);EN=1;delay(10);EN=0;}/*****************液晶写数据指令***************/void write_date(uchar date){wela=1;P2=date;wela=0;RS=1;EN=0;RW=0;delay(10);EN=1;delay(10);EN=0;}/*****************液晶初始化指令***************/void init(){write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x80);for(i=0;i<16;i++){write_date(t0[i]);delay(0);}write_com(0x80+0x40);for(i=0;i<16;i++){write_date(t1[i]);delay(0);}}/*************DS18B20温度读取模块*************/void tmpDelay(int u) //延时函数{while(u--) ;}void Init_DS18B20() //初始化ds1820{unsigned char x=0;DQ = 1; //DQ复位tmpDelay(8); //稍做延时DQ = 0; //单片机将DQ拉低tmpDelay(80); //精确延时大于 480usDQ = 1; //拉高总线tmpDelay(14);x=DQ; //稍做延时后,如果x=0则初始化成功 x=1则初始化失败tmpDelay(20);}unsigned char ReadOneChar() //读一个字节{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;tmpDelay(4);}return(dat);}void WriteOneChar(unsigned char dat) //写一个字节{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;tmpDelay(5);DQ = 1;dat>>=1;}}unsigned int Readtemp() //读取温度{unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //连续读两个字节数据b=ReadOneChar();t=b;t<<=8;t=t|a; //两字节合成一个整型变量tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
DS18B20温度采集+1602显示

/*************************************************************************************************************** 名称:DS18B20采集温度+1602LCD显示编写:超时间:2012-11-29内容:***************************************************************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7; //ds18b20与单片机连接口sbit RS=P3^0; //1602写数据/写命令选择端口//RS=1写数据,即要显示的内容//RS=0写命令,即一些LCD设置命令sbit RW=P3^1; //1602读/写选择端,RW=0为写模式sbit EN=P3^2; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作uchar code str1[]={"^_^ Zhang Chao"};uchar code str2[]={" T= "};uchar data disdata[5];//百、十、个、小数位uint tvalue; //温度值uchar tflag; //温度正负标志/*************************lcd1602设置子函数*******************************************************************/ void delay1ms(uint ms) //延时1毫秒子函数,形参为ms(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void wr_com(uchar com)//lcd写控制指令子函数,形参为com{delay1ms(1); //调用延时子函数,并用实参1代替延时子函数中的形参msRS=0; //RS=0进入写命令状态,即一些LCD设置命令RW=0; //RW=0为写模式EN=0; //EN=0时不能完成写操作P2=com; //把要设置的指令码com送给P2口delay1ms(1);EN=1; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作delay1ms(1);EN=0; //EN=0时不能完成写操作}void wr_dat(uchar dat)//lcd写显示数据子函数,形参为dat{delay1ms(1);RS=1; //RS=1进入写数据状态,即要显示的内容RW=0; //RW=0为写模式EN=0; //EN=0时不能完成写操作P2=dat; //把要显示的数据dat送给P2口delay1ms(1);EN=1; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作delay1ms(1);EN=0; //EN=0时不能完成写操作}void lcd_init() //lcd初始化设置子函数,不带参数,0x38是显示模式设置,其余是显示开/关及光标设置,无顺序{delay1ms(15);wr_com(0x38); //调用写控制指令子函数,并用实参"0011 1000"代替形参com//0x38表示设置为16*2显示,每个块为5*7点阵,8位数据接口delay1ms(5);wr_com(0x08); //调用写控制指令子函数,并用实参"0000 1000"代替形参com//0x08表示设置为关显示、不显示光标、光标不闪烁delay1ms(5);wr_com(0x01); //调用写控制指令子函数,并用实参"0000 0001"代替形参com//0x01表示显示数据清屏(数据指针清0,所有显示清0)delay1ms(5);wr_com(0x06);//调用写控制指令子函数,并用实参"0000 0110"代替形参com//0x06表示当读或写一个字符后地址指针加1,且光标加1;当写一个字符时,整屏显示不移动delay1ms(5);wr_com(0x0c);//调用写控制指令子函数,并用实参"0000 1100"代替形参com//0x0c打开显示、不显示光标、光标不闪烁delay1ms(5);}void display(uchar *p)//lcd显示字符串子函数{while(*p!='\0') //测试是否等于'\0',即判断是否结尾{wr_dat(*p); //显示指针所指的字符串p++; //指针加1delay1ms(1);}}init_play()//初始化显示子函数{lcd_init(); //调用lcd初始化设置子函数,对LCD进行初始化wr_com(0x80); //调用写控制指令子函数,并用实参"1000 0000"代替形参com//并将数据指针定位到第一行第一个字符处display(str1);//从第一行第一个字符处显示字符串str1wr_com(0x80+0x40);//调用写控制指令子函数,并用实参"1000 0000"代替形参com//并将数据指针定位到第二行第一个字符处display(str2); //从第二行第一个字符处显示字符串str2}/**************************************************************************************************************//******************************ds18b20程序******************************************************************/ void delay_18b20(uint i)//延时1微秒{while(i--);}void ds18b20rst() //ds18b20初始化子函数//要求"数据线拉高-延时-数据线拉低-延时大于480微妙-数据线拉高-延时等待" {uchar x=0;DQ = 1; //信号线DQ复位delay_18b20(4); //延时DQ = 0; //DQ拉低delay_18b20(100); //精确延时大于480usDQ = 1; //拉高delay_18b20(40);}void ds18b20wr(uchar wdata)/*写数据子函数,无返回值,含参数*/{uchar i=0;for (i=8; i>0; i--)//要写完一个字节,故需要重复8次以下操作{DQ = 0; //数据线拉低DQ = wdata&0x01;//wdata是一个形参,将其与0000 0001进行按位与//按从低到高的顺序发送数据(一次发送一位)delay_18b20(10);DQ = 1; //最后将数据线拉高wdata>>=1; //将wdata右移1位}}uchar ds18b20rd() //读数据子函数,是有返回值dat{uchar i=0;uchar dat = 0;for (i=8;i>0;i--)//要读完一个字节,故需要重复8次以下操作{DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18b20(10);}return(dat); //返回dat}read_temp() //读取温度值并转换的子函数,有返回值温度值tvalue{uchar a,b;ds18b20rst(); //调用ds18b20初始化子函数ds18b20wr(0xcc);//调用写数据子函数,向ds18b20写命令0xcc//ccH表示跳过ROM读序列号,适用于单机工作,直接向18b20发送温度变换命令ds18b20wr(0x44);//调用写数据子函数,向ds18b20写命令0x44//44H表示启动ds18b20温度转换,结果自行存入9字节的RAM中ds18b20rst(); //调用ds18b20初始化子函数ds18b20wr(0xcc);//同上ds18b20wr(0xbe);//调用写数据子函数,向ds18b20写命令0xbe//beH表示读取RAM中9字节的温度数据a=ds18b20rd(); //调用读数据子函数,并将所得数据给ab=ds18b20rd(); //tvalue=b; //把b的值给tvaluetvalue<<=8; //tvalue左移8位tvalue=tvalue|a;//tvalue与a进行按位或if(tvalue<0x0fff)//tflag=0; //前五位为0时,读取的温度为正,标志位为0,此时只要//将测得数值乘以0.0625即可得到实际温度else //前五位为1时,读取的温度为负,标志位为1,此时需要{ //将测得数值取反后再加1,再乘以0.0625即可得到实际温度tvalue=~tvalue+1;tflag=1; //此时表示负温度}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue); //返回温度值}/*************************************************************************************************************//************************温度值显示**************************************************************************/ void ds18b20disp()//温度值显示{uchar flagdat;disdata[0]=tvalue/1000+0x30; //百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30; //个位数disdata[3]=tvalue%10+0x30; //小数位if(tflag==0)flagdat=0x2b; //正温度显示符号:+elseflagdat=0x2d; //负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20; //如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20; //如果百位为0,十位为0也不显示}}wr_com(0x80+0x46); //定位数据指针的位置:第二行第六个字符处wr_dat(flagdat); //显示符号位wr_com(0x80+0x47); //定位数据指针的位置:第二行第七个字符处wr_dat(disdata[0]); //显示百位wr_com(0x80+0x48); //定位数据指针的位置:第二行第八个字符处wr_dat(disdata[1]); //显示十位wr_com(0x80+0x49); //定位数据指针的位置:第二行第九个字符处wr_dat(disdata[2]); //显示个位wr_com(0x80+0x4a); //定位数据指针的位置:第二行第十个字符处wr_dat(0x2e); //显示小数点wr_com(0x80+0x4b); //定位数据指针的位置:第二行第十一个字符处wr_dat(disdata[3]); //显示小数位}/**************************************************************************************************************//********************主程序*********************************************************************************/ void main(){init_play(); //调用lcd初始化显示子函数while(1){read_temp(); //调用ds18b20读取温度ds18b20disp(); //调用温度显示子函数}}/************************************************************************************************************/。
基于msp430开发板的ds18b20温度测量程序+1602显示

基于msp430开发板的ds18b20温度测量程序+1602显示#include#include#define uchar unsigned char#define uint unsigned int#define DQ_1 P2OUT |= BIT3 //DS18B20数据脚接P2.3,LaunchPad上TXD、RXD跳线帽,由“‖”接改为“〓”。
用USB连接电脑后就可用超级终端看到温度了。
#define DQ_0 P2OUT &= ~BIT3#define DQ_in P2DIR &= ~BIT3#define DQ_out P2DIR |= BIT3#define DQ_val (P2IN & BIT3)#define Read_ROM 0x33 //读ROM#define Match_ROM 0x55 //匹配ROM#define Skip_ROM 0xcc //跳过ROM#define Search_ROM 0xf0 //搜索ROM#define Alarm_Search 0xec //告警搜索#define Convert_T emperature 0x44 //温度转换#define Read_Scratchpad 0xbe //读暂存存储器9字节内容#define Write_Scratchpad 0x4e //写暂存存储器,写的是TH and TL ,接着发送两位数据就可以unsigned int Check_val; //初始化检测变量unsigned int Temp;//温度整数值void UartPutchar(unsigned char c);unsigned char UartGetchar();unsigned int DS18b20_init(void){DQ_out;DQ_0;__delay_cycles(600);DQ_1;__delay_cycles(60);DQ_in;_NOP();if(DQ_val){Check_val = 0; //初始化失败}else{Check_val = 1; //初始化成功}__delay_cycles(10);DQ_out;DQ_1;__delay_cycles(100);return Check_val;}void DS18b20_write_byte(unsigned int dat) {unsigned int i;for(i = 0; i < 8;i++){DQ_0;__delay_cycles(2);if(dat & 0X01)DQ_1;elseDQ_0;__delay_cycles(60);dat >>= 1;;DQ_1;__delay_cycles(10);}}unsigned int DS18b20_read_byte(void) {unsigned i;unsigned int byte = 0;for(i = 0;i < 8;i++){byte >>= 1;DQ_0;__delay_cycles(2);DQ_1;__delay_cycles(2);DQ_in;_NOP();if(DQ_val)byte |= 0x80;__delay_cycles(60);DQ_out;DQ_1;__delay_cycles(10);}return byte;}unsigned int get_one_temperature(void) {unsigned int Temp_l;unsigned int Temp_h;unsigned int t;float tt;DS18b20_init();DS18b20_write_byte(Skip_ROM);DS18b20_write_byte(Convert_Temperature); __delay_cycles(1000000);DS18b20_init();DS18b20_write_byte(Skip_ROM);DS18b20_write_byte(Read_Scratchpad); Temp_l=DS18b20_read_byte();Temp_h=DS18b20_read_byte();t=Temp_h;t<<=8;t=t|Temp_l;tt=t*0.0625;t= tt*10+0.5; //放大10倍输出并四舍五入return(t);}#define DataDir P1DIR#define DataPort P1OUT#define Busy 0x80#define CtrlDir P2DIR#define CLR_RS P2OUT&=~BIT0; //RS = P3.0 #define SET_RS P2OUT|=BIT0;#define CLR_RW P2OUT&=~BIT1; //RW = P3.1 #define SET_RW P2OUT|=BIT1;#define CLR_EN P2OUT&=~BIT2; //EN = P3.2 #define SET_EN P2OUT|=BIT2;void DelayNus(unsigned int n){CCR0 = n;TACTL |= MC_1; //增计数到CCR0while(!(TACTL & BIT0)); //等待TACTL &= ~MC_1; //停止计数TACTL &= ~BIT0; //清除中断标志}void Delay5ms(void){//unsigned int i;//i=40000;//while (i != 0)// {// i--;// }DelayNus(5000);}void WaitForEnable(void)P1DIR &= 0x00; //将P1口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P1IN & Busy)!=0); //检测忙标志CLR_EN;P1DIR |= 0xFF; //将P4口切换为输出状态}void write_com(unsigned char cmd) {WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort =cmd ; //将命令字写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}void write_data( unsigned int data )WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}void zifuchuan(unsigned int *ch){while(*ch!=0)write_data(*ch++);Delay5ms();}void LcdReset(void){CtrlDir |= 0x07; //控制线端口设为输出状态DataDir = 0xFF; //数据端口设为输出状态write_com(0x38); //显示模式设置write_com(0x0c); //显示开,不开游标,不闪烁write_com(0x06); //写字符时整体不移动write_com(0x01); //显示清屏__delay_cycles(200);}/************************************************************* * 名称:void dis_temp(uint t)* 功能:分出十位、个位等* 入口参数:t* 出口参数:无* 说明: 送到1602显示*************************************************************/ void main(void){unsigned int a,b,c,d;// BCSCTL1|=DIVA_0;WDTCTL=WDTPW+WDTHOLD;// WDTCTL = WDT_ADLY_1000; // Stop watchdog timer// IE1 |=WDTIE;P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0; //dco不分频用作mclk,不分频默认用作smclkif (CALBC1_1MHZ != 0xFF){DCOCTL = 0x00;BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */DCOCTL = CALDCO_1MHZ;}BCSCTL1 |= XT2OFF + DIVA_0;LcdReset();while(1){a=get_one_temperature();b=a/100;c=(a%100)/10;d=a%10;P2SEL&=~BIT6;if(a>300){P2DIR|=BIT5;P2OUT|=BIT5;P2DIR|=BIT6;P2OUT|=BIT6;}else{P2DIR|=BIT5;P2OUT&=~BIT5;P2DIR|=BIT6;P2OUT&=~BIT6;}write_com(0x80+0x05);write_data(b+0x50);write_data(c+0x50);write_data(0x4e);write_data(d+0x50);write_data(0xbf); //显示温度的小圈write_data(0x23);//__delay_cycles();}}/*pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){_BIS_SR_IRQ(LPM3_bits); }*/。
DS18B20与LCD1602结合显示温度汇总

二、DS18B20存储器结构
DS18B20的内部有64位的ROM单元,和9字节的暂存器单元。
1、64位(激)光刻只读存储器
每只DS18B20都有一个唯一存储在ROM中的64位编码(跟人的身份证号类似,一人一个身份证号),这是出厂时被光刻好的。最前面8位是单线系列编码:28h。接着的48位是一个唯一的序列号。最后8位是以上56位的CRC编码。64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。ROM的作用是使每个DS18B20各不相同,这样就可以实现一根总线上挂接多个DS18B20以实现多点监测。
图3
表2
4)、CRC发生器
CRC字节作为DS18B2064位ROM的一部分存储在存储器中。CRC码由ROM的前56位计算得到,被包含在ROM的重要字节当中的数据发生改变时,CRC的值也随之改变。
CRC能够在总线控制器读取DS18B20时进行数据校验。为校验数据是否被正确读取,总线控制器必须用接受到的数据计算出一个CRC值,和存储在DS18B20的64位ROM中的值(读ROM时)或DS18B20内部计算出的8位CRC值(读存储器时)进行比较。如果计算得到的CRC值和读取出来的CRC值相吻合,数据被无错传输。CRC值的比较以及是否进行下一步操作完全由总线控制器决定。当在DS18B20中存储的或由其计算到CRC值和总线控制器计算的值不相符时,DS18B20内部并没有一个能阻止命令序列进行的电路。
2)、非挥发的温度报警触发器TH和TL
位于第2和第3字节,用于写入温度报警值,实际上就是设定温度的最高和最低界限。
DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。
DS18B20与LCD1602结合显示温度汇总(可编辑修改word版)

单总线系统包括一个总线控制器和一个或多个从机。DS18B20 总是充当从机。当只有 一只从机挂在总线上时,系统被称为“单点”系统;如果由多只从机挂在总线上,系统被 称为“多点”。 所有的数据和指令的传递都是从最低有效位开始通过单总线。单总线需要 一个约 5KΩ 的外部上拉电阻;单总线的空闲状态是高电平。无论任何理由需要暂停某一 执行过程时,如果还想恢复执行的话,总线必须停留在空闲状态。在恢复期间,如果单总 线处于非活动(高电平)状态,位与位间的恢复时间可以无限长。如果总线停留在低电平 超过 480us,总线上的所有器件都将被复位。 四、操作流程 1.DS18B20 复位。 2.执行 ROM 指令。就是访问,搜索,匹配每个 DS18B20 独有的 64 位序列号。实验板上只 连有一个 DS18B20,故不需识别,也就是不需读出此序列号,写代码时直接写命令 0xcc 跳过。 3.执行 DS18B20 功能指令(RAM 指令,就是读写暂存器指令)。
一个身份证号),这是出厂时被光刻好的。最前面 8 位是单线系列编码:28h。接着的 48 位
是一个唯一的序列号。最后 8 位是以上 56 位的 CRC 编码。64-位的光刻 ROM 又包括 5 个
ROM 的功能命令:读 ROM,匹配 ROM,跳跃 ROM,查找 ROM 和报警查找。ROM 的作
用是使每个 DS18B20 各不相同,这样就8B20 一、DS18B20 的外形及其与单片机的连接图
(a)
(b)
图1
DS18B20 是 Dallas 公司生产的 1-Wire 接口数字温度传感器,其外形如图 1(a)所示,有
三个引脚,分别为:电源地 1(GND); 数字信号输入/输出端 2(DQ);外接供电电源输入端
基于单片机的DS18B20多点测温系统LCD1602显示(完全免费)

河南科技学院HENANKEJIXUEYUAN毕业论文(设计)中文题目:基于单片机的DS18B20温度传感器测温系统设计英文题目:A Design of the DS18B20 Temperature Test System Based on MCU姓名牛鸿昌刘东学号201018033305专业班级应用电子技术指导教师赵小静提交日期2013年 5 月20 日教务处制基于单片机的DS18B20温度传感器测温系统设计姓名:** 班级:***指导老师:*** 职称:**(惠州学院电子科学系,广东,惠州,516007)摘要随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时作出决定。
在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。
本课题以AT89C52单片机系统为核心,能对多点温度进行实时巡检。
DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松的组建起传感器网络,并可使多点温度测量电路变得简单、可靠。
本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图。
关键词:DS18B20 多点测温单片机LCD1602AbstractAs the industry and the society developing, the temperature becomes more and more important and a lot of products are sensitive to temperature. However, temperature measuring apparatus in the market now only can check and measure the temperature of one point, at the same time, the temperature information is not real time and the precision is low. It takes a great of troubles for the industry-controllers to make decision .In this situation, design and implement one applicable system which can watch measure and control the temperature and the measuring results is real time and the precision is great is more essential. In order to meeting this application, this paper talk about The Multiple-Point’s temperature Measuring System.This system based on single chip computer, can inspect and control multiple temperatures in real time. As a kind of high-accuracy digital net temperature sensor,DS18 B20 can be used building a sensor net easily. It can also make the net simple and reliable with it's special 1-wire interface .This paper introduces the application of DS18B20 with single chip processor.Key words:DS18B20 Multi-point temperature MCU LCD1602目录摘要 (II)Abstract ........................................................................................................................ I II 第一章绪论.. (1)1.1 课题背景 (1)1.2 本课题研究意义 (2)1.3 本课题的任务 (2)1.4 系统整体目标 (3)第二章方案论证比较与选择 (3)2.1 引言 (3)2.2 方案设计 (3)2.3 方案的比较与选择 (4)第三章硬件设计 (4)3.1 STC89C52单片机简介 (4)3.2 DS18B20介绍 (8)3.3 系统电路设计 (16)3.4 显示电路设计 (17)3.5 按键电路设计 (17)3.6 三点测温电路 (18)第四章软件设计 (18)4.1 软件开发工具的选择 (18)4.2 系统软件设计的一般原则 (19)4.3 系统软件设计的一般步骤 (20)4.4 三路测温软件实现 (20)第五章误差分析 (25)5.1 误差产生 (25)5.2 降低误差方法 (25)5.3 挂接DS18B20个数论证 (26)第六章调试与小结 (26)致谢 (28)参考文献 (29)附录 (30)第一章绪论1.1 课题背景在人类的生活环境中,温度扮演着极其重要的角色。
数字温度传感器ds18b20程序(含1602显示液晶程序)

lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
{
uint i; //初始化,先将数据线置高电平(单片机管脚默认高电平,故不用拉高),延时,时间尽可能短
ds=0; //数据线拉到低电平0
i=103;
while(i>0)i--; //循环执行相当于延时,延时480-960us,一条指令周期相当于1~4个及其周期(1us)
b=tempread(); //读高8位
temp=b;
temp<<=8; //temp=temp<<8,左移8位
temp=temp|a; //两个8位数据合并成一个数据,两个字节组合为1个字
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
{
do
{
SBUF = *parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(*parr); //保持循环直到字符为'\0'
uint temp;
float f_temp;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
52单片机DS18B20温度计(1602显示)

//按下K1显示序列码,按下K2显示实时温度(本实验适合初学者调试理解18B20用,)#include <reg52.h>//52单片机#define uchar unsigned char#define uint unsigned int //uint 无符号整数sbit DQ=P2^2; //单总线(与自己的开发板相匹配)uint temp; //温度uchar flag1; //符号sbit rs = P1^0; // 控制LCD (与自己的开发板相匹配)sbit rw = P1^1; // 控制LCD (与自己的开发板相匹配)sbit lcden = P2^5; //led使能端(与自己的开发板相匹配)sbit K1=P3^4; //独立按键k1(与自己的开发板相匹配)sbit K2=P3^5; //独立按键k2 (与自己的开发板相匹配)sbit du=P2^6; //位选(防LED灯乱闪)(与自己的开发板相匹配)sbit we=P2^7; //段选(防LED灯乱闪) (与自己的开发板相匹配)uchar a,b,c,d,e,f,g,h,A1,A2,A2t,A3,A4,A5;//写在LCD上的字符,具体在程序中看void delay(uint count) //延迟程序 (200*count)/8 毫秒{uint i;while(count){i=200;while(i>0)i--;count--;}}void DQreset(void) //初始化,主机将DQ拉高 (上升沿) (从机检测到上升沿后延时15到60毫秒,从机拉低总线60到240毫秒表示“我”在线){ //从机的工作是自动完成的uint i;DQ=0;i=103;while(i>0)i--;DQ=1;i=4;while(i>0)i--;}bit tmpreadbit() //从18b20读1位{uint i;bit dat;DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=8;while(i>0)i--;return (dat); //返回dat}uchar tmpread() //从18b20读1字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);}return(dat);}void tmpwritebyte(uchar dat) //18b20写1bit (只能用于写命令){uint i;uchar j;bit testb;for(j=1;j<=8;j++) //一位一位地传{testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=8;while(i>0)i--;}else{DQ=0;i=8;while(i>0)i--;DQ=1;i++;i++;}}}void tmpchange(void) //温度转换子程序{DQreset();delay(1);tmpwritebyte(0xcc); //CCH跳过ROMtmpwritebyte(0x44); //44H温度转换}uint tmp() //读取温度子程序{float tt;uchar a,b;DQreset(); //无论什么命令, 首先都要发起初始化delay(1);tmpwritebyte(0xcc); //跳过ROM(本实验中实验板上只连接一块18B20) tmpwritebyte(0xbe); //读便签存储器(温度以二进制储存于BEH)a=tmpread(); //a为低八位b=tmpread(); //b为高八位temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625; //二进制乘0.0625为十进制temp=tt*1000; //精度为0.001return temp;}void LCD_WriteCom(uchar )//LCD写入命令{rs = 0;rw = 0;P0 = ;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}void LCD_WriteData(uchar dat)//LCD写入数据{rs = 1;rw = 0;lcden = 0;P0 = dat;delay(5);lcden = 1;delay(5);lcden = 0;delay(5);}void LCD_Init() //LCD初始化{LCD_WriteCom(0x38);delay(15);LCD_WriteCom(0x08);delay(3);LCD_WriteCom(0x01);delay(3);LCD_WriteCom(0x06);delay(3);LCD_WriteCom(0x0c);}void Display18B20Rom(char Rom) //display rom {uchar h,l;l = Rom & 0x0f;h = Rom & 0xf0;h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); elseLCD_WriteData(h+0x37);if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); elseLCD_WriteData(l+0x37); }void temshow() //温度显示{//LCD_WriteCom(0x01); 写命令不能放在此位置DQreset(); //无论什么命令, 首先都要发起初始化tmpchange(); //温度转换(相当于读温度前的初始化)temp=tmp(); //读温度A1=temp/10000;A2=(temp%10000)/1000;A3=((temp%10000)%1000)/100;A4=(((temp%10000)%1000)%100)/10;A5=(((temp%10000)%1000)%100)%10;LCD_WriteCom(0x80) ;LCD_WriteData('t') ;LCD_WriteData('e');LCD_WriteData('m') ;LCD_WriteData('p') ;LCD_WriteData(':') ;LCD_WriteCom(0x80+0x40) ;LCD_WriteData('+') ;LCD_WriteData('0'+A1);LCD_WriteData('0'+A2) ;LCD_WriteData('.') ;LCD_WriteData('0'+A3) ;LCD_WriteData('0'+A4) ;LCD_WriteData('0'+A5) ;}void romshow() //序列码显示{LCD_Init();rw = 0;DQreset(); //无论什么命令, 首先都要发起初始化delay(1);tmpwritebyte(0x33); //读ROM,允许主机读出DS18B20的64为二进制序列码(仅限于总线上存在单只DS18B20)delay(1);a = tmpread();b = tmpread();c = tmpread();d = tmpread();e = tmpread();f = tmpread();g = tmpread();h = tmpread();LCD_WriteCom(0x80);//LCD第一行开始LCD_WriteData('n');LCD_WriteData('u');LCD_WriteData('m');LCD_WriteData('b');LCD_WriteData('e');LCD_WriteData('r');LCD_WriteCom(0x80+0x40);//lCD第二行开始Display18B20Rom(a);Display18B20Rom(b);Display18B20Rom(c);Display18B20Rom(d);Display18B20Rom(e);Display18B20Rom(f);Display18B20Rom(g);Display18B20Rom(h);}void main(){du=0;//(防LED灯乱闪)we=0;//(防LED灯乱闪)if(K2==0) //独立键盘k2按下{LCD_WriteCom(0x01);while(K1!=0) //用while循环实时扫描,当K1没被按下,一直扫描{temshow();}}if(K1==0) //独立键盘k1按下{LCD_WriteCom(0x01);romshow();}}。
温度显示系统(STC单片机、18B20传感器、1602显示)

单片机实训论文论文题目:温度采集显示系统学院:年级:专业:姓名:学号:指导教师:2014年5月16日摘要温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验中,有特别重要的意义。
随着人们生活水平的不断提高,,人们对温度计的要求越来越高,传统的温度计功能单一、精度低,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
数字温度计(Digital Thermometer)简称D温度是许多监控系统中的一个重要参数。
TM,它是采用数字化测量技术,把连续的温度值转换成不连续、离散的数字形式并加以显示的仪表。
采用单片机控制的数字温度计,由于精度高、可扩展性强、集成方便、抗干扰能力强,得到了广泛的应用。
本设计以单片机和温度传感器为核心,设计数字温度计。
实现对温度的采集、监视和报警。
在温度采集的实现中,使用了AT89S52单片机和温度传感器DS18B20,通过LCD1602实现温度显示。
温度测量范围-55℃~+125℃,能准确达到设计要求。
关键词温度测量;单片机;温度传感器AbstractTemperature measurement in physics experiments, medical and health, food production and other fields, especially in the thermal test, have particularly important sense. With the continuous improvement of people's living standard, people on the thermometer, the increasingly high demand, the traditional thermometer has single function, low precision, for the modern work, scientific research, life, provide better and more convenient facilities needs from SCM technology proceed with, all to the digital control, intelligent control direction.Digital thermometer ( Digital Thermometer ) D temperature is many monitoring system is an important parameter. TM, it is the use of digital measuring technology, the continuous temperature value is converted into a continuous, discrete digital form and to display instrument. MCU control of the digital thermometer, because of high precision, good expansibility, convenient integration, strong anti-interference ability, has been widely used.The design of single chip computer and temperature sensors as the core, the design of digital thermometer. To achieve the collection of temperature, monitoring and alarm. The temperature acquisition implementation, using AT89S52 MCU and temperature sensor DS18B20.ByLCD1602temperature display.The measuring range of the temperature of - 55 DEG C to 125 degrees C.,can accurately achieve the design requirement.Key wordsSCM;single chip computer ;temperature sensor目录摘要 (I)Abstract (II)前言 (1)第一章温度测量的背景及意义 (1)1.1 温度测量的背景 (1)1.2 温度测量的目的及意义 (2)第二章硬件电路及原理 (3)2.1 系统的结构框图 (3)2.2 单片机简介 (3)2.3 DS18B20简介 (8)2.4 LCD1602液晶显示屏 (12)第三章软件设计流程 (15)3.1 系统总体框图 (15)3.2 液晶流程图 (15)3.3 温度传感器流程图 (16)3.4 仿真与调试 (16)结论 (17)附录一 (18)附录二 (19)致谢 (24)前言温度是工业控制中主要的被测参数,随着电子技术和微型计算机的快速发展,温度的测量和控制技术在工业发展中起到了举足轻重的作用。
51单片机的18B20、1302和LCM1602液晶显示温度与万年历显控制

摘要本设计以数字集成电路技术为基础,单片机技术为核心。
软件设计采用模块化结构,C语言编程。
系统通过LCD显示数据,可以显示日期(年、月、日、时、分、秒)以及温度。
在内容安排上首先描述系统硬件工作原理,着重介绍了各硬件接口技术和各个接口模块的功能;其次,详细的阐述了程序的各个模块和实现过程。
前言电子时钟是实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人家庭,车站,码头,办公室,银行大厅等场所,成为人们日常生活中的必需品。
数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。
钟表的数字化给人们生产生活带来了极大的方便,在此基础上完成的电子时钟精度高,功能易于扩展。
可扩展成为诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等电路。
所有这些,都是以钟表数字化为基础的。
因此,研究数字时钟及扩大其应用有着非常现实的意义。
本设计就是数字时钟简单的扩展应用。
1.1设计目标:利用单片机技术,以及模拟电子技术和数字电子技术的理论知识,设计实现MCS-51单片机对LCM1602液晶输出显示控制的这一基本要求。
1.2设计要求:本设计利用DS1302;DS18B20;LCD1602实现以下功能:(1) 显示日期功能(年、月、日、时、分、秒以及星期)(2) 可通过按键切换年、月、日及时、分、秒的显示状态(3) 可随时调校年、月、日或时、分、秒(4) 可每次增减一进行时间调节(5) 可动态完整显示年份,实现真正的万年历显示(6) 可显示温度2 设计方案2.1 控制器硬件控制电路主要用了AT89C52芯片处理器、LCD显示器等。
根据各自芯片的功能互相连接成电子万年历的控制电路。
软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及星期显示和温度采集程序等组成。
主控程序中对整个程序进行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时间控制程序是电子万年历中比较重要的部分。
DS18B20测量温度液晶1602显示

DS18B20测量温度液晶1602显示DS18B20温度传感器简介DS18B20是一种数字温度传感器。
它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。
DS18B20温度传感器特点1、单线接口:DS18B20仅需一条线可实现与微处理器双向通信。
2、测温范围: DS18B20温度传感器的测温范围可达-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4°。
3、支持多点组网功能:多个DS18B20温度传感器可以并联在一条数据线上,最多可以并联8个,实现多点测温。
4、工作电源: 3.0~5.5V/DC ,DS18B20温度传感器可以采用外部独立电源供电,也可以用数据线寄生电源供电。
5、DS18B20温度传感器在应用过程中不需要任何外围元件。
6、DS18B20测量温度的结果以9~12位数字量方式串行传送。
7、掉电保护功能, DS18B20温度传感器内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度。
在DS18B20温度传感器掉电以后仍可保存分辨率及报警温度的设定值。
8、DS18B20温度传感器返回16位二进制数代表此刻探测的温度值,其高五位代表正负。
如果高五位全部为1,则代表返回的温度值为负值。
如果高五位全部为0,则代表返回的温度值为正值。
后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。
DS18B20温度传感器引脚说明DS18B20温度传感器接口电路液晶1602接口电路DS18B20测量温度程序源代码/*****************DS18B20测量温度,用1602显示温度值******************* 单片机:51单片机* 开发环境:keil* 功能: DS18B20测量温度,并在LCD1602中显示出来**********************************************************************/#include <reg51.h>#define LCD_Data P0#define Busy 0x80#define uchar unsigned char#define uint unsigned intuchar code table0[] = {" SL-51A "};uchar code table1[] = {" TEMP: XX.X "};uchar temperature[5]; //温度值uint temp;sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_E = P2^5;sbit DS = P2^2;void Delay5Ms(void);void delay(uint count);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Info_display(void);void dsreset(void);bit tmpreadbit(void);uchar tmpread(void);void tmpwritebyte(uchar dat);void tmpchange(void);uint tmp();void delay(uint count){uint i;while(count){i=200;while(i>0)i--;count--;}}void dsreset(void) //发复位命令{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //读取一位{uint i;bit dat;DS=0;i++;DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //读取一个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面 }return(dat);}void tmpwritebyte(uchar dat) //向ds18b20写入一个字节{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0;i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //DS18B20开始转换{dsreset();delay(1);tmpwritebyte(0xcc); //命令的含义可以查18b20的手册 tmpwritebyte(0x44);}uint tmp() //获取温度值{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}/*************************5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc = 3552;while(TempCyc--);}/**************************写数据函数***************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_E = 0; //若晶振速度太高可以在这后加小的延时 LCD_E = 0; //延时LCD_RS = 1;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/*************************写指令函数****************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_E = 0;LCD_E = 0;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/**************************读状态函数***************************/unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/***************************LCD初始化***************************/void LCDInit(void) //LCD初始化{LCD_Data = 0;WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/**********************按指定位置显示一个字符*********************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********************按指定位置显示一串字符********************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}}/*****************************************************************/ void temp_display(unsigned int temp) //显示程序{unsigned char A1,A2,A2t,A3;A1=temp/100; //百位A2t=temp%100;A2=A2t/10; //十位A3=A2t%10; //个位temperature[1]=A1 + 0x30;temperature[2]=A2 + 0x30;temperature[3]=A3 + 0x30;DisplayOneChar(9,1,temperature[1]);DisplayOneChar(10,1,temperature[2]);DisplayOneChar(12,1,temperature[3]);}/******************************************************************/ void init(){LCDInit();DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);}void main(){int i;init();while(1){tmpchange();for(i=0;i<=10;i++){if(i==10){temp_display(tmp());}}}}。
51单片机ds18b20和lcd1602显示温度

/*本程序为基于51单片机的DS18b20与lcd1602显示温度程序,1602数据线友P0口提供*/程序已通过硬件测试直接使用作者:liuzqiang1016#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^0;//ds18b20sbit lcd_rw=P2^5;sbit lcd_rs=P2^6;sbit lcd_en=P2^7;unsigned char code str1[]={"temperature: "};unsigned char code str2[16]={" "};uchar data disdata[5];uint value;//温度值uchar flag;//正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void write_com(unsigned char com)//写指令//{ delay1ms(1);lcd_rs=0;lcd_rw=0;lcd_en=0;P0=com;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}void write_dat(unsigned char dat)//写数据//{ delay1ms(1);;lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}void lcd_init()//初始化设置//{write_com(0x38);delay1ms(5);write_com(0x08);delay1ms(5);write_com(0x01);delay1ms(5);write_com(0x06);delay1ms(5);write_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){write_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();write_com(0x80);display(str1);write_com(0xc0);display(str2);}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();value=b;value<<=8;value=value|a;if(value<0x0fff)flag=0;else{value=~value+1;flag=1;}value=value*(0.625);//温度值扩大10倍,精确到1位小数return(value);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=value/1000+0x30;//百位数disdata[1]=value%1000/100+0x30;//十位数disdata[2]=value%100/10+0x30;//个位数disdata[3]=value%10+0x30;//小数位if(flag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com(0xc0);write_dat(flagdat);//显示符号位write_com(0xc1);write_dat(disdata[0]);//显示百位write_com(0xc2);write_dat(disdata[1]);//显示十位write_com(0xc3);write_dat(disdata[2]);//显示个位write_com(0xc4);write_dat(0x2e);//显示小数点write_com(0xc5);write_dat(disdata[3]);//显示小数位}/********************主程序***********************************/ void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。
DS18B20温度测量 1602显示

这是我写的DS18B20测温程序,使用51单片机,STC89C52。
1602的RW引脚连接单片机P2.1,E连接P2.2,1602数据口接单片机P0口。
DS18B20引脚连接P3^3。
#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uint unsigned int#define uchar unsigned charsbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚//1602引脚定义sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚//1602数据口接单片机P0口sbit ds=P3^3; //DS18B20引脚定义uint temp;float f_temp;unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃/*****************************************************以下为1602模块语句***************************************************//*****************************************************函数功能:延时1ms***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
温度传感器DS18B及LCD1602的使用

温度传感器DS18B及LCD1602的使用温度传感器DS18B20是一种数字温度传感器,可以通过单线数字接口与单片机进行通信。
它采用了Dallas的1-Wire总线协议,具有高精度、低功耗、长传输距离等特点。
而LCD1602是一种常用的字符型液晶显示屏,可以显示16×2个字符。
使用DS18B20温度传感器需要先进行硬件连接。
它需要三个引脚,即VCC、GND和DQ。
VCC连接到3.3V或5V电源,GND连接到地线,DQ连接到单片机的一个GPIO口。
在连接时要注意使用上拉电阻将DQ引脚连接到VCC,以确保通信的可靠性。
在软件方面,需要使用1-Wire总线的协议进行通信。
可以使用基于C语言或者Arduino的库来实现。
在Arduino中,可以使用OneWire库来方便地读取DS18B20的数据。
首先需要创建一个OneWire对象,并指定DQ引脚,然后在setup(函数中初始化该对象。
接下来在loop(函数中可以使用`reset_search(`函数来连接的设备,并通过`search(`函数来获取设备的地址。
而后使用`reset(`函数重置总线,`select(`函数选择设备进行通信,`write(`函数发送指令,`read(`函数读取数据。
其中,读取温度数据需要先发送读取温度的指令,使用`read_bytes(`函数读取9个字节的数据,低字节在前,高字节在后,然后将读取到的数据处理转换为摄氏温度。
接下来是LCD1602的使用。
LCD1602需要连接到单片机的多个引脚,包括VCC、GND、SCL、SDA等。
在Arduino中,可以使用LiquidCrystal库来方便地控制LCD1602、首先需要创建一个LiquidCrystal对象,并指定连接的引脚,然后在setup(函数中初始化该对象。
接下来可以使用一系列函数来向LCD1602写入数据,如`begin(`函数用于初始化LCD1602,`print(`函数用于显示字符,`setCursor(`函数用于设置光标位置等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用DS18B20温度传感器和1602液晶制作温度和时间同时显示【含原理图】2009年11月26日星期四22:43C程序如下:/*功能:温度采集显示和可调时钟显示,时钟用中断法实现s1:选择要调节的时、分、秒位s2:时、分、秒加一s3:时、分、秒减一*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar num,s1num,count;ucharshi,fen,miao;sbitrs=P2^0;sbit e=P2^1;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2; //按键定义sbit DQ =P2^2; //定义通信端口bit flag;uchar code table1[]="Time: 00:00:00";uchar code table2[]="Temperature: 'C";//1602初始化字符void delay(uint z)//延时子函数{uintx,y;for(x=z; x>0; x--)for(y=110;y>0;y--);}#include<1602.h>#include<18b20.h>#include<clock_set.h>void main(){uchar temp;init_1602();while(1){ delay(500); //去除0秒和1秒之间显示间隔跟正常1秒间隔相差过大if(miao==0) //每分钟进行温度采集一次{TR0=0; //进入温度采集后,关闭定时器flag=1; //flag=1,标志进入温度采集模式write_com(0x80+0x40+13);write_dat(0x30+1); //消除不显示数字1temp=ReadTemperature(); //读取DS18B20的温度值write_1602(12,temp); //向1602中写入温度值TR0=1; //温度采集完成后,打开定时器delay(100);//等待miao不等零,跳出循环}flag=0; //flag=0,标志在时钟显示模式下keyscan(); //调用键盘扫描子程序,用以调整时间}}void timer0() interrupt 1//定时器1的中断服务程序,并向1602中写时分秒显示时间{TH0=(65535-50000)/256;TL0=(65535-50000)%256;count++;if (count==18){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}if(flag==0) //flag=0,标志在时钟显示模式下,然后才显示时间write_1602(6,shi);}if(flag==0)write_1602(9,fen);}if(flag==0)write_1602(12,miao);}}"1602.h"void write_com(uchar com)//向1602液晶写命令函数{rs=0;e=0;P0=com;delay(5);e=1;delay(5);e=0;}void write_dat(uchardat)//向1602液晶写入数据{rs=1;e=0;P0=dat;delay(5);e=1;delay(5);e=0;}void init_1602()//1602液晶的初始化{uchari;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;write_com(0x80); //第一行字符的初始化for(i=0;i<16;i++){write_dat(table2[i]);delay(5);}write_com(0x80+0x40); //第二行字符的初始化for(i=0;i<14;i++){write_dat(table1[i]);delay(5);}}void write_1602(ucharaddress,uchartemp_dat)//向指定的地址中写入时、分、秒数据{uchargewei,shiwei;if(flag==0) //若在时钟显示模式下,向第二行写数据{write_com(0x80+0x40+address);}else{write_com(0x80+address); //若在温度采集显示模式下,向第一行写数据}shiwei=temp_dat/10;gewei=temp_dat%10;write_dat(0x30+shiwei); //根据1602字符库做相应转换write_dat(0x30+gewei);}"18B20.h"void delay_18b20(unsigned inti)//延时子函数{while(i--);}//初始化DS18B20子函数Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18b20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18b20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18b20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18b20(20);}//读一个字节ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18b20(4);}return(dat);}//写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18b20(5);DQ = 1;dat>>=1;}delay_18b20(4);}//读取温度值ReadTemperature(void){uchara,b,t;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(850); //等待温度转换结束,不能过短,否则第一次显示不出实际温度,会显示85 Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位a=a>>4; //低位右移4位,舍弃小数部分t=b<<4; //高位左移4位,舍弃符号位t=t|a;return(t);}"clock_set.h"void keyscan()//键盘扫描程序{if(s1==0)//s1键扫描{delay(5);if(s1==0){TR0=0;s1num++;while(!s1);//等待键的释放switch(s1num)//根据s1的按键次数做相应的处理{case 1:write_com(0x80+0x40+12);write_com(0x0f); break;//按键一次,调整光标的形状及位置case 2:write_com(0x80+0x40+9); break;case 3:write_com(0x80+0x40+6); break;case 4:s1num=0;write_com(0x0c);TR0=1;break;}}}if(s1num)//在s1有被按下的情况下做相应的处理{if(s2==0)//s2按键检测,按下s2键后相应的时、分、秒加1操作{delay(5);if(s2==0){while(!s2);//松手检测switch(s1num){case 1:miao++;if(miao==60) miao=0;write_1602(12,miao);write_com(0x80+0x40+12);break;case 2:fen++;if(fen==60) fen=0;write_1602(9,fen);write_com(0x80+0x40+9);break;case 3:shi++;if(shi==24) shi=0;write_1602(6,shi);write_com(0x80+0x40+6);break;case 4:break;}// delay(500);//把松手检测部分去除后,按下后时间一直增加}}if(s3==0)//s3按键检测,按下s3键后相应的时、分、秒减1操作{delay(5);if(s3==0){while(!s3);//松手检测switch(s1num){case 1:miao--;if(miao==-1) miao=59;write_1602(12,miao);write_com(0x80+0x40+12);break;case 2:fen--;if(fen==-1) fen=59;write_1602(9,fen);write_com(0x80+0x40+9);break;case 3:shi--;if(shi==-1) shi=23;write_1602(6,shi);write_com(0x80+0x40+6);break;case 4:break;}// delay(500);//把松手检测部分去除后,按下后时间一直减小}}}}原理图:。