⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.lst

📁 DS18B20 c51程序(EE21学习板演示程序)
💻 LST
字号:
C51 COMPILER V6.12  DS18B20                                                                10/31/2008 14:32:15 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\ds18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\ds18b20.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*********************************************
   2          **项目: DS18B20驱动程序(EE01学习板演示程序)
   3          
   4          **作者:一线工人 
   5          
   6          **网站:电子工程师之家 www.eehome.cn
   7          
   8          *********************************************/
   9          #include <reg52.h>	
  10          
  11          
  12          #define uchar unsigned char 
  13          #define uint unsigned int 
  14          uint temp; 
  15          uchar tplsb,tpmsb;		// 温度值低位、高位字节 
  16          
  17          sbit DQ = P1^3;			// 数据通信线DQ
  18          sbit dm=P1^4;
  19          sbit wm=P1^5;
  20          sbit led=P1^6;
  21          unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
  22                                    0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
  23          						  
  24          unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  25                                    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//带小数的段码表
  26          
  27          /********************** 延时t毫秒***************** */
  28          void delay(uint t)
  29          {
  30   1      	uint i;
  31   1      	while(t--)
  32   1      	{
  33   2      		for (i=0;i<125;i++)	// 对于11.0592M时钟,约延时1ms
  34   2      		{}
  35   2      	}
  36   1      } 
  37          
  38          /*******************产生复位脉冲初始化DS18B20**************/
  39          void reset(void)
  40          {
  41   1      	uint i;
  42   1      	DQ = 0;
  43   1      	i = 100;         //拉低约900us
  44   1      	while (i>0)	i--;	
  45   1      	
  46   1      	DQ = 1;				// 产生上升沿
  47   1      	i = 4;
  48   1      	while (i>0)	i--;
  49   1      }
  50          
  51          /********************* 等待应答脉冲*********************/
  52          void wait(void)
  53          {
  54   1      	uint i;
  55   1      	while(DQ);
C51 COMPILER V6.12  DS18B20                                                                10/31/2008 14:32:15 PAGE 2   

  56   1      	while(~DQ);			// 检测到应答脉冲 
  57   1      	i = 4;
  58   1      	while (i>0)	i--;
  59   1      }
  60          
  61          /********************读取数据的一位,满足读时隙要求**************/ 
  62          bit readbit(void)
  63          {
  64   1      	uint i;
  65   1      	bit b;
  66   1      	DQ = 0;
  67   1      	i++;
  68   1      	DQ = 1;
  69   1      	i++;i++;			// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
  70   1      	b = DQ;
  71   1      	i = 8;
  72   1      	while(i>0) i--;
  73   1      	return (b);
  74   1      }
  75          
  76          /******************* 读取数据的一个字节**************************/
  77          uchar readbyte(void)
  78          {
  79   1      	uchar i,j,b;
  80   1      	b = 0;
  81   1      	for (i=1;i<=8;i++)
  82   1      	{
  83   2      		j = readbit();
  84   2      		b = (j<<7)|(b>>1);
  85   2      	}
  86   1      	return(b);
  87   1      }
  88          
  89          /******************写数据的一个字节,满足写1和写0的时隙要求************/
  90          void writebyte(uchar b)
  91          {
  92   1      	uint i;
  93   1      	uchar j;
  94   1      	bit btmp;
  95   1      	for(j=1;j<=8;j++)
  96   1      	{
  97   2      		btmp = b&0x01;
  98   2      		b = b>>1;		// 取下一位(由低位向高位)
  99   2      		if (btmp)
 100   2      		{
 101   3      			
 102   3      			DQ = 0;
 103   3      			i++;i++;	// 延时,使得15us以内拉高
 104   3      			DQ = 1;
 105   3      			i = 8;
 106   3      			while(i>0) i--;	// 整个写1时隙不低于60us 
 107   3      	   	}
 108   2      		else
 109   2      		{
 110   3      		
 111   3      			DQ = 0;			
 112   3      			i = 8;
 113   3      			while(i>0) i--;	// 保持低在60us到120us之间
 114   3      			DQ = 1;
 115   3      			i++;
 116   3      			i++;
 117   3      		}
C51 COMPILER V6.12  DS18B20                                                                10/31/2008 14:32:15 PAGE 3   

 118   2      	}
 119   1      }
 120          
 121          /************************* 启动温度转换********************/
 122          void convert(void)
 123          {
 124   1      	reset();			// 产生复位脉冲,初始化DS18B20
 125   1      	wait();			// 等待DS18B20给出应答脉冲
 126   1      	delay(1);			// 延时
 127   1      	writebyte(0xcc);		// skip rom 命令
 128   1      	writebyte(0x44);		// convert T 命令
 129   1      }
 130          
 131          /********************* 读取温度值****************************/
 132          uint readtemp(void)
 133          {   float tt;
 134   1      	reset();			// 产生复位脉冲,初始化DS18B20 
 135   1      	wait();			// 等待DS18B20给出应答脉冲
 136   1      	delay(1);			// 延时
 137   1      	writebyte(0xcc);		// skip rom 命令
 138   1      	writebyte(0xbe);		// read scratchpad 命令
 139   1      	tplsb = readbyte();	// 温度值低位字节(其中低4位为二进制的“小数”部分)
 140   1      	tpmsb = readbyte();	// 高位值高位字节(其中高5位为符号位)
 141   1      	temp=tpmsb;
 142   1          temp<<=8;           
 143   1          temp=temp|tplsb;    
 144   1          tt=temp*0.0625;
 145   1          temp=tt*10+0.5;
 146   1          return temp;	
 147   1      }
 148          
 149          /**********************显示程序****************************/
 150          void display(uint temp)			
 151          {
 152   1         uchar A1,A2,A2t,A3;
 153   1         A1=temp/100;
 154   1         A2t=temp%100;
 155   1         A2=A2t/10;
 156   1         A3=A2t%10;
 157   1         P0=0X01; //选通第一位数码管
 158   1         wm=1;
 159   1         wm=0;
 160   1         P0=table[A1];//显示百位
 161   1         dm=1;
 162   1         dm=0;
 163   1         delay(1);
 164   1         P0=0xff;//关位码
 165   1         dm=1;
 166   1         dm=0;
 167   1      
 168   1         
 169   1         P0=0x02;//选通第二位数码管
 170   1         wm=1;
 171   1         wm=0;
 172   1         P0=table1[A2];//显示十位
 173   1         dm=1;
 174   1         dm=0;
 175   1         delay(1);
 176   1         P0=0xff;//关位码
 177   1         dm=1;
 178   1         dm=0;
 179   1        
C51 COMPILER V6.12  DS18B20                                                                10/31/2008 14:32:15 PAGE 4   

 180   1         P0=0x04;//选通第三位数码管
 181   1         wm=1;
 182   1         wm=0;
 183   1         P0=table[A3];//显示个位
 184   1         dm=1;
 185   1         dm=0;
 186   1         delay(1);
 187   1         P0=0xff;//关位码
 188   1         dm=1;
 189   1         dm=0;
 190   1      }
 191          void main(void)
 192          {
 193   1         led=0;
 194   1         delay(1);		// 延时1ms
 195   1         convert();		// 启动温度转换,需要750ms
 196   1         delay(1000);	// 延时1s
 197   1         readtemp();		// 读取温度		
 198   1         while(1)
 199   1         {
 200   2          
 201   2          convert();
 202   2      
 203   2          display(readtemp());
 204   2      
 205   2      }
 206   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    495    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -