📄 thermometer.lst
字号:
C51 COMPILER V7.09 THERMOMETER 11/02/2008 12:33:48 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE THERMOMETER
OBJECT MODULE PLACED IN Thermometer.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE Thermometer.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************/
2 /*
3 *文件名:Thermomete.c
4 *功能描述:单片机系统复位后在液晶上显示当前温度值,测量温度范围为 -55°C~+125,可显示负温度值
5 *作者:黄英杰
6 *单位:吉首大学 *时间:2008.11.01
7 */
8 /****************************************************/
9 /*
10 DS18B20为"一线总线"数字温度传感器,测量温度范围为 -55°C~+125°C,分辨率为12,相当于温度分辨率为0.0625摄氏
-度
11 在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果.
12 */
13 #include "Thermomete.h"
14
15 sbit DQ=P1^1;//定义数据通信端口
16 bit Negative=0;//温度负值标志位
17
18 void delay_us(unsigned int x);//延时1us函数
19 void delay(unsigned int t);//延时函数
20 void lcd_code(unsigned char lcdcode);//向液晶写一个命令的函数
21 void lcd_data(unsigned char lcddata);//向液晶写一个数据的函数
22 void init_lcd(void);//初始化液晶屏函数
23 void delay_ms(unsigned int x);//延时1ms函数
24 void display_char(unsigned char *displaychar);//显示字符串函数
25 void display_tem(float f);//显示温度值函数
26 void Reset(void);//DS18B20复位函数
27 void Built(void);//自制摄氏温度符号函数
28 unsigned char read_data(void);//读一个字节数据函数
29 void write_data(unsigned char value);//写一个字节数据函数
30 float Read_Temperature(void);//读取温度并转换函数
31
32
33 void main(void)
34 {
35 1 float temp;
36 1 EA=0;
37 1 init_lcd();
38 1 Built();
39 1 lcd_code(0x80);
40 1 display_char("Currently Temer:");
41 1 while(1)
42 1 {
43 2 temp=Read_Temperature();//温度转换
44 2 display_tem(temp);//显示当前温度
45 2 }
46 1 }
47
48
49 /***************延时1us函数*************/
50 void delay_us(unsigned int x)
51 {
52 1 while(x--);
53 1 }//x<255时,精确延时为(6*x)us
54
C51 COMPILER V7.09 THERMOMETER 11/02/2008 12:33:48 PAGE 2
55
56
57 /***************延时1ms函数*************/
58 void delay_ms(unsigned int x)
59 {
60 1 unsigned char i;
61 1 while(x--)
62 1 {
63 2 for(i=0;i<125;i++);
64 2 }
65 1 }
66
67
68 /****************DS18B20复位函数******************/
69 void Reset(void)
70 {
71 1 unsigned char ch=0;
72 1 DQ = 1;//DQ复位
73 1 delay_us(8);//延时
74 1 DQ = 0;//DQ拉低
75 1 delay_us(80); //精确延时大于480us
76 1 DQ = 1;
77 1 //控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲
78 1 delay_us(14);//延时,存在脉冲为一个60~240uS的低电平信号
79 1 ch=DQ;//接收存在脉冲
80 1 delay(20);
81 1 }
82
83
84 /****************读一个字节数据函数******************/
85 unsigned char read_data(void)
86 {
87 1 unsigned char i;
88 1 unsigned char value = 0;
89 1 for (i=0;i<8;i++)
90 1 {
91 2 DQ = 0; //给脉冲信号
92 2 value=value>>1;//产生至少1uS的低电平,表示读时间的起始
93 2 DQ = 1; //给脉冲信号,在总线被释放后的15uS中DS18B20会发送内部数据位
94 2 if(DQ)
95 2 {
96 3 value=value|0x80;
97 3 }
98 2 delay_us(4);
99 2 }
100 1 return(value);
101 1 }
102
103
104 /****************写一个字节数据函数******************/
105 void write_data(unsigned char value)
106 {
107 1 unsigned char i;
108 1 for(i=0;i<8;i++)
109 1 {
110 2 DQ=0;
111 2 //写数据时间隙的前15uS总线需要是被控制器拉置低电平
112 2 DQ=value&0x01;
113 2 delay_us(5);//芯片对总线数据的采样时间,采样时间在15~60uS
114 2 DQ=1;
115 2 value=value>>1;
116 2 }//字节的读写是从低位开始的
C51 COMPILER V7.09 THERMOMETER 11/02/2008 12:33:48 PAGE 3
117 1 delay(4);
118 1 }
119
120
121 /****************读取温度并转换函数******************/
122 //DS18b20一线工作协议流程为:
123 //复位 发送ROM指令 发送存储器指令 数据通信
124 float Read_Temperature(void)
125 {
126 1 unsigned char first_byte,second_byte,num=0;
127 1 float Temperature_value;
128 1 unsigned int buf;
129 1 Reset();//复位
130 1 write_data(0xcc);//跳跃ROM指令,跳过读序列号
131 1 write_data(0x44);//启动温度转换
132 1 delay_ms(750);//延时大于转换时间
133 1 Reset();//复位
134 1 write_data(0xcc);//跳跃ROM指令,跳过读序列号
135 1 write_data(0xbe);//从RAM中读数据,前两个字节为温度值
136 1 first_byte=read_data();//读取温度值低八位
137 1 second_byte=read_data();//读取温度值高八位
138 1 //Reset();//复位中止读数
139 1 num=second_byte&0x80;//判断温度值的正负
140 1 buf=second_byte;
141 1 buf=buf<<8;//温度值高八位存放在整型变量buf高八位
142 1 buf=buf|first_byte;//相或运算将温度值低八位存放在整型变量buf低八位
143 1 if(num!=0)
144 1 {
145 2 buf=(~buf)+1;
146 2 Negative=1;
147 2 }//温度值为负数,取反后加一
148 1 Temperature_value=buf*0.0625;//分辨率为12位,LSB=0.0625
149 1 return(Temperature_value);
150 1 }
151
152
153 /*********************延时函数********************/
154 void delay(unsigned int t)
155 {
156 1 unsigned int i;
157 1 for(i=0;i<=t;i++);
158 1 }
159
160
161
162 /************向液晶写一个命令的函数***************/
163 void lcd_code(unsigned char lcdcode)
164 {
165 1 delay(3);
166 1 A_LCDCOM=lcdcode;
167 1 delay(200);
168 1 }
169
170
171
172 /**************向液晶写一个数据的函数*************/
173 void lcd_data(unsigned char lcddata)
174 {
175 1 delay(3);
176 1 A_LCDDATA=lcddata;
177 1 delay(200);
178 1 }
C51 COMPILER V7.09 THERMOMETER 11/02/2008 12:33:48 PAGE 4
179
180
181 /******************初始化液晶屏函数**************/
182 void init_lcd(void)
183 {
184 1 delay(1000);
185 1 lcd_code(0x38);//功能设定,5*7点阵,8位数据接口
186 1 delay(1000);
187 1 lcd_code(0x0c);//显示画面设置,开显示
188 1 delay(1000);
189 1 lcd_code(0x01);//清屏指令
190 1 delay(1000);
191 1 lcd_code(0x06);//当读或写一个字符后地址指针加1,且光标加1
192 1 delay(1000);
193 1 }
194
195
196 /***************显示字符串的函数*******************/
197 void display_char(unsigned char *displaychar)
198 {
199 1 while(*displaychar>0)
200 1 {
201 2 lcd_data(*displaychar);
202 2 displaychar++;
203 2 }
204 1 }
205
206
207 /***************显示温度值的函数*******************/
208 void display_tem(float f)
209 {
210 1 unsigned int num0,num1;
211 1 num0=f;//小数部分舍去,留下整数部分
212 1 f=f-num0;//减去整数部分得到小数部分
213 1 num1=f*10000;
214 1 lcd_code(0xc3);
215 1 if(Negative==1)
216 1 {
217 2 Negative=0;
218 2 lcd_data('-');
219 2 }//若温度为负,则先显示负号
220 1 lcd_data((num0/100)%10+0x30);
221 1 delay(30);
222 1 lcd_data((num0/10)%10+0x30);
223 1 delay(30);
224 1 lcd_data((num0%10)+0x30);
225 1 delay(30);
226 1 lcd_data('.');
227 1 delay(30);
228 1 lcd_data((num1/1000)%10+0x30);
229 1 delay(30);
230 1 lcd_data((num1/100)%10+0x30);
231 1 delay(30);
232 1 lcd_data((num1/10)%10+0x30);
233 1 delay(30);
234 1 lcd_data((num1%10)+0x30);
235 1 delay(30);//将温度值转换成各位显示
236 1 lcd_data(0x00);//显示摄氏温度符号
237 1 delay(30);
238 1 }
239
240
C51 COMPILER V7.09 THERMOMETER 11/02/2008 12:33:48 PAGE 5
241
242 /***************自制摄氏温度符号函数*******************/
243 void Built(void)
244 {
245 1 lcd_code(0x40);//设置CGRAM地址,自定义字符字模就可以写入CGRAM中
246 1 lcd_data(0x08);//自定义字符°C,字符码为00
247 1 lcd_data(0x14);
248 1 lcd_data(0x0b);
249 1 lcd_data(0x04);
250 1 lcd_data(0x04);
251 1 lcd_data(0x04);
252 1 lcd_data(0x03);
253 1 lcd_data(0x00);
254 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 666 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 15
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 + -