单片机 数字温度传感器

  1 #include <reg52.h>
  2 #include <intrins.h>
  3 #define MAIN_Fosc        11059200UL    //ºê¶¨ÒåÖ÷ʱÖÓHZ
  4 /*====================================
  5  ×Ô¶¨ÒåÀàÐÍÃû
  6 ====================================*/
  7 typedef unsigned char INT8U;
  8 typedef unsigned char uchar;
  9 
 10 typedef unsigned int INT16U;
 11 typedef unsigned int uint;
 12 
 13 /*====================================
 14  Ó²¼þ½Ó¿ÚλÉùÃ÷
 15 ====================================*/
 16 sbit DS  = P2^2;   //DS18B20µ¥×ÜÏß
 17 sbit DU  = P2^6;   //ÊýÂë¹Ü¶ÎÑ¡
 18 sbit WE  = P2^7;   //ÊýÂë¹Üλѡ
 19 /*====================================
 20 ¹²Òõ¼«ÊýÂë¹Ü¶ÎÑ¡Âë
 21 ====================================*/
 22 uchar code table[]={ 
 23 //0        1     2     3     4     5     6     7     8
 24 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
 25 //9     A     B       C     D       E     F        -     .      ¹ØÏÔʾ
 26 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
 27                    };
 28 
 29 /*====================================
 30 ÊýÂë¹ÜλѡÂë
 31 ====================================*/
 32                   //µÚ1λ    2λ      3λ     4λ   5λ    6λ      7λ    8λ
 33 uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//ÊýÂë¹ÜλÂë
 34 
 35 /*====================================
 36 º¯Êý£ºvoid Delay_Ms(INT16U ms)
 37 ²ÎÊý£ºms£¬ºÁÃëÑÓʱÐβÎ
 38 ÃèÊö£º12T 51µ¥Æ¬»ú×ÔÊÊÓ¦Ö÷ʱÖÓºÁÃë¼¶ÑÓʱº¯Êý
 39 ====================================*/
 40 void Delay_Ms(INT16U ms)
 41 {
 42      INT16U i;
 43      do{
 44           i = MAIN_Fosc / 96000; 
 45           while(--i);   //96T per loop
 46      }while(--ms);
 47 }
 48 /*usÑÓʱº¯Êý£¬Ö´ÐÐÒ»´ÎUS--ËùÐè6.5us½øÈëÒ»´Îº¯ÊýÐèÒª11.95us*/
 49 void Delay_us(uchar us)
 50 {
 51     while(us--);    
 52 }
 53 /*====================================
 54 º¯Êý£ºvoid Display(INT16U Value)
 55 ²ÎÊý£ºValue,ÏÔʾֵ ȡֵ0-65535
 56 ÃèÊö£º¹²Òõ¼«ÊýÂë¹ÜÏÔʾº¯Êý¿ÉÏÔʾһ¸ö×Ö½ÚµÄÊý
 57 ====================================*/
 58 void Display(INT16U Value)            //×¢ÒâÓÉÓÚÐèÒªÏÔʾµÄÊý´óÓÚÒ»¸ö×Ö½ÚËùÓÐÐβÎÐèΪintÐÍ
 59 {    
 60 //------------------------------
 61     DU = 0;                            //¹Ø±Õ¶ÎÑ¡
 62     P0 = table[Value/100];        //ÊýÂë¹ÜÏÔʾ°Ùλ
 63     DU = 1;                            //´ò¿ª¶ÎÑ¡
 64     DU = 0;                            //¹Ø±Õ¶ÎÑ¡
 65 
 66     WE = 0;                        //¹Ø±Õλѡ
 67     P0 = T_COM[0];                   //µÚһλÊýÂë¹Ü
 68     WE = 1;                        //´ò¿ªÎ»Ñ¡
 69     WE = 0;                        //¹Ø±Õλѡ
 70     Delay_Ms(3);
 71 //-------------------------------
 72     DU = 0;
 73     P0 = table[Value%100/10]|0x80; //ÏÔʾʮλ
 74     DU = 1;
 75     DU = 0;
 76 
 77     WE = 0;
 78     P0 = T_COM[1];              //µÚ¶þλÊýÂë¹Ü
 79     WE = 1;
 80     WE = 0;
 81     Delay_Ms(3);
 82 //-------------------------------
 83     DU = 0;
 84     P0 = table[Value%10];        //ÏÔʾ¸öλ
 85     DU = 1;
 86     DU = 0;
 87 
 88     WE = 0;
 89     P0 = T_COM[2];                //µÚÈýλÊýÂë¹Ü
 90     WE = 1;
 91     WE = 0;
 92     Delay_Ms(3);
 93 }
 94 /*µ¥×ÜÏß³õʼ»¯Ê±Ðò*/
 95 bit ds_init()
 96 {
 97     bit i;
 98     DS = 1;
 99     _nop_();
100     DS = 0;
101     Delay_us(75); //À­µÍ×ÜÏß499.45us ¹Ò½ÓÔÚ×ÜÏßÉϵÄ18B20½«»áÈ«²¿±»¸´Î»
102     DS = 1; //ÊÍ·Å×ÜÏß
103     Delay_us(4); //ÑÓʱ37.95us µÈ´ý18B20·¢»Ø´æÔÚÐźÅ
104     
105     
106     i = DS;
107     Delay_us(20); //141.95us
108     DS = 1;
109     _nop_();
110     return (i);
111 }
112 /*дһ¸ö×Ö½Ú*/
113 void write_byte(uchar dat)
114 {
115     uchar i;
116     for(i=0;i<8;i++)
117     {
118         DS = 0;
119         _nop_();//²úÉúЩʱÐò
120         DS = dat & 0x01;
121         Delay_us(10);//76.95us
122         DS = 1; //ÊÍ·Å×ÜÏß×¼±¸ÏÂÒ»´ÎÊý¾ÝдÈë
123         _nop_();
124         dat >>= 1;
125     }
126 }
127 
128 uchar read_byte()
129 {
130     uchar i, j, dat;
131     for(i=0;i<8;i++)
132     {
133         DS = 0;
134         _nop_();//²úÉú¶ÁʱÐò
135         DS = 1;
136         _nop_();//ÊÍ·Å×ÜÏß
137         j = DS;
138         Delay_us(10);//76.95us
139         DS = 1;
140         _nop_();
141         dat = (j<<7)|(dat>>1);    
142     }
143     return (dat);
144 }
145 void main()
146 {
147     uint i;
148     uchar L, M;
149 /*    ds_init();//³õʼ»¯DS18B20
150     write_byte(0xcc);//·¢ËÍÌøÔ¾ROMÖ¸Áî
151     write_byte(0x4e);//дÔÝ´æÆ÷Ö¸Áî
152     write_byte(0x7f);
153     write_byte(0xf7);
154     write_byte(0x1f);//ÅäÖù¤×÷ÔÚ9λģʽÏÂ
155     ds_init();//³õʼ»¯DS18B20
156     write_byte(0xcc);//·¢ËÍÌøÔ¾ROMÖ¸Áî 
157     write_byte(0x48);*/
158     while(1)
159     {
160         ds_init();//³õʼ»¯DS18B20
161         write_byte(0xcc);//·¢ËÍÌøÔ¾ROMÖ¸Áî
162         write_byte(0x44);//·¢ËÍζÈת»»Ö¸Áî
163         ds_init();//³õʼ»¯DS18B20
164         write_byte(0xcc);//·¢ËÍÌøÔ¾ROMÖ¸Áî
165         write_byte(0xbe);//¶ÁÈ¡DS18B20ÔÝ´æÆ÷Öµ
166         L = read_byte();
167         M = read_byte();
168         i = M;
169         i <<= 8;
170         i |= L;                        
171         i = i * 0.0625 * 10 + 0.5;
172         Display(i);
173     }
174 }
温度显示

 1.DS18B20简介

 

 

 

2.DS18B20的指令

 

 

 

 

3.单总线的时序问题

 

4.初始化时序

 

5.读时序和写时序

 

6.DS18B20暂存器

 

 7.总结

1)执行的顺序

 

posted @ 2018-02-01 11:30  Justice-V  阅读(172)  评论(0)    收藏  举报