51单片机读取DS18B20数据1602显示
- 格式:doc
- 大小:37.00 KB
- 文档页数:4
51单片机+1602+DS18B20的温度报警程序+实物设计(按键可调温度阈值)实现功能:51单片机做的温度显示,温度显示在LCD1602液晶屏上。
然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……单片机源程序如下:1./**************************************************************************************2.3.* 基于单片机的实时温度报警系统设计*4.5.(1)DS18b20采集到的温度可以实时地在数码管或者在液晶上显示出来;6.(2)用三个独立键盘设置阀值,包括设置键,加键,减键和确认键;7.(3)按下设置键时,数码管或者液晶上显示2S“H”字,随后温度闪烁显示,进入设置阀值最大值状态;8.再次按下设置键,数码管或者液晶上显示2S“L”字,随后温度闪烁显示,进入设置阀值最小值状态,9.第三次按下设置键(此时相当于确认键),系统保存设置好的阀值并进入正常的温度显示状态;10.(此程序功能与第三点有出入)11.(4)当采集到的温度大于阀值最大值或者小于阀值最小值时蜂鸣器发出声音报警。
12.13.注释:k1:温度加 k2:温度减 k3:低温度阈值设置 k4:高温度阈值设置14.15.适用单片机:STC89C52RC 适用开发板:普中科技 CH—6800ES V2.0 晶振:12MHZ16.17.***************************************************************************************/18.19.#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器20.#include "lcd.h"21.#include "temp.h"22.#include "intrins.h"23.#include "key.h"24.25.typedef unsigned int u16; //对数据类型进行声明定义26.typedef unsigned char u8;27.28.u8 Disp[]= "Temp: ";29.u8 Disp2[]= "Xiaoliyu Design ";30.31.extern unsigned int LTemp; //低阈值温度32.extern unsigned int LLTemp;33.unsigned int DTemp; //高阈值温度34.unsigned int DLTemp;35.36.u16 NowTemp=35; //当前温度37.u16 IntFlag1=0; //外部中断1标志位38.u16 IntFlag0=0; //外部中断0标志位39.40.sbit Beep=P1^5; //设置蜂鸣器引脚41.sbit LA=P2^2;42.sbit LB=P2^3;43.sbit LC=P2^4;44.45.void delay10us(void);46.void delay100us(void);47.void delay10ms(void);48.void delay1s(void);49.void Int1Init();50.void Int0Init();51.void Timer0Init();52.53./*******************************************************************************54.* 函数名 : main55.* 函数功能 : 主函数56.* 输入 : 无57.* 输出 : 无58.*******************************************************************************/59.void main(void)60.{61. u8 i;62. Int1Init(); //外部中断1初始化63. Int0Init(); //外部中断0初始化64. LcdInit(); //LCD1602初始化65. Timer0Init(); //定时器0初始化66.67. LA =1;68. LB =0;69. LC =0;70.71.////////////////////////////////////////////////////////////////////////////////72.73. for(i=0;i<16;i++) //初始化LCD屏(第一行)74. {75. LcdWriteData(Disp[i]);76. }77.78. delay100us();79. LcdWriteCom(0xC0); //初始化LCD屏(第二行)80.81. for(i=0;i<16;i++)82. {83. LcdWriteData(Disp2[i]);84. }85.86. /////////////////////////////////////////////////////////////////////87.88. while(1)89. {90.91. LcdWriteCom(0x85);92. datapros(Ds18b20ReadTemp()); //获取DS18B20温度93. for(i=0;i<11;i++) //温度信息写入160294. {95. LcdWriteData(DisplayData[i]);96. }97.98.99. if(IntFlag1==1) //若外部中断1标志位为1,则进入高温度阈值设置界面100. {101. LcdMenu();102. if(IntFlag1==0) //若外部中断1标志位为0,则退出高温度阈值设置界面103. { //重载温度显示页面参数104. LcdInit();105. for(i=0;i<16;i++)106. {107. LcdWriteData(Disp[i]);108. }109. delay100us();110.111. LcdWriteCom(0xC0);112. for(i=0;i<16;i++)113. {114. LcdWriteData(Disp2[i]);115. }116.117. }118. delay10ms();119.120. }121.122.123. if(IntFlag0==1) //若外部中断0标志位为1,则进入低温度阈值设置界面124. {125.126. LcdMenuL();127. if(IntFlag0==0) //若外部中断0标志位为0,则退出低温度阈值设置界面128. { //重载温度显示页面参数129. LcdInit();130. for(i=0;i<16;i++)131. {132. LcdWriteData(Disp[i]);133. }134. delay100us();135.136. LcdWriteCom(0xC0);137. for(i=0;i<16;i++)138. {139. LcdWriteData(Disp2[i]);140. }141.142. }143. delay10ms();144. }145.146.147. NowTemp=dataReturn(Ds18b20ReadTemp()); //获取当前温度148. DTemp=(LTemp/100); //获取高温度阈值149. DLTemp=(LLTemp/100); //获取低温度阈值150.151. if((NowTemp>=DTemp)|(NowTemp<=DLTemp)) //如果当前温度大于高温度阈值或小于低温度阈值,则打开定时器0启动蜂鸣器152. {153. ET0=1; //打开定时器0中断允许154. led=~led;155. delay10us();156. }157. else158. {159. ET0=0; //关闭定时器0中断允许160. delay10us();161. }162.163. }164.165./////////////////////////////////////////////////////////////////////////// /////166.167.}168.169./************************************************************************** *****170.* 函数名 : delay10ms171.* 函数功能 : 延时函数10ms172.* 输入 : 无173.* 输出 : 无174.*************************************************************************** ****/175.176.void delay10ms(void)177.{178. unsigned char a,b,c;179. for(c=1;c>0;c--)180. for(b=38;b>0;b--)181. for(a=130;a>0;a--);182.}183.184./************************************************************************** *****185.* 函数名 : delay100us186.* 函数功能 : 延时函数100us187.* 输入 : 无188.* 输出 : 无189.*************************************************************************** ****/190.191.void delay100us(void)192.{193. unsigned char a,b;194.for(b=1;b>0;b--)195. for(a=47;a>0;a--);196.}197.198./************************************************************************** *****199.* 函数名 : delay10us200.* 函数功能 : 延时函数10us201.* 输入 : 无202.* 输出 : 无203.*************************************************************************** ****/204.205.void delay10us(void)206.{207. unsigned char a,b;208. for(b=1;b>0;b--)209. for(a=2;a>0;a--);210.}211.212./************************************************************************** *****213.* 函数名 : Int1Init214.* 函数功能 : 延时函数10us215.* 输入 : 无216.* 输出 : 无217.*************************************************************************** ****/218.219.void Int1Init()220.{221. //设置INT1222. IT1=1;//跳变沿出发方式(下降沿)223. EX1=1;//打开INT1的中断允许。
/*本程序为基于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内部ROM完整版本作品运用AT89C51单片机最小系统和一块1602液晶显示电路组成,来读取DS18b20温度传感器的内部编码(身份证号),具体电路接法请下图。
1602与单片机接法温度传感器与单片机接法主函数main.c#ifndef __LCD_H_#define __LCD_H_/********************************** 当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/ #define LCD1602_4PINS/**********************************包含头文件**********************************/#include<reg52.h>//---重定义关键词---//#ifndefuchar#define uchar unsigned char#endif#ifndefuint#define uint unsigned int#endif/**********************************PIN口定义**********************************/ #define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); //误差0us/*LCD1602写入8位命令子函数*/voidLcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/voidLcdWriteData(uchardat);/*LCD1602初始化子程序*/voidLcdInit();#endif1602函数lcd.c#include"lcd.h"/********************************************************** ********************** 函数名: Lcd1602_Delay1ms* 函数功能: 延时函数,延时1ms* 输入: c* 输出: 无* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。
/*************************************************************************************************************** 名称: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(); //调用温度显示子函数}}/************************************************************************************************************/。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit wela=P2^7;sbit dula=P2^6;sbit lcden=P3^4;sbit lcdrs=P3^5;sbit TMDAT=P2^2; //DS18B20的数据输入/输出脚DQ,根据情况设定uint sdata;//测量到的温度的整数部分uchar xiaoshu;//小数uchar code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};void delay(uint count) //延时部分{uchar i;while(count--){for(i=0;i<115;i++);}}void tmreset (void) //发送复位{uchar i;TMDAT=0;for(i=0;i<103;i++);TMDAT = 1;for(i=0;i<4;i++);}bit tmrbit(void) //读一位//{uint i;bit dat;TMDAT=0;i++;TMDAT=1;i++; i++; //微量延时//dat=TMDAT;for(i=0;i<8;i++);return(dat);}uchar tmrbyte(void) //读一个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmrbit();dat=(j<<7)|(dat>>1);}return(dat);}void tmwbyte (uchar dat) //写一个字节{uchar j,i;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){TMDAT=0; //写0i++;i++;TMDAT=1;for(i=0;i<8;i++);}else{TMDAT=0; //写0for(i=0;i<8;i++);TMDAT=1;i++;i++;}}}void tmstart (void) //发送ds1820 开始转换{tmreset(); //复位delay(1); //延时tmwbyte(0xcc); //跳过序列号命令tmwbyte(0x44); //发转换命令44H,}void tmrtemp (void) //读取温度{uchar a,b;tmreset(); //复位delay(1); //延时tmwbyte(0xcc); //跳过序列号命令tmwbyte(0xbe); //发送读取命令a=tmrbyte(); //读取低位温度b=tmrbyte(); //读取高位温度sdata=a/16+b*16; //整数部分xiaoshu=(a&0x0f)*10/16; //小数}void DS18B20PRO(void){tmstart();//dmsec(5); //如果是不断地读取的话可以不延时//tmrtemp(); //读取温度,执行完毕温度将存于TMP中// }void write_com(uchar com){lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P3=date;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){dula=0;wela=0;lcden=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void dis(){init();write_data(table[sdata/10]);write_data(table[sdata%10]);write_data(0xa5);write_data(table[xiaoshu]); }void main(){while(1){DS18B20PRO();dis();delay(1000);}}。
DS18B20+PIC测温用1602显示温度C程序//熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度//1、第一行显示:Temperature//2、第二行显示:实测温度值//*********************************************** ***//*********************************************** ***//硬件设置://1、SW2,SW4开关全部断开//2、插上DS18B20温度传感器//*********************************************** ***//*********************************************** ***//*****************定义头文件**********************//**************************************************#include;#include "delay.h"//*********************************************** ***//******************定义配置位*********************//*********************************************** ***__CONFIG(0x3545);//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器//*********************************************** ***//******************定义常量***********************//*********************************************** ***#define uchar unsigned char#define uint unsigned int//*********************************************** ***//***************定义DS18B20引脚*******************//*********************************************** ***#define DQRE0#define DQ_IO TRISE0//*********************************************** ***//******************定义LCD引脚*********************//*********************************************** ***#define RS RA1#define RW RA2#define E RA3//*********************************************** ***//******************定义变量***********************//*********************************************** ***uchar lowtemp,hightemp; //低8位温度变量,高8位温度变量uchar zhengshu,xiaoshu; //温度整数变量,温度小数变量uint temperature;//转换后的温度值BCD码形式uchar temp[7];//转换后温度存放变量//*********************************************** ***//******************定义数据***********************//**************************************************//显示: Temperature//显示:WWW*PICAVR*COMconst uchar name[16]=//{0x20,0x20,0x20,0x54,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x20};{0x20,0x57,0x57,0x57,0x2E,0x50,0x49,0x43,0x41,0x5 6,0x52,0x2E,0x43,0x4F,0x4D,0x20};//*********************************************** //函数名:delayms(uchar time);//入口参数:time//出口参数:无//函数作用:毫秒延时//说明://*********************************************** void delayms(uchar time){uint i;while(time--){for(i=93;i>;0;i--){;}}}//*********************************************** //函数名:port_init();//入口参数:无//出口参数:无//函数作用:端口初始化//说明://*********************************************** void port_init(void){ADCON1=0X07;//设置RA,RE口为数字口TRISA=0X00;//设置RA口为输出口TRISD=0X00;//设置RD口为输出口TRISE=0X00;//设置RE口为输出口OPTION=0X8F;//分频给WDT,分频比为128}//*********************************************** //函数名:lcd_enable();//入口参数:无//出口参数:无//函数作用:LCD写使能//说明://*********************************************** void lcd_enable(void){RS=0;//写命令RW=0;//写操作E=0;//低电平信号delayms(10); //低电平信号保持E=1;//拉高电平信号}//*********************************************** //函数名:lcd_writebyte(uchar data);//入口参数:data//出口参数:无//函数作用:LCD写一个字节数据//说明://*********************************************** void lcd_writebyte(uchar data){PORTD=data;//向RD口写数据RS=1;//写数据RW=0;//写操作E=0;//低电平信号delayms(10); //低电平信号保持E=1;//拉高电平信号}//*********************************************** //函数名:lcd_writedata(const uchar *ptt);//入口参数:*ptt//出口参数:无//函数作用:LCD写数据块函数//说明://*********************************************** void lcd_writedata(const uchar *ptt){uchar i;for(i=0;i;0;i--)//写8位数据{temp=data&0x01;//先写低位数据DQ_IO=0;//设置RE0为输出口DQ=0;//RE0输出低电平DelayUs(1);//延时6us(15us之内把数据送到总线上)if(temp){DQ_IO=1;} //设置RE0为输入口(写1时序) DelayUs(25);//延时61us(总线采样时间15-60us)DQ_IO=1;//设置RE0为输入口(写0时序)DelayUs(1);//延时6us(写第二位时间间隙大于1us)data=data>;>;1;//右移一位}}//*********************************************** //函数名:ds18b20_readbyte();//入口参数:无//出口参数:无//函数作用:DS18B20读一个字节数据//说明://*********************************************** unsigned char ds18b20_readbyte(void){uchar i,data=0;//读出温度for(i=8;i>;0;i--)//读8位数据{data=data>;>;1;//数据先右移一位DQ_IO=0;//设置RE0为输出口DQ=0;//RE0输出低电平DelayUs(1);//延时6us(低电平时间大于1us)DQ_IO=1;//拉高总线,产生读时间间隙(设置RE0为输入口) DelayUs(1);//延时6us(从拉低电平开始15us之内完成读位)if(DQ){data=data|0x80;} //先读高位数据,高位为1else {data=data|0x00;} //高位为0DelayUs(25);//延时61us(从拉低电平开始60-120us之内释放总线)}return(data);}//*********************************************** //函数名:read_ds18b20_data();//入口参数:无//出口参数:无//函数作用:读DS18B20测试的温度数据//说明://*********************************************** void read_ds18b20_data(void){DQ_IO=1;//设置RE0为输入口ds18b20_reset();//调用复位函数ds18b20_writebyte(0XCC);//跳过ROM匹配ds18b20_writebyte(0X44);//发送温度变换命令ds18b20_reset();//再次复位ds18b20_writebyte(0XCC);//跳过ROM匹配ds18b20_writebyte(0XBE);//发送读温度命令lowtemp=ds18b20_readbyte();//读出低8位温度值hightemp=ds18b20_readbyte();//读出高8位温度值DQ_IO=1;//释放总线zhengshu=((lowtemp>;>;4)|(hightemp<<4))&0X3F; xiaoshu=lowtemp<<4;temp[0]=(zhengshu/100)%10;//整数百位temp[1]=(zhengshu/10)%10;//整数十位temp[2]=zhengshu%10;//整数个位temperature=0;if(xiaoshu&0x80)//下面是把小数部分转换为BCD码形式 {temperature+=5000;}if(xiaoshu&0x40){temperature+=2500;}if(xiaoshu&0x20){temperature+=1250;}if(xiaoshu&0x10){temperature+=625;}temp[3]=(temperature/1000)%10;//十分位temp[4]=(temperature/100)%10;//百分位temp[5]=(temperature/10)%10;//千分位temp[6]=temperature%10;//万分位DelayUs(1);//延时6us}//*********************************************** //函数名:lcd_display_temp();//入口参数:无//出口参数:无//函数作用:LCD显示测试温度程序//说明://*********************************************** void lcd_display_temp(void){PORTD=0X80;//设置第1行显示地址lcd_enable();lcd_writedata(name);//调用显示函数PORTD=0XC0;//设置第2行显示地址lcd_enable();//调用写使能函数lcd_writebyte(0x20);lcd_writebyte(0x20);lcd_writebyte(0x20);if(temp[0]==0){lcd_writebyte(0x20);}else{lcd_writebyte(temp[0]+0x30);}lcd_writebyte(temp[1]+0x30);lcd_writebyte(temp[2]+0x30);lcd_writebyte(0x2e);lcd_writebyte(temp[3]+0x30);lcd_writebyte(temp[4]+0x30);lcd_writebyte(temp[5]+0x30);lcd_writebyte(temp[6]+0x30);lcd_writebyte(0x20);lcd_writebyte(0x43);lcd_writebyte(0x20);lcd_writebyte(0x20);lcd_writebyte(0x20);}//*********************************************** //函数名:main();//入口参数:无//出口参数:无//函数作用:MAIN函数//说明://*********************************************** void main(void){port_init();//调用端口初始化函数lcd_init();//调用LCD初始化函数while(1){read_ds18b20_data(); //调用温度转换函数CLRWDT();//清看门狗lcd_display_temp(); //调用温度显示函数}}。
/***********************************************程序名称:DS18b20温度显示编写:wdc日期:2010-4-27简要说明:使用DS18b20A/D转化器,P3^7接数据I/O口DQ,P2^0-P2^7接1602的D0-D7,P3^0接rs,P3^1接r/w,P3^2接en 函数列表:void delay(int a);延时,以us计算void delayms(int z); 延时,以ms计算unsigned char reset(void) 复位程序unsigned char read_bit(void) 从DS18b20读一个位unsigned char read_byte(void) 从DS18b20读一个字节void write_bit(char bitval) 向DS18b20写一个位void write_byte(char val) 向DS18b20写指令一个字节void tmconvert(void) 温度转化int gettm(void) 读取温度修改记录:增加1602显示:void display(long m)定时器0中断:void timer0() interrupt 1***********************************************/#include <reg51.h>#define uchar8 unsigned char#define uint16 unsigned intuchar8 dis[6] = { 0, 0, 0, 0, 0, 0 };uchar8 code wendu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //0到9的代码uchar8 code name[]={"by:wdc 2010-5-1"};uchar8 flag,sig; //flag用于判定是否有中断,sig判定温度符号sbit rs = P3^0; //1602 数据/命令sbit rw = P3^1; // 读/写sbit en = P3^2; // 使能端sbit DQ = P3^7; //18b20与单片机连接的DQ总线/*延时函数*/void delay (int us) //DELAY-11.0592MHZ 调用程序大约为24us,每次循环为16us {int s;for(s=0;s<us;s++);}void delayms(int z) //z为毫秒数{int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}/**********************函数名称:写指令输入参数:指令输出参数:数据口输出指令功能:对1602执行特定命令***********************/void write_com(uchar8 com) //写指令{delayms(5);rs = 0; //选择写指令rw = 0;P2 = com;en = 1; //en先1后0为高脉冲delayms(5);en = 0;}/**********************函数名称:写数据输入参数:数据,字母则是ASCIL值输出参数:数据口输出数据功能:令1602显示数据***********************/void write_dat(uchar8 dat) //写数据{delayms(5);rs = 1; //选择写数据rw = 0;P2 = dat;en = 1; //en先1后0为高脉冲delayms(5);en = 0;}/**********************函数名称:初始化输入参数:无输出参数:无调用函数:void w_cmd(uchar cmd)功能:对1602进行初始化,具体过程应严格参照产品说明书***********************/void init(viod) //初始化{TMOD=0x01; //定时器0设为工作方式1TH0 =0x3c; //(65536-50000)/256;TL0 =0xb0; //(65536-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0rw = 0; //读/写置低write_com(0x38); //设置16x2显示,5x7点阵,8位数据口write_com(0x08); //显示关闭write_com(0x01); //显示清屏,数据指针以及所有显示清零write_com(0x06); //读写数据,光标及数据指针加一write_com(0x0c); //开显示,光标不显示}/***************函数名称:写字符串输入参数:字符串首地址输出参数:无功能:使1602显示字符串****************/void write_char(uchar8 *cha) //字符串的输入{uchar8 i = 0;while (cha[i] != 0){write_dat(cha[i]); //写一个数据i++; //i自加一次delayms(50); //延时50ms}}/*复位程序*/unsigned char reset(void){uchar8 presence;DQ=0; //拉低总线。
LCD1 twice/////////////////////////////////////////////////////III ////// ======================================= //b5E2RGbCAP //// ===作者:Ni 的年少 W A O 轻狂========== //// plEanqFDPw //// ===创建时间:2008.07.03 ========== //// DXDiTa9E3d/// =======================================////RTCrpUDGiT///// 5PCzVD7HxA//////////////////////////////////////////////////////jLBHrnAlLg//////////////////////////////////// ///// DS18b20 温度传感器////////////////////////////////////////////*注:1、当用到循环左移或右移时 <>> 或 <<),不能超出变的范围例如:un sig ned char i,j 。
j=(i<<8>>>4得到的结果出错。
un sig ned char j 。
unsignedint i 。
j=(i<<8>>>4。
- b i»'is'PODXADClKTAL2RSTFu 1/ADl P&.2XAD2 PD 3怕D3 FO.OAIK P0.«/AM P0.7XAD7 卩工唤PSEN 叱担⑴ P2.-3/A11 ALE P2.4/A1JEAP1J 5JA1SP2J8M14P2.7;A15 P1.D P3.O/RXDP1.1 PM ™ PI.2 P3.2/INTD PI.3 P3 3/INTIPI.4PI.5 F3.57T1Pl.6 p 财硕 PI.7F3.7/1RDNOU TEF1P : -49 163°iishenton9弍 ... I:.代「旳匚引203Q_3i 85SBSaBb?4 毎--R1J weDOOND ••3S1SB2F「:斗It 26,2L28 16得到的结果正确••…2、LCD 的清屏时间 ——1.64ms 。