📄 yl-10-ds18b20
字号:
C51 COMPILER V9.00 1 09/27/2011 12:20:00 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE 1
OBJECT MODULE PLACED IN 1.OBJ
COMPILER INVOKED BY: E:\安装软件\keil-51\C51\BIN\C51.EXE 1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************
2
3 *****************************************/
4 #include <reg52.h>
5 #include<math.h>
6 #include <stdio.h>
7 #include<intrins.h>
8
9 void delay(unsigned int i);
10 void delay1ms(unsigned int i);
11 void ReadTemperature(void);
12 void Init_DS18B20(void);
13 ReadOneChar();
14 void WriteOneChar(unsigned char dat);
15
16 /* 变量定义 -----------------------------------------------*/
17 sbit DQ=P3^6; //数据传输线接单片机的相应的引脚
18 unsigned char tempL=0; //设全局变量
19 unsigned char tempH=0;
20 unsigned int sdate;//测量到的温度的整数部分
21 unsigned char xiaoshu1;//小数第一位
22 unsigned char xiaoshu2;//小数第二位
23 unsigned char xiaoshu;//两位小数
24 bit fg=1; //温度正负标志
25 unsigned char date;
26
27 //******************************
28
29 //*****串口初始化函数***********
30
31 //******************************
32 void Initial_com(void)
33 {
34 1 SCON=0x50; //串口选择模式1, 8-bit UART, 使能接收
35 1 TMOD|=0x20; //用定时器1设置波特率
36 1 TH1=0xFD;
37 1 TR1=1;
38 1 TI=1; //开启串口中断
39 1
40 1 }
41
42 /*
43 ********************************************************************************
44 ** 函数名称 : delay(unsigned char i)
45 ** 函数功能 : 延时函数 这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时
46 ********************************************************************************
47 */
48 void delay(unsigned int i)
49 {
50 1
51 1 while(i--);
52 1
53 1
54 1 }
55
C51 COMPILER V9.00 1 09/27/2011 12:20:00 PAGE 2
56 /*
57 ********************************************************************************
58 ** 函数名称 : delay1ms(unsigned char i)
59 ** 函数功能 : 延时函数
60 ********************************************************************************
61 */
62 void delay1ms(unsigned int i)
63 {
64 1 for(i=124;i>0;i--); //延时124*8+10=1002us
65 1 }
66
67
68 /*
69 ********************************************************************************
70 ** 函数名称 : Init_DS18B20(void)
71 ** 函数功能 : 初始化
72 ********************************************************************************
73 */
74 void Init_DS18B20(void)
75 {
76 1 unsigned char x=0;
77 1 DQ=1; //DQ先置高
78 1 delay(8); //稍延时
79 1 DQ=0; //发送复位脉冲
80 1 delay(80); //延时(>480us)
81 1 DQ=1; //拉高数据线
82 1 delay(5); //等待(15~60us)
83 1 x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
84 1 delay(20);
85 1 }
86
87
88 /*
89 ********************************************************************************
90 ** 函数名称 : ReadOneChar()
91 ** 函数功能 : 读一个字节
92 ********************************************************************************
93 */
94 ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
95 {
96 1 unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
97 1 unsigned char dat=0;
98 1 for (i=8;i>0;i--) //一个字节有8位
99 1 {
100 2 DQ=1;
101 2 delay(1);
102 2 DQ=0;
103 2 dat>>=1;
104 2 DQ=1;
105 2 if(DQ)
106 2 dat|=0x80;
107 2 delay(4);
108 2 }
109 1 return(dat);
110 1 }
111
112
113 /*
114 ********************************************************************************
115 ** 函数名称 : WriteOneChar(unsigned char dat)
116 ** 函数功能 : 写一个字节
117 ********************************************************************************
C51 COMPILER V9.00 1 09/27/2011 12:20:00 PAGE 3
118 */
119
120 void WriteOneChar(unsigned char dat)
121 {
122 1 unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
123 1 for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
124 1 {
125 2 DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
126 2 DQ=dat&0x01;
127 2 delay(5);
128 2 DQ=1;
129 2 dat>>=1;
130 2 }
131 1 delay(4);
132 1 }
133
134
135 /*
136 ********************************************************************************
137 ** 函数名称 : ReadTemperature(void)
138 ** 函数功能 : 读温度值(低位放tempL;高位放tempH;)
139 ********************************************************************************
140 */
141
142 void ReadTemperature(void)
143 {
144 1 Init_DS18B20(); //初始化
145 1 WriteOneChar(0xcc); //跳过读序列号的操作
146 1 WriteOneChar(0x44); //启动温度转换
147 1 delay(125); //转换需要一点时间,延时
148 1 Init_DS18B20(); //初始化
149 1 WriteOneChar(0xcc); //跳过读序列号的操作
150 1 WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
151 1 tempL=ReadOneChar(); //读出温度的低位LSB
152 1 tempH=ReadOneChar(); //读出温度的高位MSB
153 1
154 1 if(tempH>0x7f) //最高位为1时温度是负
155 1 {
156 2 tempL=~tempL; //补码转换,取反加一
157 2 tempH=~tempH+1;
158 2 fg=0; //读取温度为负时fg=0
159 2 }
160 1 sdate = tempL/16+tempH*16; //整数部分
161 1 xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
162 1 xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
163 1 xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
164 1
165 1
166 1
167 1 }
168
169
170 //*************************
171 //**********主函数*********
172 //*************************
173 main()
174 {
175 1 Initial_com();
176 1 while(1)
177 1 {
178 2 ReadTemperature();
179 2
C51 COMPILER V9.00 1 09/27/2011 12:20:00 PAGE 4
180 2 SBUF=sdate;
181 2 delay1ms(50000);
182 2 delay1ms(50000);
183 2 delay1ms(50000);
184 2 delay1ms(50000);
185 2 SBUF=xiaoshu;
186 2 delay1ms(50000);
187 2 delay1ms(50000);
188 2 delay1ms(50000);
189 2 delay1ms(50000);
190 2 }
191 1 }
192
193
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 341 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -