基于Proteus的51系列单片机设计与仿真

源代码在线查看: ds18b20温度采集的设计.c

软件大小: 4176 K
上传用户: wendaoysh
关键词: Proteus 51系列 单片机设计 仿真
下载地址: 免注册下载 普通下载 VIP

相关代码

				/************************************************************************
				           DS18B20测量温度
				*************************************************************************/
				#include "reg51.h"
				#define uchar unsigned char 
				#define uint unsigned int
				sbit DQ=P3^0;
				sbit p20=P2^0;
				sbit p21=P2^1;
				sbit p22=P2^2;
				sbit p23=P2^3;
				code uchar tab[]={ 0XC0,0XF9,0XA4,0XB0,0X99, //0~9
								   0X92,0X82,0XF8,0X80,0X90};	       
				code uchar tab1[]={0X40,0X79,0X24,0X30,0X19, //0~9 
								   0X12,0X02,0X78,0X00,0X10};					        
				uchar  a,b,t,h;
				uchar  bai,shi,ge,xiao;
				void delay(unsigned int i)
				{
				     while(i--);   
				}
				//初始化函数
				bit int_DS18B20(void)
				{
				unsigned char x=0;
				 DQ = 1;    //DQ复位
				 delay(8);  //延时片刻
				 DQ = 0;    //单片机将DQ拉低
				 delay(80); //精确延时大于480us
				 DQ = 1;    //拉高总线
				 delay(14);
				 x=DQ;      //延时片刻后,如果x=0则初始化成功,x=1则初始化失败
				 delay(20);
				return x;
				}
				//读一个字节
				Read(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(4);
				 }
				 return(dat);
				}
				//写一个字节
				Write(unsigned char dat)
				{
				 unsigned char i=0;
				 for (i=8; i>0; i--)
				 {
				  DQ = 0;
				  DQ = dat&0x01;
				  delay(5);
				  DQ = 1;
				  dat>>=1;
				 }
				delay(4);
				}
				//启动转换
				void int__(void)
				{         
				   while(int_DS18B20());//如果为一重新初始化
				   Write(0xCC); // 跳过读序号列号的操作
				   Write(0x44); // 启动温度转换
				}
				void  main(void)
				{       
				   uint count=0;
				   P2=0X00;
				   int__();//启动转换
				   delay(2200);
				     for(count=0;count				       {  p20=1;      //百位
						  P0=tab[0];    //负符号
						  delay(20);
						  p20=0;
				          p21=1;         // 十位
						  P0=tab[0];
						  delay(20);
						  p21=0;			
						  p22=1;         //个位
						  P0=tab[0];
						  delay(0);
						  p22=0;
					      p23=1;         //显示温度标志C
						  P0=0xc6;
						  delay(20);
						  p23=0;
						} 
				   while(1)
					 {              
				       delay(120);
				       while(int_DS18B20());//如果为一重新初始化
					   Write(0xCC); //跳过读序号列号的操作
				       Write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
				       a=Read();   //读取温度值低位
				       b=Read();   //读取温度值高位
				          if(b>127)//如果b大于127 说明温度小于0
				             {  a=~a;
				 			    b=~b;
				                a=a>>4;            //低位右移4位,舍弃小数部分
				                t=b				                t=t|a; 
				                t+=1;
				                shi=t/10;
				                ge=t-shi*10;
						     for(count=0;count				                {  if(t>=10)  
									 { p20=1;      //百位
									   P0=0xBF;    //负数符号
									   delay(20);
									   p20=0;
				                       p21=1;     // 十位
									   P0=tab[shi];
									   delay(20);
									   p21=0;
							           p22=1;     //个位
									   P0=tab1[ge];
									   delay(20);
									   p22=0;
				                       p23=1;    //显示温度标志C
									   P0=0xc6;
									   delay(20);
									   p23=0;
									 }
									 else
									 { p20=0;
				                       p21=1;   // 十位
									   P0=0xBF;    //负符号
									   delay(20);
									   p21=0;		
									   p22=1;         //个位
									   P0=tab1[ge];
									   delay(20);
									   p22=0;
									   p23=1;       //显示温度标志C
									   P0=0xc6;
									   delay(20);
									   p23=0;													   
									  }
								} 
							}
				          else 
				            {   count=0;
							    a=a>>4;            //低位右移4位,舍弃小数部分
				                t=b				                t=t|a;             
				                bai=t/100;
				                shi=(t-bai*100)/10;
						        ge=t-(bai*100+shi*10); 
				              for(count=0;count								  { if(bai) 
								 	   {  p20=1;      //百位
									      P0=tab[bai];
										  delay(20);
										  p20=0;
									    }
				                      else 
										 p20=0;
				                    if(shi)
									   {  p21=1;         // 十位
									      P0=tab[shi];
										  delay(20);
										  p21=0;
									    }
							            p21=0;
				                        p22=1;         //个位
									    P0=tab1[ge];
									    delay(20);
										p22=0;
				                        p23=1;         //小数点
									    P0=0xc6;
				                        delay(20);
									    p23=0;
									 } 
								 } 
				    int__();//启动转换
				      }
				}
							

相关资源