📄 ds1820.lst
字号:
C51 COMPILER V7.50 DS1820 10/30/2005 23:02:22 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN ds1820.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1820.c BROWSE DEBUG OBJECTEXTEND
line level source
1 // 以下是四个DS1820温度读取程序
2 //使用时先调用"rom()"子程序读出每个器件的序列号
3 //再将各个序列号填入SN数组中才能读出各个温度
4 /*************************************************************************
5 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
6 64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自
7 身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的
8 作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的
9 目的。********************************************************************/
10 #include <reg51.h>
11 #define uchar unsigned char
12
13 sbit TMDAT = P3^4; //根据实实际情况设定
14 uchar TMP[4]; //读取后的4个温度值,将其除以2即可得出实际温度;
15 uchar SN[4][8]=
16 {
17 {0x28,0x28,0x17,0x5E,0x00,0x00,0x00,0xE9}, //1
18 {40,162,36,94,0,0,0,6},
19 {40,155,243,88,0,0,0,123},
20
21 }; //4个器件的序列号,先读出单个序列号后填上才可以读取温度
22 uchar f[4]; //结果是否为负温,“0”为正温,“1”为负温。
23
24 /***************延时部分*************/
25 void dmsec (unsigned int count) //
26 { //
27 1 unsigned int i; //
28 1 while (count) //
29 1 { //
30 2 i = 115; //
31 2 while (i>0) i--; //
32 2 count--; //
33 2 } //
34 1 } //
35 /***************发送复位*************/
36 void tmreset (void) //
37 { //
38 1 unsigned int i; //
39 1 TMDAT = 0; //
40 1 i = 103; //
41 1 while (i>0) i--; // 延时 900 uS(11.0592Mhz时) //
42 1 TMDAT = 1; //
43 1 i = 4; //
44 1 while (i>0) i--; //
45 1 } //
46 /***************判断DS1820是否存在的子程序。
47 最好不要用,因为当器件不存在时将会进入死循环
48 等待存在脉冲*******************************/
49 void tmpre (void) //判断器件是否存在 //
50 { //
51 1 unsigned int i; //
52 1 while (TMDAT); //
53 1 while (~TMDAT); //
54 1 i = 4; while (i>0) i--; //
55 1 } //
C51 COMPILER V7.50 DS1820 10/30/2005 23:02:22 PAGE 2
56 /*************读一位*****************/
57 bit tmrbit (void) //
58 { //
59 1 unsigned int i; //
60 1 bit dat; //
61 1 TMDAT = 0; i++; //
62 1 TMDAT = 1; i++; i++; //微量延时 //
63 1 dat = TMDAT; //
64 1 i = 8; while (i>0) i--; // 延时 //
65 1 return (dat); //
66 1 } //
67 /************** 读一个字节****************/
68 unsigned char tmrbyte (void) //
69 { //
70 1 unsigned char i,j,dat; //
71 1 dat = 0; //
72 1 for (i=1;i<=8;i++) //
73 1 { //
74 2 j = tmrbit (); //
75 2 dat = (j << 7) | (dat >> 1); //
76 2 } //
77 1 return (dat); //
78 1 } //
79 /************写一个字节****************/
80 void tmwbyte (unsigned char dat) //
81 { //
82 1 unsigned int i; //
83 1 unsigned char j; //
84 1 bit testb; //
85 1 for (j=1;j<=8;j++) //
86 1 { //
87 2 testb = dat & 0x01; //
88 2 dat = dat >> 1; //
89 2 if (testb) //
90 2 { //
91 3 TMDAT = 0; // 写0 //
92 3 i++; i++; //
93 3 TMDAT = 1; //
94 3 i = 8; while (i>0) i--; //
95 3 } //
96 2 else //
97 2 { //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -