📄 tem2.lst
字号:
C51 COMPILER V6.12 TEM2 11/30/2008 00:03:30 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TEM2
OBJECT MODULE PLACED IN .\tem2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\tem2.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3
4 sbit K1=P1^4;
5 sbit K2=P1^5;
6 sbit K3=P1^6;
7 sbit K4=P1^7;
8 sbit BUZZER=P3^7;
9
10 //延时函数
11 void delay(unsigned int i)
12 {
13 1 while(i--);
14 1 }
15 /****************DS18B20驱动程序********************/
16 sbit DQ=P3^3;
17 //初始化函数
18 Init_DS18B20(void)
19 {
20 1 unsigned char x=0;
21 1 DQ = 1; //DQ复位
22 1 delay(8); //稍做延时
23 1 DQ = 0; //单片机将DQ拉低
24 1 delay(80); //精确延时 大于 480us
25 1 DQ = 1; //拉高总线
26 1 delay(14);
27 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
28 1 delay(20);
29 1 }
30
31 //读一个字节
32 ReadOneChar(void)
33 {
34 1 unsigned char i=0;
35 1 unsigned char dat = 0;
36 1 for (i=8;i>0;i--)
37 1 {
38 2 DQ = 0; // 给脉冲信号
39 2 dat>>=1;
40 2 DQ = 1; // 给脉冲信号
41 2 if(DQ)
42 2 dat|=0x80;
43 2 delay(4);
44 2 }
45 1 return(dat);
46 1 }
47
48 //写一个字节
49 WriteOneChar(unsigned char dat)
50 {
51 1 unsigned char i=0;
52 1 for (i=8; i>0; i--)
53 1 {
54 2 DQ = 0;
55 2 DQ = dat&0x01;
C51 COMPILER V6.12 TEM2 11/30/2008 00:03:30 PAGE 2
56 2 delay(5);
57 2 DQ = 1;
58 2 dat>>=1;
59 2 }
60 1 }
61
62 //读取温度
63 ReadTemperature(void)
64 {
65 1 unsigned char a=0;
66 1 unsigned char b=0;
67 1 unsigned int t=0;
68 1 float tt=0;
69 1 Init_DS18B20();
70 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
71 1 WriteOneChar(0x44); // 启动温度转换
72 1 Init_DS18B20();
73 1 WriteOneChar(0xCC); //跳过读序号列号的操作
74 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
75 1 a=ReadOneChar();
76 1 b=ReadOneChar();
77 1 t=b;
78 1 t<<=8;
79 1 t=t|a;
80 1 tt=t*0.0625; //将温度的高位与低位合并
81 1 t= tt*10+0.5; //对结果进行4舍5入
82 1 return(t);
83 1 }
84
85 ReadTH(void) //读最高的温度
86 {
87 1 unsigned int th=0;
88 1 Init_DS18B20();
89 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
90 1 WriteOneChar(0xBE);
91 1 ReadOneChar();
92 1 ReadOneChar();
93 1 th=ReadOneChar();
94 1 return(th);
95 1 }
96
97 ReadTL(void) //读最高的温度
98 {
99 1 unsigned int tl=0;
100 1 Init_DS18B20();
101 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
102 1 WriteOneChar(0xBE);
103 1 ReadOneChar();
104 1 ReadOneChar();
105 1 ReadOneChar();
106 1 tl=ReadOneChar();
107 1 return(tl);
108 1 }
109 /********有关DS18B20的函数初始化完毕********************/
110
111 /**********LCD驱动函数**********************************/
112 typedef unsigned char BYTE;
113 typedef unsigned int WORD;
114 typedef bit BOOL ;
115 sbit rs = P2^0; //
116 sbit rw = P2^1;
117 sbit ep = P2^2;
C51 COMPILER V6.12 TEM2 11/30/2008 00:03:30 PAGE 3
118 sbit right = P2^6;
119
120 delayms(BYTE ms)
121 { // 延时子程序
122 1 BYTE i;
123 1 while(ms--)
124 1 {
125 2 for(i = 0; i< 250; i++)
126 2 {
127 3 _nop_();
128 3 _nop_();
129 3 _nop_();
130 3 _nop_();
131 3 }
132 2 }
133 1 }
134
135 BOOL lcd_bz()
136 { // 测试LCD忙碌状态
137 1 BOOL result;
138 1 rs = 0;
139 1 rw = 1;
140 1 ep = 1;
141 1 _nop_();
142 1 _nop_();
143 1 _nop_();
144 1 _nop_();
145 1 result = (BOOL)(P0 & 0x80);
146 1 ep = 0;
147 1 return result;
148 1 }
149
150 lcd_wcmd(BYTE cmd)
151 { // 写入指令数据到LCD
152 1 while(lcd_bz());
153 1 rs = 0;
154 1 rw = 0;
155 1 ep = 0;
156 1 _nop_();
157 1 _nop_();
158 1 P0 = cmd;
159 1 _nop_();
160 1 _nop_();
161 1 _nop_();
162 1 _nop_();
163 1 ep = 1;
164 1 _nop_();
165 1 _nop_();
166 1 _nop_();
167 1 _nop_();
168 1 ep = 0;
169 1 }
170
171 lcd_pos(BYTE pos)
172 { //设定显示位置
173 1 lcd_wcmd(pos | 0x80);
174 1 }
175
176 lcd_wdat(BYTE dat)
177 { //写入字符显示数据到LCD
178 1 while(lcd_bz());
179 1 rs = 1;
C51 COMPILER V6.12 TEM2 11/30/2008 00:03:30 PAGE 4
180 1 rw = 0;
181 1 ep = 0;
182 1 P0 = dat;
183 1 _nop_();
184 1 _nop_();
185 1 _nop_();
186 1 _nop_();
187 1 ep = 1;
188 1 _nop_();
189 1 _nop_();
190 1 _nop_();
191 1 _nop_();
192 1 ep = 0;
193 1 }
194
195 lcd_init()
196 { //LCD初始化设定
197 1 lcd_wcmd(0x38); //
198 1 delayms(1);
199 1 lcd_wcmd(0x0c); //
200 1 delayms(1);
201 1 lcd_wcmd(0x06); //
202 1 delayms(1);
203 1 lcd_wcmd(0x01); //清除LCD的显示内容
204 1 delayms(1);
205 1 }
206 /******************LCD驱动到此结束*********************/
207
208 /******************按键扫描程序开始********************/
209 unsigned char Read_keyboard()
210 {
211 1 unsigned char Keys_Value;
212 1 unsigned char Keys_Temp;
213 1 P1=0XFF;
214 1 Keys_Temp = P1;
215 1 delay(150);
216 1 P1=0XFF;
217 1 Keys_Value = P1;
218 1 if(Keys_Temp != Keys_Value)
219 1 return(Keys_Value);
220 1 }
221 /****************按键扫描程序结束***********************/
222
223 main()
224 {
225 1
226 1 typedef unsigned char BYTE;
227 1 BYTE code dis1[] = {"TEMP:"};
228 1 BYTE code dis2[] = {"SET"};
229 1 BYTE code dis3[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
230 1 BYTE code dis4[] = {"TH:"};
231 1 BYTE code dis5[] = {" TH TL ESC"};
232 1 BYTE code dis6[] = {"TH:"};
233 1 BYTE code dis7[] = {"SET UP DOWN ESC"};
234 1 BYTE code dis8[] = {"TL:"};
235 1 BYTE i;
236 1 unsigned int temp=0,th=0,tl=0;
237 1 unsigned char key;
238 1
239 1 lcd_init();// 初始化LCD
240 1 delayms(100);
241 1 while(1)
C51 COMPILER V6.12 TEM2 11/30/2008 00:03:30 PAGE 5
242 1 {
243 2 lcd_pos(0x01);
244 2 i = 0;
245 2 while(dis1[i] != '\0')
246 2 { // 显示字符"TEMP:"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -