温度值精确到0.1度,lcd1602显示
- 格式:doc
- 大小:25.50 KB
- 文档页数:4
单片机课程设计与制作任务书专业:学号:姓名:一、设计题目:字符型LCD显示的温度计二、设计要求:1、利用DS18B20作为传感器,将温度数据送入51单片机内部,数据处理后,通过字符型LCD(型号:1602)显示出来。
2、显示温度的精度:0.1°C。
3、能设置告警的上下限温度。
三、设计内容:硬件设计、软件设计及样品制作四、设计成果形式:1、设计说明书一份(不少于4000字,附PROTEL绘制的电路原理图及程序清单);2、样品一套。
五.完成期限:200 年月日指导教师:年月日教研室:年月日设计思路及关键技术一、系统总体结构本设计由温度传感器、单片机、LCD显示模块和按键等构成。
单片机是集成的IC芯片,只需根据实际选型。
其他部分都需要根据应用要求和性能指标自行设计。
系统框图如图1—1所示:二、关键设计方法1、硬件电路设计①该系统采用AT89S51单片机作为控制中心,负责数据处理、显示控制等功能。
②温度传感器方案1:测温度采用热敏电阻温度传感器,如00C时电阻为50Ω,1000C时电阻为70Ω左右。
先经放大,再经V/F转换后接入单片机T0引脚,作为脉冲计数。
方案2:测温度采用热敏电阻温度传感器,如00C时电阻为50Ω,1000C时电阻为70Ω左右。
先放大,送入A/D转换器ADC0809,转换值送入单片机进行数据处理转换成温度值。
方案3:采用数字化温度传感器DS18B20.建议采用方案3。
③LCD显示当前测量的温度采用字符型液晶显示器1602,液晶显示器以其微功耗、体积小、显示内丰富、使用方便等诸多优点,在通信、仪器仪表、电子设备等低功耗应用系统中得到越来越广泛的应用。
2、DS18B20使用简介由于DS18B20 单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要.系统对DS18B20的各种操作必须按协议进行.操作协议为:初始化DS18B20(发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据.主机控制DS18B20完成温度转换的程序必须经过3个步骤:初始化、ROM操作指令、存储器操作指令.假设单片机系统所用的晶振频率为12MHz,根据DS18B20的初始化时序、写时序和读时序,分别编写3个子程序:INIT为初始化子程序,WRITE 为写(命令或数据)子程序,READ为读数据子程序,所有的数据读写均由最低位开始.主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每1s 进行一次,流程图如图1—2。
温度值精确到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();//显示}}不好意思哈,昨晚很早就下了。
lcd1602液晶屏显示原理LCD1602液晶屏显示LCD1602液晶屏是一种广泛应用于嵌入式系统中的设备,其主要作用是显示文字和图像。
下面我们将从液晶屏的基本构成、显示原理、控制方式等方面进行详细介绍。
基本构成LCD1602液晶屏的主要构成有以下几个部分:•LCD显示区域:是液晶屏的主要显示部分,通常由16x2的字符点阵组成。
•背光源:为了方便在低光环境下观察屏幕内容,液晶屏通常都有背光源,可以显示白色、蓝色等不同颜色。
•驱动电路板:液晶屏需要通过电路来进行控制。
驱动电路板是一个电路板,上面有各种电子元器件,如芯片、晶振、电容、电阻等。
显示原理LCD1602液晶屏工作的原理是基于液晶分子的光学变化。
液晶屏的显示区域由若干个液晶单元组成,每个液晶单元是由一个薄膜晶体管(TFT)和一个电容组成的。
当液晶单元受到电压作用时,会发生形变,从而改变光线的传播方向,从而实现显示。
控制方式LCD1602液晶屏的控制方式通常采用微处理器进行控制。
常用的控制方式有以下几种:•8位并行控制:使用8根数据线,可以同时传输8位二进制数据,速度快,适用于需要传输大量数据的应用场景。
•4位并行控制:使用4根数据线,需要进行两次数据传输才能完成一次指令或数据的传输,速度比较慢,但可以降低接口引脚数量,适用于资源受限的系统。
•串行控制:使用单根数据线,数据按照一定的格式进行传输,速度较慢,但可以进一步减少接口引脚数量。
总结综上所述,LCD1602液晶屏是一种常用于嵌入式系统中的设备,其所采用的液晶分子光学变化原理是实现显示的基础,常用的控制方式有8位并行控制、4位并行控制和串行控制三种。
液晶屏在嵌入式系统中发挥着重要的作用,广泛应用于各种计算机设备、仪器仪表、通讯设备等方面。
接下来,我们将详细介绍液晶屏的控制流程和相关指令。
控制流程LCD1602液晶屏的控制流程通常包括以下大致步骤:1.初始化液晶屏:向液晶屏发送一系列指令,包括设置接口方式、显示模式、光标定位等。
lcd1602显示原理
LCD1602显示原理是利用液晶技术实现显示的一种方法。
它由16行2列的字符组成,每个字符由5×8的点阵组成。
在每个字符的背后都有一个液晶单元,通过控制液晶单元来控制字符的显示。
液晶单元是由两片平行的玻璃衬底组成,中间夹着液晶材料。
当没有电场作用在液晶材料上时,液晶材料呈现出类似于玻璃的透明状态。
而当有电场作用在液晶材料上时,液晶材料会发生变化,变得无法透过光线,从而产生黑色或其他颜色。
LCD1602显示原理是通过控制电压的加减来改变液晶单元的透明度,从而实现字符的显示。
当给液晶单元加上电压时,液晶材料会对光产生影响,使得光无法透过。
而当断开电压时,液晶材料会恢复透明状态,光可以透过。
通过对每个字符的液晶单元施加适当的电场,就可以实现字符的显示。
控制LCD1602显示的电路通常由驱动芯片和控制器组成。
驱动芯片负责产生所需的电场,控制器负责发送命令和数据到驱动芯片。
通过控制器发送特定的命令和数据,就可以让驱动芯片产生适当的电场,从而实现字符的显示。
总之,LCD1602显示原理是通过控制液晶单元的透明度来实现字符的显示,通过电压的加减来改变液晶单元的状态,从而产生黑色或其他颜色,最终完成字符的显示。
LCD1602及其控制器的基本显⽰⽅法LCD显⽰及键盘⽤法LCD1602及其控制器的基本显⽰⽅法向LCD输⼊的数据为ASCII码,需要通过数码扫描依次送到LCD显⽰,下⾯介绍LCD 控制器IP核LCD16X2A及其相关程序。
逻辑符号如下图:U_lcd_ctrl模块即为该控制器核在AltiumDesinger原理图中的符号表⽰。
其作⽤是接受前⾯⽤户⾃⼰的逻辑单元送来的ASCII码数据和控制信号,然后与外部的LCD显⽰器通讯,显⽰相应字符。
数据总线使⽤输⼊输出分离模式,IP核后⾯需要增加双向BUF控制单元(U8)。
L CD控制器端⼝说明如下:⽤户控制逻辑接⼝:CLK:控制器⼯作时钟,上升沿有效RST:复位信号,⾼电平有效DA TA[7..0]:ASCII码数据总线ADDR[3..0]:字符在LCD屏幕上的地址(共两⾏,每⾏16个字符)ADDR=“0000”~“1111”对应每⾏的第0~15个字符LINE:LCD1602屏幕上的⾏选择信号,LINE=0时数据在第⼀⾏显⽰,LINE=1时数据在第⼆⾏显⽰BUSY:控制器忙信号,数据未显⽰稳定时BUSY=1;反之为0STROBE:数据输⼊有效使能,⾼电平有效LCD显⽰器接⼝:LCD_E:LCD显⽰器使能LCD_RW:LCD读写⽅向控制LCD_RS:LCD命令,数据选择LCD_DA TA_TRI:LCD数据⾼阻态控制LCD_DA TAO:LCD数据输出总线LCD_DA TAI:LCD数据输⼊总线控制器⼯作原理如下:A 控制器复位当RST信号有效时(⾼电平),控制器进⼊LCD复位与初始化操作,此时,BUSY信号持续⾼电平,表⽰控制器忙,LCD不能进⾏⽤户请求的操作。
RST信号由⾼变低后的⼤约80us之后,LCD控制器初始化完成,可以响应⽤户的操作请求,此时,BUSY信号变低。
LCD处于显⽰模式。
B 字符显⽰上电后的LCD必须初始化⼀次,之后LCD控制器停留于“WAIT FOR DA TA”状态。
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();//显示}}。
LCD1602原理与显示程序LCD1602的原理是基于液晶显示技术。
液晶是一种特殊的物质,具有双折射性质,即能将入射的光线分成两束,通过改变液晶分子的排列方式,可以改变其双折射的性质,从而使得光线透过液晶时会发生偏转。
LCD1602利用这一原理,在液晶显示面板上设置了16列和2行的像素点阵,通过控制每个像素点的液晶分子的排列方式,来实现字符的显示。
初始化是指在使用LCD1602之前,需要对其进行一系列的初始化操作,以确保其正常工作。
具体的初始化步骤如下:1.设置通信协议:LCD1602可以通过并行接口和串行接口进行通信,根据具体的接口方式,选择相应的通信协议。
2.设置工作模式:LCD1602有两种工作模式,分别是4位模式和8位模式。
选择适合的工作模式,并设置相应的控制寄存器。
3.设置显示模式:LCD1602可以显示不同的字符集,如英文字符、数字、特殊符号等。
选择合适的字符集,并设置显示模式。
4.清除显示:设置清除显示寄存器,将显示区域清空。
5.光标设置:设置光标位置和显示方式,如光标是否闪烁、光标位置等。
完成初始化后,就可以将要显示的数据写入LCD1602数据写入是指将要显示的字符或数字写入到LCD1602的显示区域。
具体的数据写入步骤如下:1.设置光标位置:根据需要显示的字符位置,设置光标的位置。
2.数据写入:通过通信接口,将要显示的数据写入到LCD1602的数据寄存器。
3.延时:由于LCD1602的刷新速度较慢,需要等待一定的时间,使得数据能够稳定显示在液晶屏上。
4.更新光标位置:根据数据的长度和显示方式,更新光标的位置。
通过以上的步骤,就可以实现LCD1602的显示功能。
总结起来,LCD1602的原理是基于液晶显示技术,通过控制液晶分子排列方式来实现字符的显示。
其显示程序包括初始化和数据写入两个方面的内容,通过设置通信协议、工作模式、显示模式等参数,并将要显示的数据写入到LCD1602的显示区域,来实现字符的显示。
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();//显示}}。
多功能智能插排摘要该多功能智能插排系统由检测部分、控制部分、显示部分以及执行部分组成,控制部分由STC89C51单片机,键盘电路,继电器,报警电路等部分组成,显示部分由1602液晶显示器组成,检测部分由18B20温度传感器,光传感器模块等组成,获得室内环境的温度和光强,传送给STC89C51单片机控制部分。
其主要功能有三:1:根据输入的时间定时控制插座的通断;2:根据室内温度值高低自动控制插座通断;3:根据室内光的强度自动控制插座的通断;使用者可以根据控制终端的液晶显示、报警、以及实际情况通过系统良好的人机交互能力键盘输入来实现自己想要的功能。
0 引言随着家用电器、视听产品的普及,办公自动化的广泛应用,越来越多的产品有了待机功能,造成了安全防患和大量的能源浪费。
插排作为各种电器的与电网的连接部件,同时作为物联网基础设施的一部分,其承担的任务将变得越来越重大,然而现今插排由于其功能的单一性,很难满足发展的要求。
经研究调查,对用电器的用电方式归纳如表1所示:表1用电器用电方式用电器种类用电方式归纳功能需求洗衣机、空调、路灯定时接通电源定时接通等普通空调、路灯、风扇等根据环境自动通断电源自动接通电饭锅、电磁炉等定时接通电源定时接通本文设计的智能插排实现了定时接通和自动接通的功能,满足上表中用电方式的需求,旨在利用智能插排控制家用电器实现对环境的监控以及自动控制,调节室内的温度和光源,提供一个舒适适宜的居住环境,定时控制电源的通断,满足人们对电器更加人性化和智能化的需求。
本文所设计的系统结合了传感器技术,单片机控制,1602液晶显示,继电器的使用等多种技术,经过相应的改善与改造后,可以有效的根据室内的温度光强等环境因素的改变,及时的通过控制终端来加以控制调整,同时其具有很好的可移植性和稳定性,可以应用于多种场所,具有很重要的现实意义。
目录第一章系统功能1.1 、系统功能描述1.2、功能指标第二章系统总体设计方案2.1、硬件框架图2.2、主芯片控制模块2.3、1602液晶显示电路2.4、键盘电路2.5、18B20温度采集电路2.6、光照强度检测电路2.7、继电器控制电路第三章软件设计3.1 、系统软件流程图3.2 、温度检测模块3.3 、光强度检测模块3.4 、键盘编程第四章系统测试第五章结论第六章附录6.1、器件清单6.2、系统整体电路图6.3、系统实际真实图片6.4、程序代码第一章系统功能1.1 系统功能描述1)键盘键入插座通断时间,定时通断插排思路来源:如今很多农村家庭及中产阶级家庭,尤其在冬天,早上想多睡一会儿,但又不得不起床煮饭,使用此系统可以在隔天晚上准备好一切,然后键入第二天早上想要煮饭的时间,到时即可自动通电煮饭,起床就可以吃到热乎乎的米饭了。
lcd1602显示温度课程设计一、课程目标知识目标:1. 学生能理解LCD1602显示屏的基本原理和结构。
2. 学生能掌握温度传感器与LCD1602的连接方法。
3. 学生能掌握通过编程控制LCD1602显示温度值的方法。
技能目标:1. 学生能够运用所学知识,独立完成温度传感器与LCD1602的硬件连接。
2. 学生能够编写程序,实现温度的实时采集和LCD1602显示。
3. 学生能够通过课程实践,培养动手操作能力和问题解决能力。
情感态度价值观目标:1. 学生在学习过程中,培养对电子制作和编程的兴趣,提高探究精神。
2. 学生通过小组合作,培养团队协作能力和沟通能力。
3. 学生能够认识到科技在生活中的应用,增强学以致用的意识。
课程性质:本课程为电子技术实践课程,结合理论知识,注重培养学生的动手操作能力和实际问题解决能力。
学生特点:学生处于初中年级,已具备一定的物理知识和电子制作基础,对新鲜事物充满好奇心。
教学要求:结合学生特点,注重理论与实践相结合,引导学生主动探究,培养创新意识。
将课程目标分解为具体的学习成果,以便在教学过程中进行有效评估。
二、教学内容1. 理论知识:- 温度传感器原理与分类- LCD1602显示屏的工作原理与结构- 单片机与LCD1602的接口技术2. 实践操作:- 温度传感器与LCD1602的硬件连接- 编程环境搭建与程序编写- 温度采集与LCD1602显示实现3. 教学大纲:- 第一阶段:理论知识学习,介绍温度传感器、LCD1602显示屏原理,以及单片机与LCD1602的接口技术。
- 第二阶段:实践操作,指导学生完成温度传感器与LCD1602的硬件连接,并进行编程环境搭建。
- 第三阶段:编程实践,教授学生编写程序,实现温度的实时采集和LCD1602显示。
4. 教材章节:- 《电子技术基础》第三章:传感器及其应用- 《单片机原理与应用》第四章:显示器与键盘接口技术教学内容安排与进度:- 理论知识:2课时- 实践操作:4课时- 编程实践:3课时教学内容注重科学性和系统性,结合课本知识,确保学生能够在实践中掌握所学内容。
lcd1602显示原理LCD1602显示原理。
LCD1602是一种常见的液晶显示器,广泛应用于各种电子设备中,如数字电子秤、计时器、温度计等。
它具有体积小、功耗低、显示清晰等特点,因此备受青睐。
那么,LCD1602的显示原理是怎样的呢?首先,我们来了解一下LCD1602的结构。
它由1602个像素点组成,每个像素点由液晶分子和玻璃基板构成。
在LCD1602的两块玻璃基板之间,夹有一层液晶材料,当施加电压时,液晶分子会排列成不同的方向,从而改变光的透射和反射,实现显示效果。
LCD1602的显示原理主要涉及到两个重要的概念,驱动电压和像素点控制。
首先,LCD1602需要外部提供驱动电压,一般为正负对称的交流电压。
这样的电压可以使液晶分子排列,从而实现光的控制。
其次,像素点的控制是通过在每个像素点上加上不同的电压来实现的。
通过控制每个像素点上的电压,可以使得液晶分子排列的方向不同,从而显示出不同的图像和文字。
在LCD1602的工作过程中,需要一个控制芯片来实现对像素点的控制。
常见的控制芯片有HD44780和ST7066U等。
这些控制芯片内置了字符发生器和显示控制器,可以通过外部输入的指令和数据来控制LCD1602的显示内容。
通过合理的指令和数据输入,可以实现对LCD1602的清屏、光标控制、字符显示等操作。
此外,LCD1602的显示原理还涉及到驱动板和背光控制。
驱动板是用来控制LCD1602的工作状态的,它可以接收来自控制芯片的指令和数据,并将其转换成像素点的控制信号。
背光控制则是用来控制LCD1602的背光亮度的,一般是通过调节背光电压来实现的。
总的来说,LCD1602的显示原理是通过控制驱动电压和像素点的电压来实现的。
在外部提供驱动电压的同时,通过控制芯片和驱动板的协作,可以实现对LCD1602的显示内容、光标控制和背光亮度的控制。
这样,LCD1602就可以在各种电子设备中得到广泛的应用。
LCD1602数据手册一、概述LCD1602 是一种广泛应用于各类电子设备中的字符型液晶显示模块。
它具有体积小、功耗低、显示清晰等优点,能够显示 16 个字符乘以 2行的信息,非常适合用于显示简单的文本和数据。
二、基本特性1、显示容量:LCD1602 可以显示 32 个字符,即 16 个字符乘以 2 行。
2、工作电压:通常为 5V 直流电源。
3、显示模式:可以显示字母、数字、符号等多种字符。
4、视角范围:具有一定的可视角度,在不同角度下仍能清晰看到显示内容。
三、引脚功能1、 VSS:接地引脚。
2、 VDD:电源引脚,接+5V 电源。
3、 V0:对比度调整引脚,通过外接电位器来调整液晶显示的对比度。
4、 RS:寄存器选择引脚。
当 RS 为低电平时,选择指令寄存器;当 RS 为高电平时,选择数据寄存器。
5、 RW:读写选择引脚。
当 RW 为低电平时,进行写操作;当 RW 为高电平时,进行读操作。
6、 E:使能引脚,下降沿触发。
7、 D0 D7:数据引脚,用于传输指令和数据。
四、指令集1、清屏指令:将显示缓冲区的内容清除,屏幕显示空白。
2、归位指令:使光标回到起始位置,即第一行第一列。
3、输入方式设置指令:用于设置数据的输入方式,如光标移动方向等。
4、显示开关控制指令:控制显示、光标、闪烁等功能的开启和关闭。
5、光标或显示移位指令:使光标或整个显示内容向左或向右移动。
6、功能设置指令:设定数据长度、行数、字形等参数。
7、 CGRAM 地址设置指令:用于自定义字符的地址设置。
8、 DDRAM 地址设置指令:指定显示数据的存储地址。
五、显示缓冲区LCD1602 内部具有显示缓冲区,通过向缓冲区写入数据来控制显示内容。
第一行的地址为 0x00 0x0F,第二行的地址为 0x40 0x4F。
六、初始化设置在使用LCD1602 之前,需要进行初始化设置,包括设置显示模式、输入方式、显示开关等。
以下是一个常见的初始化流程示例:1、延时 15ms 以上。
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());}}}}。
(单片机原理及接口技术)利用LCD1602显示的数字温度计一.课程设计的目的1.进一步熟悉和掌握单片机的结构及工作原理。
2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。
3.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术。
4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
5.通过完成一个包括电路设计和程序开发的完整过程,了解开发一单片机应用系统的全过程,为今后从事相应开发打下基础。
二.课程设计的基本要求1.认真认识设计的意义,掌握设计工作程序,学会使用工具书和技术参考资料,并培养科学的设计思想和良好的设计作风。
2.提高模型建立和设计能力,学会应用相关设计资料进行设计计算的方法。
3.提高独立分析、解决问题的能力,逐步增强实际应用训练。
4.课程设计的说明书要求简洁、通顺,计算正确,图纸表达内容完整、清楚、规范。
5.课程设计说明书封面格式要求见《天津城市建设学院课程设计教学工作规范》附表1。
三.课程设计具体要求a) 要求每位同学独立完成设计任务。
b) 原理图设计1.原理图设计要符合项目的工作原理,连线要正确。
2.图中所使用的元器件要合理选用,电阻、电容等器件的参数要正确标明。
3.原理图要完整,CPU、外围器件、外扩接口、输入/输出装置要一应俱全。
c) 程序调计1.根据要求,将总体功能分解成若干个子功能模块,每个功能模块完成一个特定的功能。
2.根据总体要求及分解的功能模块,确定各功能模块之间的关系,设计出完整的程序流程图。
d) 程序调试1.编写相关程序,并进行仿真。
2.将程序下载到单片机,进行运行调试。
e) 设计说明书1.原理图设计说明简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。
2.程序设计说明对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。
3.画出工作原理图,程序流程图并给出相应的程序清单。
LCD1602显示原理什么是LCD1602显示屏LCD1602是一种常见的字符型液晶显示屏,它可以显示2行16列的字符。
它通常被用于各种电子设备,如智能家居控制面板、温度计、电子钟等。
通过控制液晶显示屏上的液晶模块,我们可以在屏幕上显示各种文字和符号。
LCD1602的工作原理LCD1602采用液晶技术实现文字和符号的显示。
液晶是一种特殊的物质,它可以通过电场来调整光的偏振方向,从而控制光的透过与否。
液晶显示屏上的每个像素点都由液晶模块和驱动电路组成。
液晶模块是由若干个液晶单元组成的,每个液晶单元上有两个透明的电极。
当液晶单元受到电场的作用时,液晶分子会发生取向变化,调整光的偏振方向。
驱动电路会根据输入的控制信号来产生电场,控制每个液晶单元的偏振方向,从而控制像素点的亮暗。
LCD1602的接口与引脚说明接下来我们来了解一下LCD1602的接口与引脚说明:•VSS(Pin1):接地,用于提供LCD1602的电源地。
•VDD(Pin2):电源正极,接5V的电源。
•VO(Pin3):液晶对比度电源,通过调整VO电压可以调整显示屏的对比度。
•RS(Pin4):寄存器选择引脚,用于选择数据寄存器还是指令寄存器。
•RW(Pin5):读写选择引脚,用于选择读操作还是写操作。
•E(Pin6):使能信号引脚,当E为高电平时,数据被写入液晶模块。
•DB0-DB7(Pin7-Pin14):数据引脚,用于传输数据和指令。
•A(Pin15):LED背光的正极,接5V电源,连接一个电流限制电阻。
•K(Pin16):LED背光的负极,接地。
LCD1602的使用步骤下面我们来学习如何使用LCD1602显示屏:1.电源连接:将VSS引脚接地,VDD引脚接5V电源,A引脚和K引脚分别接5V电源和地。
2.供电延时:在开机前,需要给LCD1602提供一段时间的供电延时,通常为20ms以上。
3.初始化:通过控制RS、RW和E引脚,向LCD1602发送特定的指令来初始化显示屏。
LCD1602液晶显示完全资料一、关于LCD1602:在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。
1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E (使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。
以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
除此外,D0~D7分别为8位双向数据线。
2.操作时序:RSR/W操作说明写入指令码D0~D71读取输出的D0~D7状态字1写入数据D0~D711从D0~D7读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。
(即后面的读忙子程序)3.指令集:LCD_1602 初始化指令小结:0x38设置16*2显示,5*7点阵,8位数据接口0x01清屏0x0F开显示,显示光标,光标闪烁0x08只开显示0x0e开显示,显示光标,光标不闪烁0x0c开显示,不显示光标0x06地址加1,当写入数据的时候光标右移0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18光标和显示一起向左移动4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。
5.读写时序:时序图1602手册中有,这里不引用了。
时序图很重要,编程就是根据时序图设置寄存器,让LCD工作。
LCD1602温度符号表示方法一般涉及到的是温度值的显示方式,这个过程中需要使用到液晶显示器。
LCD1602是一款常用的液晶显示器,可以显示基本的文本和数字信息。
关于温度符号,主要使用摄氏度和华氏度两种表示方式。
摄氏度的符号通常为“℃”,而华氏度的符号为“℉”。
对于液晶显示器来说,通常在显示温度时,可能会遇到高温、低温等极端环境,因此在设计上需要考虑液晶显示器的工作环境以及温度对其性能的影响。
如果液晶显示器在过热的环境下工作,可能会导致显示器的性能下降,甚至出现损坏的情况。
因此,在LCD1602液晶显示器上使用时,需要考虑温度对其性能的影响,特别是在极端的环境下使用。
然而,这个问题中提到的温度符号实际上与实际的温度值并没有直接关联。
您可能在询问如何在LCD1602液晶显示器上显示温度符号,这需要考虑到温度值的范围以及LCD1602的分辨率。
一般来说,LCD1602可以显示两位数字的温度值,因此温度符号通常会以简单的数字形式显示,如“0”代表零度,“1”代表一度等。
对于摄氏度和华氏度的表示方式,您可以在LCD1602液晶显示器上分别使用这两种符号来表示。
例如,当显示温度为25摄氏度时,您可以在LCD上显示“25℃”;而当显示温度为77华氏度时,您可以显示“77℉”。
此外,如果需要显示更为详细或特殊的温度单位或符号,您可能需要额外购买一些特殊的功能模块或自行设计一些电路来实现。
最后,要注意的是在实际使用过程中,应该确保液晶显示器的工作环境良好,避免过度操作和撞击等因素对其性能产生影响。
在出现问题时,可以使用测试代码和数据表等方法来检测和修复。
对于如何进行具体的编程实现温度符号的显示,则需要具体看您所使用的编程语言和库函数的具体支持情况。
一般情况下,您可以通过查询相关文档或参考网络教程来获取相关信息。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit 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); //精确延时大于480us
DQ = 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;//正温度不显示符号
else
flagdat=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();//显示
}
}。