1602的数字时钟加18B20温度传感器

合集下载

用1602LCD与DS18B20设计的温度报警器课程设计

用1602LCD与DS18B20设计的温度报警器课程设计

程设计温度报警器共11页,2759字。

目录设计题目 (3)设计目的 (3)设计任务和要求 (3)设计内容 (3)心得体会 (10)参考文献 (10)一、设计题目:温度报警器二、设计目的:1.了解温度传感器AD590的基本原理、性能与应用。

2.熟悉单片机AT89C51工作方式和应用。

3.掌握ADC0809的接口方法及其输入程序的设计和调试方法。

4.将所学的单片机原理及检测技术的知识运用于实践,解决实际问题。

三、设计任务和要求:本设计采用集成温度传感器AD590,设计一个数字显示的温度报警器。

定安全温度值范围为77°C~100°C(可根据具体需要在程序中进行调整),对在这一范围内的温度变化采集后送入A/D转换器,A/D转换器的模拟电压范围为0~5V。

例如传感器采集的温度为80°C,则对应数码管显示值为80°C。

而温度高出100°C或者低于77°C时,不在安全温度范围之内,喇叭会进行报警、二极管发光显示。

ISIS SCHEMATIC DESCRIPTION FORMAT 6.1=====================================设计的温度报警器\22 用1602LCD与DS18B20设计的温度报警器\用1602LCD与DS18B20设计的温度报警器.DSNDoc. no.: <NONE>Revision: <NONE>Author: <NONE>Created: 08/06/19Modified: 09/03/11*PROPERTIES,0*MODELDEFS,0*PARTLIST,18C1,CAP,22PF,EID=2,PACKAGE=CAP10,PINSWAP="1,2"C2,CAP,22PF,EID=3,PACKAGE=CAP10,PINSWAP="1,2"C3,CAP-ELEC,10uF,EID=4,PACKAGE=ELEC-RAD10D1,LED-YELLOW,高温闪烁,BV=4V,EID=45,IMAX=10mA,ROFF=100k,RS=3,TLITMIN=0.1m,VF=2VD2,LED-YELLOW,低温闪烁,BV=4V,EID=47,IMAX=10mA,ROFF=100k,RS=3,TLITMIN=0.1m,VF=2VK1,BUTTON,正常显示温度,EID=3D,PACKAGE=NULL,R(0)=100M,R(1)=100m,STATE=0,TSWITCH=1mK2,BUTTON,显示报警温度,EID=3C,PACKAGE=NULL,R(0)=100M,R(1)=100m,STA TE=0,TSWITCH=1mK3,BUTTON,显示ROM编码,EID=49,PACKAGE=NULL,R(0)=100M,R(1)=100m,STA TE=0,TSWITCH=1mLCD1,LM016L,LM016L,CLOCK=250kHz,EID=7,MODDLL=LCDALPHA,NUMCOLS=16,NU MROWS=2,PACKAGE=CONN-DIL14,ROW1=80-8F,ROW2=C0-CFLS1,SOUNDER,SOUNDER,BUFFERTIME=500ms,EID=40,MODE=CONTINUOUS,SAMPLE RA TE=44100R1,RES,10k,EID=6,PACKAGE=RES40,PINSWAP="1,2",PRIMTYPE=RESISTORR2,RES,4.7k,EID=43,PACKAGE=RES40,PINSW AP="1,2",PRIMTYPE=RESISTORR3,RES,220,EID=46,PACKAGE=RES40,PINSW AP="1,2",PRIMTYPE=RESISTORR4,RES,220,EID=48,PACKAGE=RES40,PINSW AP="1,2",PRIMTYPE=RESISTORRP1,RESPACK-8,RESPACK-8,EID=24,MODTYPE=DIGITAL,PACKAGE=RESPACK-8U1,AT89C51,AT89C51,CLOCK=12MHz,DBG_FETCH=0,DBG_TRACE=0,EEPROM=0,EID=1 ,HWDOG=0,IRAM=256,ITFMOD=A T89,MODDLL=MCS8051.DLL,PACKAGE=DIL40,PROG RAM="Keil C\用1602LCD与DS18B20设计的温度报警器.hex",ROM=4096,X2=0,XRAM=0 U2,DS18B20,DS18B20,ASN=0,EID=44,FC=28,FORMAT=3.1,ITFMOD=DS1822,MAX=128,M IN=-55,PACKAGE=TO92,SETPOINT=-15.5,SN=B8C530,STA TE=0,STEP=1,TCONV=750ms,T D_WRITE=10ms,TPDH=30u,TPDL=120u,TRACE=1,TRSTL=480u,TSLOT=120uX1,CRYSTAL,12M,EID=5,FREQ=12MHz,PACKAGE=XTAL18220v交流电转5v直流电的电源设计(电路图+详解)一.电路实现功能:电路输入家用220v交流电,经过全桥整流,稳压后输出稳定的5v直流电。

18B20+1602显示

18B20+1602显示
uint readtemp(void)
{
float tt;
reset();
wait();
delay(1);
writebyte(0xcc);// skip rom 命令
writebyte(0xbe);// read scratchpad 命令
tplsb=readbyte();// 温度值低位字节(其中低4位为二进制的"小数"部分)
/********** en=P2^7;**********/
/*********此程序通过实验验证,绝对正确*****/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
en=0;
}
void init1602(void) //1602初始化
{
write1602_com(0x38);//设置显示模式
write1602_com(0x0c);//设置开显示,不显示光标
write1602_com(0x06);//写一个字符后地址加一
write1602_com(0x01);//显示清0
void wait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i=4;
while(i--);
}
bit readbit(void)
{
uint i;
bit b;
DQ=0;
i++;

DS18b20传感器利用1602显示温度电路图

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);}}。

18b20温度传感器与1602液晶显示

18b20温度传感器与1602液晶显示

1602液晶显示,18b20温度传感器综合应用/*时间:20120721显示:temperature;第二行:温度端口:P1是1602数据输入端,P0,P1,P2是液晶控制端P2^7是DQ*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^7;sbit RS=P2^2;sbit RW=P2^1;sbit EN=P2^0;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;P1=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{delay1ms(1);;RS=1;RW=0;EN=0;P1=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{// BLK=0;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;//正温度不显示符号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温度采集+1602显示

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(); //调用温度显示子函数}}/************************************************************************************************************/。

DS18B20与LCD1602结合显示温度汇总

DS18B20与LCD1602结合显示温度汇总
提示:DS18B20外形酷似三极管,分辨引脚时,面对着扁平的那一面,左负右正,一旦接反就会立刻发热,甚至有可能烧毁。
二、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温度传感器与1602的应用

DS18B20温度传感器与1602的应用

RS=0;
//根据规定,RS 和 R/W 同时为低电平时,可以写入指令
RW=0;
E=0;
//E 置低电平(根据表 8-6,写指令时,E 为高脉冲,
// 就是让 E 从 0 到 1 发生正跳变,所以பைடு நூலகம்先置"0"
_nop_();
_nop_();
//空操作两个机器周期,给硬件反应时间
P0=dictate;
DQ = 1;
//释放数据线(将数据线拉高)
for(time=0;time<10;time++)
; //延时约 30us(释放总线后需等待 15~60us 让 DS18B20 输出存在脉冲)
flag=DQ;
//让单片机检测是否输出了存在脉冲(DQ=0 表示存在)
for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0;
//根据规定,RS 为低电平,RW 为高电平时,可以读状态
;
return (flag); //返回检测成功标志
}
/*****************************************************
函数功能:从 DS18B20 读取一个字节数据
出口参数:dat
***************************************************/

DS18B20与LCD1602结合显示温度汇总(可编辑修改word版)

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);外接供电电源输入端

[整理]1602液晶DS1302时钟芯片DS18B20温度传感器

[整理]1602液晶DS1302时钟芯片DS18B20温度传感器

看看我做的万年历,1602液晶+DS1302时钟芯片+DS18B20温度传感器
文章发表于:2007-09-21 16:26。

有兴趣的朋友可以看看这个作品最好的地方是在proteus仿真软件里通过了,这个仿真软件什么都有,对学单片机的人来说是最好的,你什么元件都不用买,写好代码可以就可以仿真了,做出来的效果跟硬件一样,极力推荐大家使用这个仿真软件,我使用这个软件有2年了,我打算在我的小组里写一套教程,一步步上手学会仿真,51单片机爱好者,欢迎加入我创建的小组,以后大家可以一起交流,多提一些意见,有什么好的作品和思想都可以一起交流。

实物图:
实物图:
proteus仿真图:
硬件实物还加入了一个无线遥控模块,可以无线的修改时间内容。

如果你已经安装好proteus了,直接打开那个绿色的文件,就可以直接运行了。

效果跟实物图一样的。

源程序就用KEIL打开。

源程序压缩包:。

单片机应用技术项目5 用LCD1602与DS18B20设计的数字温度计

单片机应用技术项目5  用LCD1602与DS18B20设计的数字温度计
上一页 下一页 返回
五、偏置 LCD的SEG/COM的驱动波形为模拟信号,而各档模拟电压相
对于LCD输出的最高电压的比例称为偏置,而一般来讲,是以 最低一档与输出最高电压的比值来表示。 由此可见51系列单片机的普通IO口不能满足LCD的驱动要求, 需要外加LCD驱动专用芯片来驱动液晶显示,而某些单片机集 成有LCD驱动模块比如PIC系列单片机。
5.1.1 LCD1602的内部结构
一、 LCD简介 LCD ( Liquid Crystal Display )液晶显示器,是利用液晶
分子的物理结构和光学特性进行显示的一种技术。液晶分子是 介于固体和液体之间的一种棒状结构的大分子物质;在自然形态, 具有光学各向异性的特点,在电(磁)场作用下,呈各向同性特 点。 LCD 的构造是在两片平行的玻璃基板当中放置液晶盒, 下基板玻璃上设置薄膜晶体管,上基板玻璃上设置滤光片,通 过极板上的信号与电压改变来控制液晶分子的转动方向,从而 达到控制每个像素点偏振光出射与否而达到显示目的。下面以 直视型简单多路TN/STN LCD Panel(液晶显示面板)的基本结
上一页 下一页 返回
二、 LCD1602简介 1602液晶也叫1602字符型液晶,它能够同时显示16列2行,
即32个字符。它是一种专门用来显示字母、数字、符号等的点 阵型液晶模块。它由32个5X7或者5X11等点阵字符位组成, 每个点阵字符位都可以显示一个字符,每位之间有一个点距的 间隔,每行之间也有间隔,起到了字符间距和行间距的作用, 正因为如此所以它不能很好地显示图形。其优点是微功耗、体 积小、显示内容丰富、超薄轻巧、易于控制,常用在袖珍式仪 表和低功耗单片机应用系统中。实物图和PROTEUS中的模型:
上一页 下一页 返回

数字温度传感器ds18b20程序(含1602显示液晶程序)

数字温度传感器ds18b20程序(含1602显示液晶程序)
wela=0;
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--);

温度显示系统(STC单片机、18B20传感器、1602显示)

温度显示系统(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)前言温度是工业控制中主要的被测参数,随着电子技术和微型计算机的快速发展,温度的测量和控制技术在工业发展中起到了举足轻重的作用。

DS18B20温度传感器和1602液晶制作温度和时间同时显示

DS18B20温度传感器和1602液晶制作温度和时间同时显示

用DS18B20温度传感器和1602液晶制作温度和时间同时显示【含原理图】2009年11月26日星期四22:43C程序如下:/*功能:温度采集显示和可调时钟显示,时钟用中断法实现s1:选择要调节的时、分、秒位s2:时、分、秒加一s3:时、分、秒减一*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar num,s1num,count;uchar shi,fen,miao;sbit rs=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)//延时子函数{uint x,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(uchar dat)//向1602液晶写入数据{rs=1;e=0;P0=dat;delay(5);e=1;delay(5);e=0;}void init_1602()//1602液晶的初始化{uchar i;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(uchar address,uchar temp_dat)//向指定的地址中写入时、分、秒数据{uchar gewei,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 int i)//延时子函数{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){uchar a,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);//把松手检测部分去除后,按下后时间一直减小}}}}原理图:。

温度传感器DS18B及LCD1602的使用

温度传感器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(`函数用于设置光标位置等。

52单片机DS18B20温度计(1602显示)

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();}}。

51单片机lcd1602显示温度源程序18b20测温

51单片机lcd1602显示温度源程序18b20测温

51单片机lcd1602显示温度源程序18b20测温部门: xxx时间: xxx制作人:xxx整理范文,仅供参考,可下载自行修改//////////////////////////////////////////////////////// /// /// ======================================= ///b5E2RGbCAP//// === 作者:Ni的年少W^o轻狂 ========== //// p1EanqFDPw//// === 创建时间:2008.07.03 ========== ////DXDiTa9E3d/// ======================================= ////RTCrpUDGiT// ///5PCzVD7HxA//////////////////////////////////////////////////////jLBHr nAILg///////////////////////////////////////// DS18b20温度传感器 ////////////////////////////////////////////*注:1、当用到循环左移或右移时<>>或<<),不能超出变的范围例如:unsigned char i,j。

j=(i<<8>>>4。

得到的结果出错。

unsigned char j。

unsignedint i。

j=(i<<8>>>4。

得到的结果正确.....2、LCD的清屏时间----1.64ms。

*/#include<reg51.h>#include"LCD1602.h"#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchartmp[4]={0,0,0,0}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1602的数字时钟加18B20温度传感器基于51单片机#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar count,shi,fen,miao,s1num;sbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit we=P3^6;sbit rd=P3^7;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit ds=P2^2;uchar code table1[]="Time: 00:00:00"; uchar code table2[]="TEMP:";//uchar code table[]=" 2012-02-24 mon"; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//1602void write_com(uchar com){rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) {rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){uchar num;wela=0;dula=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);delay(5);write_com(0x80);for(num=0;num<5;num++) {write_date(table2[num]);}write_com(0x80+0x40);for(num=0;num<14;num++) {write_date(table1[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}// 温度的转换void dsInit()//初始化DS18B20{uint i;ds = 0;i = 100; //拉低约800us, 符合协议要求的480us以上while(i>0) i--;ds = 1; //产生一个上升沿, 进入等待应答状态i = 4;while(i>0) i--;}bit readBit()//1位数据{uint i;bit dat;ds = 0;i++; //延时约8us, 符合协议要求至少保持1usds = 1;i++; i++; //延时约16us, 符合协议要求的至少延时15us以上dat= ds;i = 8;while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求return (dat);}unsigned char readByte()//读取一zi jie{unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();dat = (j << 7) | (dat >> 1);}return dat;}void writeByte(uchar dat)//向DS18B20写入一字节数据{uint i;uchar j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;if(b){ds = 0;i++; i++; //拉低约16us, 符号要求15~60us内ds = 1;i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求}else //写"0", 将DQ拉低60us~120us{ds = 0;i = 8; while(i>0) i--; //拉低约64us, 符号要求ds = 1;i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了}}}void sendChangeCmd()//向DS18B20发送温度转换命令{dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化// dsWait(); //等待DS18B20应答delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0x44); //写入温度转换命令字Convert T}//向DS18B20发送读取数据命令void sendReadCmd(){dsInit();// dsWait();delay(1);writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0xbe); //写入读取数据令字Read Scratchpad }//获取当前温度值int getTmpValue(){unsigned int tmpvalue;int value; //存放温度数值float t;unsigned char low, high;sendReadCmd();//连续读取两个字节数据low = readByte();high = readByte();tmpvalue = high;tmpvalue <<= 8;tmpvalue |= low;value = tmpvalue;t = value * 0.0625;value = t*10+0.5; //大于0加0.5, 小于0减0.5(gaidong) return value;}void display(int v){unsigned char count;unsigned char datas[] = {0, 0, 0, 0, 0};uint tmp=v;datas[0] = tmp / 10000;datas[1] = tmp % 10000 / 1000;datas[2] = tmp % 1000 / 100;datas[3] = tmp % 100 / 10;datas[4] = tmp % 10;write_com(0x80+6);if(datas[0] != 0){write_date('0'+datas[0]);}for(count = 1; count != 5; count++){write_date('0'+datas[count]);if(count == 3){write_date('.');}}}//void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void keys()//键盘扫描程序{if(key1==0)//s1键扫描{delay(5);if(key1==0){TR0=0;s1num++;while(!key1)//等待键的释放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(key2==0){delay(5);if(key2==0){while(!key2);switch(s1num){case 1:miao++;if(miao==60) miao=0;write_sfm(12,miao);write_com(0x80+0x40+12);break;case 2:fen++;if(fen==60) fen=0;write_sfm(9,fen);write_com(0x80+0x40+9);break;case 3:shi++;if(shi==24) shi=0;write_sfm(6,shi);write_com(0x80+0x40+6);break;case 4:break;}// delay(500);//把松手检测部分去除后,按下后时间一直增加}}if(key3==0)//s3按键检测,按下s3键后相应的时、分、秒减1操作{delay(5);if(key3==0){while(!key3);//松手检测switch(s1num){case 1:miao--;if(miao==-1) miao=59;write_sfm(12,miao);write_com(0x80+0x40+12);break;case 2:fen--;if(fen==-1) fen=59;write_sfm(9,fen);write_com(0x80+0x40+9);break;case 3:shi--;if(shi==-1) shi=23;write_sfm(6,shi);write_com(0x80+0x40+6);break;case 4:break;}// delay(500);//把松手检测部分去除后,按下后时间一直减小}}if(key4==0){delay(5);if(key4==0){while(!key4);write_com(0x0c);TR0=1;}}}}void main(){we=0;sendChangeCmd();init();while(1){ rd=0;keys();if (count==20){count=0;miao++;if (miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if (shi==24){shi=0;}write_sfm(6,shi);}write_sfm(9,fen);}write_sfm(12,miao);display(getTmpValue());sendChangeCmd();keys();}}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}如果有需要,可以吧仿真图发给大家,请留言‘’‘’‘。

相关文档
最新文档