单片机 数字温度传感器
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)执行的顺序

一个二次元的生物

浙公网安备 33010602011771号