📄 com.lst
字号:
C51 COMPILER V7.00 COM 04/21/2008 22:46:10 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN com.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE com.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<reg51.h>
2 #include <intrins.h>
3
4 #define uint unsigned int
5 #define uchar unsigned char
6 /*端口定义*/
7 #define LED P0 /*实际温度值输出端口定义*/
8
9 #define NOP _nop_()
10
11 uint temp=40;
12 uint t1=41;
13
14 sbit CLK=P0^7;
15 sbit DAT=P0^4;
16 sbit DCLK=P0^6;
17
18 sbit key=P1^0;
19
20 uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
21 sbit tem_in=P2^6; /*温度读取端口*/
22 sbit heat1=P2^0; //加热控制端口1
23
24 uchar temp_h,temp_l; /*温度值变量*/
25 uchar flag1; /*正负标志位*/
26 uchar temper,temper_set;
27
28 void initcom(void);
29 void send_char(unsigned char txd);
30 void tmpchange(void);
31 void sendbyte(uchar byte);
32 void delay2(uint j);//延时
33 void display(uchar number);
34 void delays(uint n);
35
36 //串口初始化
37 void initcom(void)
38 {
39 1 TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
40 1 TH1 = 0x0F3; // 波特率2400
41 1 TL1 = 0x0F3;
42 1
43 1
44 1 SCON = 0x50; // 设定串行口工作方式
45 1 PCON=0; //波特率不翻倍
46 1 //PCON &= 0xef; // 波特率不倍增
47 1
48 1 ES=1; //允许串行口中断
49 1 TR1 = 1; // 启动定时器1
50 1 IE|= 0x90; // enable serial interrupt,禁止other中断
51 1 // IE= 0x9F; // enable serial interrupt,禁止other中断
52 1 // IE = 0x00; // 禁止任何中断
53 1 EA=1; //开总中断
54 1 // IT0=1;
55 1 // EX0=1;
C51 COMPILER V7.00 COM 04/21/2008 22:46:10 PAGE 2
56 1 }
57
58
59 void send_char(unsigned char txd)
60 // 传送一个字符
61 {
62 1 SBUF = txd;
63 1 while(!TI); // 等特数据传送
64 1 TI = 0; // 清除数据传送标志
65 1 }
66
67
68 //======595显示程序===============================================
69 void sendbyte(uchar byte)
70 {
71 1 uchar num,i;
72 1 num=tab[byte];
73 1
74 1 for(i=0;i<8;i++)
75 1 {
76 2 CLK=0;
77 2 DAT=num&0x80;
78 2 num=num<<1;
79 2
80 2 CLK=1;
81 2 }
82 1
83 1 }
84
85
86 void delay2(uint j)//延时
87 { uchar m;
88 1 for(;j>0;j--)
89 1 {
90 2 for(m=0;m<=250;m++)
91 2 {;}
92 2 }
93 1 }
94
95 void display(uchar number)
96 {
97 1 uchar sw,gw;
98 1 DCLK=0;
99 1 sw=number/10;
100 1 gw=number-10*sw;
101 1
102 1 sendbyte(sw);
103 1 sendbyte(gw);
104 1 DCLK=0;
105 1 delay2(150);
106 1 //out595();
107 1 DCLK=1;
108 1 }
109 //=====================================================================
110 /**********************************延时1S整*******************************/
111 void delays(uint n)
112 {
113 1 unsigned char i,j,k,l;
114 1 for(l=n;l>0;l--)
115 1
116 1 for(k=100;k>0;k--)
117 1
C51 COMPILER V7.00 COM 04/21/2008 22:46:10 PAGE 3
118 1 for(i=20;i>0;i--)
119 1
120 1 for(j=248;j>0;j--);
121 1
122 1 }
123
124
125 //************************************
126 /*====================================
127 函数功能:延时
128 入口参数:
129 说 明 :送1迟202us
130 =====================================*/
131
132 void delay(unsigned int count)
133 {
134 1 unsigned int i;
135 1 while(count)
136 1 {
137 2 i=200;
138 2 while(i>0)i--;
139 2 count--;
140 2 }
141 1 }
142
143 /*====================================
144 函数功能:延时 us
145 入口参数:
146 说 明 :
147 =====================================*/
148
149 void Delay_us(uchar n)
150 {
151 1 uchar i;
152 1 i=0;
153 1 while(i<n)
154 1 {i++;}
155 1 return;
156 1 }
157
158 /*====================================
159 函数功能:DS18B20重设
160 入口参数:无
161 说 明 :
162 =====================================*/
163
164 void dsreset(void)
165 {
166 1 unsigned int i;
167 1 tem_in=0;
168 1 i=103;
169 1 while(i>0)i--;
170 1 tem_in=1;
171 1 i=4;
172 1 while(i>0)i--;
173 1 }
174
175 /*====================================
176 函数功能:直接读一字节程序
177 入口参数:无
178 说 明 :返回结果
179 =====================================*/
C51 COMPILER V7.00 COM 04/21/2008 22:46:10 PAGE 4
180
181 uchar ReadByte(void){
182 1 uchar i,k;
183 1 i=8;
184 1 k=0;
185 1 while(i--)
186 1 {
187 2 tem_in=1;
188 2 Delay_us(1);
189 2 tem_in=0;
190 2 k=k>>1;
191 2 tem_in=1;
192 2 NOP;
193 2 if(tem_in)k |= 0x80;
194 2 Delay_us(4);
195 2 }
196 1 return(k);
197 1 }
198
199 /*====================================
200 函数功能:向B20写一字节
201 入口参数:待写数据
202 说 明 :
203 =====================================*/
204
205 void tmpwrite(unsigned char dat)
206 { unsigned int i;
207 1 unsigned char j;
208 1 bit testb;
209 1 for(j=1;j<=8;j++)
210 1 { testb=dat&0x01;
211 2 dat=dat>>1;
212 2 if(testb)
213 2 { tem_in=0;i++;i++;
214 3 tem_in=1;
215 3 i=8;while(i>0)i--;
216 3 }
217 2 else
218 2 {
219 3 tem_in=0;
220 3 i=8;while(i>0)i--;
221 3 tem_in=1;i++;i++;
222 3 }
223 2 }
224 1 }
225
226 //////////////////////////////////////////////////////////////
227 void tmpchange(void)
228 {
229 1 dsreset(); /*复位*/
230 1 delay(1);
231 1 tmpwrite(0xcc); //跳过序列号命令
232 1 // delay(200);
233 1 tmpwrite(0x44); //转换命令
234 1 }
235
236 /*====================================
237 函数功能:将温度值读出来并转化为显示数组
238 入口参数:
239 说 明 :调用 ReadByte();
240 =====================================*/
241
C51 COMPILER V7.00 COM 04/21/2008 22:46:10 PAGE 5
242 void tmp(void)
243 {
244 1 float dis;
245 1 // uchar tempbuf;
246 1 dsreset();
247 1 delay(1);
248 1 tmpwrite(0xcc);
249 1 tmpwrite(0xbe);
250 1 temp_l=ReadByte(); //低位在前
251 1 temp_h=ReadByte(); //高位在后
252 1
253 1 flag1=temp_h&0xf8;
254 1 if(flag1)
255 1 {
256 2 temp_h=~temp_h;
257 2 if(temp_l==0)temp_h++; //若低8位全为0且温度为负,取补时就要向高位进1
258 2 temp_l=~temp_l+1;
259 2 }
260 1 dis=(temp_h*256+temp_l)/16;
261 1
262 1 //dis=25.34; //调试用
263 1 // dis=2;
264 1 temper=(uchar)dis;
265 1
266 1
267 1 }
268
269 //================================================
270 //================温度控制开始========
271 void system_heat(uint temperature)
272 {
273 1
274 1 if(temper<=temperature)
275 1 {
276 2 heat1=0;
277 2 tmpchange(); //启动温度转换/
278 2 delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了
-芯片上电后预设的85度这个数。
279 2 tmp(); //温度显示和报警/
280 2 display(temper);
281 2 }
282 1 else if(temper>temperature)
283 1 {
284 2 heat1=1;
285 2 tmpchange(); //启动温度转换/
286 2 delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了
-芯片上电后预设的85度这个数。
287 2 tmp(); //温度显示和报警/
288 2 display(temper);
289 2 }
290 1
291 1 }
292 //--------------串口接收从电脑发来的数据------------------//
293 void chuankou() interrupt 4 using 1//串口接收数据,中断方式
294 {
295 1 if(RI!=0)
296 1 {
297 2 RI=0;
298 2 // receive=SBUF;
299 2 ES=0;
300 2 temp=SBUF;
301 2
C51 COMPILER V7.00 COM 04/21/2008 22:46:10 PAGE 6
302 2
303 2
304 2 if(temp==0x0e)
305 2 {
306 3 // tmpchange(); //启动温度转换/
307 3 // delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -