📄 temper.lst
字号:
C51 COMPILER V8.08 TEMPER 10/02/2008 18:07:41 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE TEMPER
OBJECT MODULE PLACED IN temper.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temper.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***********************************************************
2 *函数功能:通过DS18B20温度传感器测得当前的温度值,再送入4位8段数码管显示
3 *创建者: 曹兴
4 *创建日期:2008-10-2
5 *版本号: 20081002
6 ***********************************************************/
7 #include"reg51.h"
8 #include "intrins.h"
9 /*******************宏定义*********************************/
10 #define TH0_value 0x3C
11 #define TL0_value 0xB0
12 #define TMOD_value 0x01
13 #define TCON_value 0x15
14 #define IE_value 0x82
15 #define P0_value 0x0ff
16 /*******************端口定义及开辟相应的存储单元***********/
17 sbit DQ = P2^2; //DS18B20单总线接入点
18 bit flag ; //检测芯片是否存在的标志位
19 bit singal; //符号位
20 sbit b=P1^0; //芯片存在P1.0置0点亮LED灯
21 sbit c=P1^1; //芯片不存在P1.1置0点亮LED灯
22 unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
23 //8段数码管0~9数字的共阳显示代码
24 unsigned char buf[3] ; //存储转换后温度的高8位与低8位
25 unsigned char buf1[3];
26 unsigned char temper_value; //存储转化后温度的结果值
27 /**********************************************************
28 * 函数名: 延时子函数delay
29 * 函数功能:延时
30 * 入口参数:i
31 * 出口参数:无
32 ***********************************************************/
33 void delay(unsigned char i)
34 {
35 1 while(--i);
36 1 }
37 /**********************************************************
38 * 函数名: 初始化子函数 reset_signal
39 * 函数功能:信号复位进行初始化
40 * 入口参数:无
41 * 出口参数:无
42 ***********************************************************/
43 reset_signal()
44 {
45 1 DQ = 1;
46 1 _nop_();
47 1 DQ = 0; //主机发送复位脉冲至少持续480uS
48 1 delay(250); //480uS~960uS之间
49 1 DQ = 1;
50 1 delay(20); //延时至少16uS
51 1 flag = DQ; //DS18B20 等待16uS后发送存在脉冲(低电平)持续60uS~240uS
52 1 if(flag==0) //若flag=0则表示存在
53 1 {
54 2 b = 0; //P1.0亮
55 2 delay(90); //延时60uS~240uS之间
C51 COMPILER V8.08 TEMPER 10/02/2008 18:07:41 PAGE 2
56 2 }
57 1 else c=0; //不存在则P1.1亮
58 1 DQ = 1;
59 1 }
60 /**********************************************************
61 * 函数名: 写命令子函数 w_order
62 * 函数功能:写入将要执行操作的命令
63 * 入口参数:cmd
64 * 出口参数:无
65 ***********************************************************/
66 void w_order(unsigned char cmd)
67 {
68 1 unsigned char i;
69 1 for(i=0;i<8;i++)
70 1 {
71 2 if(cmd&(0x01<<i)) //写1
72 2 {
73 3 DQ = 0; //主机将数据线拉至低电平产生写时间片
74 3 _nop_(); //最好是拉至低电平后就释放(但延时至少1uS以上),这样才能在15uS内恢复到高电平
75 3 _nop_(); //15uS内必须拉至高电平(因为DS18B20在15uS~60uS之间对数据线进行采样)
76 3 DQ = 1;
77 3 delay(28); //延时60uS(因为一个写周期至少延时60uS)
78 3 }
79 2 else //写0
80 2 {
81 3 DQ = 0; //主机将数据线拉至低电平产生写时间片
82 3 delay(40); //延时60uS以上(因为一个写周期至少延时60uS)
83 3 DQ = 1;
84 3 _nop_(); //恢复延时(因为个写周期之间至少有1uS的恢复时间)
85 3 _nop_();
86 3 _nop_();
87 3 _nop_();
88 3 }
89 2 }
90 1 }
91 /**********************************************************
92 * 函数名: 读数据子函数 r_data
93 * 函数功能:读出转换后的温度结果存入 buf 中
94 * 入口参数:无
95 * 出口参数:无
96 ***********************************************************/
97 void r_data()
98 {
99 1 unsigned int i,j;
100 1 for(j=0;j<2;j++)
101 1 {
102 2 buf[j] = 0;
103 2 for(i=0;i<8;i++)
104 2 {
105 3 DQ = 1;
106 3 _nop_();
107 3 DQ = 0; //主机将数据线拉至低电平产生读时间片
108 3 _nop_(); //最好是拉至低电平后就释放(但延时至少1uS以上),这样才能在15uS内恢复到高电平
109 3 _nop_(); //15uS内必须驱动至高电平(因为DS18B20输出数据在读时间片下降沿后15uS有效)
110 3 DQ = 1;
111 3 _nop_();
112 3 if(DQ) //提高总线后马上读取
113 3 {
114 4 buf[j]|=(1<<i);
115 4 }
116 3 else
117 3 {
C51 COMPILER V8.08 TEMPER 10/02/2008 18:07:41 PAGE 3
118 4 buf[j]&=~(1<<i);
119 4 }
120 3 delay(28); //每个读周期至少持续60uS
121 3 DQ = 1;
122 3 _nop_(); //恢复延时(因为个读周期之间至少有1uS的恢复时间)
123 3 }
124 2 }
125 1 }
126 /**********************************************************
127 * 函数名: 获取温度子函数 get_temper_value
128 * 函数功能:获得当前的温度值
129 * 入口参数:无
130 * 出口参数:无
131 ***********************************************************/
132 void get_temper_value()
133 {
134 1 DQ = 1;
135 1 reset_signal(); //初始化 ,检测是否存在 DS18B20
136 1 if(flag==0)
137 1 {
138 2 w_order(0xcc); //跳过ROM
139 2 w_order(0x44); //启动温度变换
140 2 reset_signal(); //复位
141 2 w_order(0xcc); //跳过ROM
142 2 w_order(0xbe); //准备读暂存器
143 2 r_data(); //读暂存器中温度变化的结果
144 2 }
145 1 }
146 /**********************************************************
147 * 函数名: 二-十进制转换子函数Conversion
148 * 函数功能:将二进制数转入十进制中
149 * 入口参数:无
150 * 出口参数:无
151 ***********************************************************/
152 void Conversion()
153 {
154 1 singal = (buf[1]&0xf8); //检温度测是正还是负
155 1 buf1[2] = 0; //温度的符号位
156 1 if(singal)
157 1 {
158 2 buf[0]=~buf[0];
159 2 buf[1]=~buf[1];
160 2 buf1[2]=10;
161 2 }
162 1 buf[0]=(buf[0]>>4); //将温度转换结果的低8位的高4位移入低4位
163 1 //这里我们抛弃了温度转换结果的第四位(小数部分,因为我们不需要那么准确)
164 1 buf[0]=(buf[0]&0x0f); //保留低4位并存入buf[0]中
165 1 buf[1]=(buf[1]<<4); //将温度转换结果的高8位的低4位移入高4位
166 1 buf[1]=(buf[1]&0xf0); //保留高4位并存入buf[1]中
167 1 temper_value=(buf[0]|buf[1]); //将buf[0]与buf[1]相或得温度转换结果存入temper_value中
168 1 if(singal)
169 1 {temper_value++;} //为负时取反加1
170 1 buf1[0]=temper_value%10; //将个位保存在buf1[0]中
171 1 buf1[1]=temper_value/10; //将十位保存在buf1[1]中
172 1 }
173 /**********************************************************
174 * 函数名: LED显示子函数display
175 * 函数功能:将获得的温度结果通过LED显示
176 * 入口参数:无
177 * 出口参数:无
178 ***********************************************************/
179 void display()
C51 COMPILER V8.08 TEMPER 10/02/2008 18:07:41 PAGE 4
180 {
181 1 unsigned char i,a;
182 1 long int j;
183 1 for(i=0;i<3;i++)
184 1 {
185 2 P2=~(0x10<<i); //动态扫描显示
186 2 a =buf1[i];
187 2 P0=~tab[a]; //P0口输出显示数据
188 2 for(j=400;j>0;j--);
189 2 }
190 1 }
191
192 /**********************************************************
193 * 函数名: 中断函数timer0
194 * 函数功能:定时对DS18B20的转换温度进行更新
195 * 入口参数:无
196 * 出口参数:无
197 ***********************************************************/
198 void timer0(void) interrupt 1 using 0
199 {
200 1 TH0 =TH0_value;
201 1 TL0 =TL0_value;
202 1 get_temper_value();
203 1 Conversion();
204 1 }
205 /**********************************************************
206 * 函数名: 主函数main
207 * 函数功能:通过温度传感器测当前室温
208 * 入口参数:无
209 * 出口参数:无
210 ***********************************************************/
211 void main()
212 {
213 1 TMOD=TMOD_value;
214 1 TH0 =TH0_value;
215 1 TL0 =TL0_value;
216 1 TCON=TCON_value;
217 1 IE =IE_value ;
218 1 P0 =P0_value;
219 1 while(1)
220 1 {
221 2 display(); //将当前温度值送入LED显示
222 2 }
223 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 458 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 5
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -