?? temp.lst
字號:
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE TEMP
OBJECT MODULE PLACED IN temp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temp.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************/
2 //
3 // DS18B20溫度計C程序
4 // 2005.2.28通過調試
5 /*********************************************************************/
6 //使用AT89C2051單片機,12MHZ晶振,用共陽LED數碼管
7 //P1口輸出段碼,P3口掃描
8 //#pragma src(d:\aa.asm)
9 #include "reg51.h"
10 #include "intrins.h" //_nop_();延時函數用
11 #define Disdata P1 //段碼輸出口
12 #define discan P3 //掃描口
13 #define uchar unsigned char
14 #define uint unsigned int
15 sbit DQ=P3^7; //溫度輸入口
16 sbit DIN=P1^7; //LED小數點控制
17 uint h;
18 //
19 //
20 //*******溫度小數部分用查表法**********//
21 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
22 //
23 uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
24 /* 共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
25 uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列掃描控制字
26 uchar data temp_data[2]={0x00,0x00}; // 讀出溫度暫放
27 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數據,共4個數據,一個運算暫存用
28 //
29 //
30 //
31 /***********11微秒延時函數**********/
32 //
33 void delay(uint t)
34 {
35 1 for(;t>0;t--);
36 1 }
37 //
38 /***********顯示掃描函數**********/
39 scan()
40 {
41 1 char k;
42 1 for(k=0;k<4;k++) //四位LED掃描控制
43 1 {
44 2 Disdata=dis_7[display[k]];
45 2 if(k==1){DIN=0;}
46 2 discan=scan_con[k];delay(90);discan=0xff;
47 2 }
48 1 }
49 //
50 //
51 /***********18B20復位函數**********/
52 ow_reset(void)
53 {
54 1 char presence=1;
55 1 while(presence)
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 2
56 1 {
57 2 while(presence)
58 2 {
59 3 DQ=1;_nop_();_nop_();
60 3 DQ=0; //
61 3 delay(50); // 550us
62 3 DQ=1; //
63 3 delay(6); // 66us
64 3 presence=DQ; // presence=0繼續下一步
65 3 }
66 2 delay(45); //延時500us
67 2 presence = ~DQ;
68 2 }
69 1 DQ=1;
70 1 }
71 //
72 //
73 /**********18B20寫命令函數*********/
74 //向 1-WIRE 總線上寫一個字節
75 void write_byte(uchar val)
76 {
77 1 uchar i;
78 1 for (i=8; i>0; i--) //
79 1 {
80 2 DQ=1;_nop_();_nop_();
81 2 DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
82 2 DQ = val&0x01; //最低位移出
83 2 delay(6); //66us
84 2 val=val/2; //右移一位
85 2 }
86 1 DQ = 1;
87 1 delay(1);
88 1 }
89 //
90 /*********18B20讀1個字節函數********/
91 //從總線上讀取一個字節
92 uchar read_byte(void)
93 {
94 1 uchar i;
95 1 uchar value = 0;
96 1 for (i=8;i>0;i--)
97 1 {
98 2 DQ=1;_nop_();_nop_();
99 2 value>>=1;
100 2 DQ = 0; //
101 2 _nop_();_nop_();_nop_();_nop_(); //4us
102 2 DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
103 2 if(DQ)value|=0x80;
104 2 delay(6); //66us
105 2 }
106 1 DQ=1;
107 1 return(value);
108 1 }
109 //
110 /***********讀出溫度函數**********/
111 //
112 read_temp()
113 {
114 1 ow_reset(); //總線復位
115 1 write_byte(0xCC); // 發Skip ROM命令
116 1 write_byte(0xBE); // 發讀命令
117 1 temp_data[0]=read_byte(); //溫度低8位
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 3
118 1 temp_data[1]=read_byte(); //溫度高8位
119 1 ow_reset();
120 1 write_byte(0xCC); // Skip ROM
121 1 write_byte(0x44); // 發轉換命令
122 1 }
123 //
124 /***********溫度數據處理函數**********/
125 work_temp()
126 {
127 1 uchar n=0; //
128 1 if(temp_data[1]>127)
129 1 {temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//負溫度求補碼
130 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
131 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
132 1 display[3]=display[4]/100;
133 1 display[1]=display[4]%100;
134 1 display[2]=display[1]/10;
135 1 display[1]=display[1]%10;
136 1 if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位為0時都不顯示
137 1 if(n){display[3]=0x0B;}//負溫度時最高位顯示"-"
138 1 }
139 //
140 //
141 /**************主函數****************/
142 main()
143 {
144 1 Disdata=0xff; //初始化端口
145 1 discan=0xff;
146 1 for(h=0;h<4;h++){display[h]=8;}//開機顯示8888
147 1 ow_reset(); // 開機先轉換一次
148 1 write_byte(0xCC); // Skip ROM
149 1 write_byte(0x44); // 發轉換命令
150 1 for(h=0;h<500;h++)
151 1 {scan();} //開機顯示"8888"2秒
152 1 while(1)
153 1 {
154 2 read_temp(); //讀出18B20溫度數據
155 2 work_temp(); //處理溫度數據
156 2 for(h=0;h<500;h++)
157 2 {scan();} //顯示溫度值2秒
158 2 }
159 1 }
160 //
161 //*********************結束**************************//
162
163
164
165
166
167
168
169
170
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 420 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 4
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -