📄 18b20.lst
字号:
C51 COMPILER V7.06 18B20 09/04/2008 08:28:46 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: d:\Keil2\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //18B20单线温度检测的应用样例程序
2 #include<REG52.H>
3 #include<math.h>
4 #include<INTRINS.H>
5
6 #define uchar unsigned char
7 #define uint unsigned int;
8 /*****************************************************************************/
9 sbit DQ=P3^5;//ds18b20 端口
10 /**********************************************************************/
11 unsigned int temp;
12 uchar flag_get;
13 /***********************************************************************/
14 void delay1(uchar MS);
15 unsigned char ReadTemperature(void);
16 void Init_DS18B20(void);
17 unsigned char ReadOneChar(void);
18 void WriteOneChar(unsigned char dat);
19 void delay(unsigned int i);
20 void DelayMs(unsigned char ms);//delay Ms
21 void InitLcd();
22 void lcd_sef_chr();
23 /************************************************************************/
24 void display(void);//外部函数
25 main()
26 {
27 1
28 1 TMOD|=0x01;//定时器设置
29 1 TH0=0xef;
30 1 TL0=0xf0;
31 1 IE=0x82;
32 1 TR0=1;
33 1
34 1 InitLcd();//
35 1 DelayMs(15);
36 1 lcd_sef_chr(); //写入自定义字符号
37 1 while(1)
38 1 {
39 2 if(flag_get==1) //定时读取当前温度
40 2 {
41 3 temp=ReadTemperature();
42 3 flag_get=0;
43 3 display();//显示
44 3 }
45 2 }
46 1 }
47
48
49
50 void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
51 {
52 1 static unsigned char num;
53 1 TH0=0xef;//定时器重装值
54 1 TL0=0xf0;
55 1 num++;
C51 COMPILER V7.06 18B20 09/04/2008 08:28:46 PAGE 2
56 1 if (num==50)
57 1 {
58 2 num=0;
59 2 flag_get=1;//标志位有效
60 2
61 2 }
62 1
63 1 }
64 /*************************************************************************************/
65 void delay(unsigned int i)//延时函数
66 {
67 1 while(i--);
68 1 }
69 /***************************************************************************************/
70 //18b20初始化函数
71 void Init_DS18B20(void)
72 {
73 1 unsigned char x=0;
74 1 DQ = 1; //DQ复位
75 1 delay(8); //稍做延时
76 1 DQ = 0; //单片机将DQ拉低
77 1 delay(80); //精确延时 大于 480us
78 1 DQ = 1; //拉高总线
79 1 delay(10);
80 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
81 1 delay(5);
82 1 }
83
84 //读一个字节
85 unsigned char ReadOneChar(void)
86 {
87 1 unsigned char i=0;
88 1 unsigned char dat = 0;
89 1 for (i=8;i>0;i--)
90 1 {
91 2 DQ = 0; // 给脉冲信号
92 2 dat>>=1;
93 2 DQ = 1; // 给脉冲信号
94 2 if(DQ)
95 2 dat|=0x80;
96 2 delay(5);
97 2 }
98 1 return(dat);
99 1 }
100
101 //写一个字节
102 void WriteOneChar(unsigned char dat)
103 {
104 1 unsigned char i=0;
105 1 for (i=8; i>0; i--)
106 1 {
107 2 DQ = 0;
108 2 DQ = dat&0x01;
109 2 delay(5);
110 2 DQ = 1;
111 2 dat>>=1;
112 2 }
113 1 delay(5);
114 1 }
115
116 //读取温度
117 unsigned char ReadTemperature(void)
C51 COMPILER V7.06 18B20 09/04/2008 08:28:46 PAGE 3
118 {
119 1 unsigned char a=0;
120 1 unsigned char b=0;
121 1 unsigned char t=0;
122 1 //float tt=0;
123 1 Init_DS18B20();
124 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
125 1 WriteOneChar(0x44); // 启动温度转换
126 1 delay(200);
127 1 Init_DS18B20();
128 1 WriteOneChar(0xCC); //跳过读序号列号的操作
129 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
130 1 a=ReadOneChar();
131 1 b=ReadOneChar();
132 1
133 1 b<<=4;
134 1 b+=(a&0xf0)>>4;
135 1 t=b;
136 1 //tt=t*0.0625;
137 1 //t= tt*10+0.5; //放大10倍输出并四舍五入
138 1 return(t);
139 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 242 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -