?? 44.lst
字號:
C51 COMPILER V8.02 44 05/15/2008 19:00:41 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 44
OBJECT MODULE PLACED IN 44.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 44.c BROWSE DEBUG OBJECTEXTEND
line level source
1 # include "reg51.h"
2 # include "intrins.h"
3
4 # define disdata P0
5 # define discan P2
6
7 # define uchar unsigned char
8 # define uint unsigned int
9
10 sbit DQ = P3^7; //溫度輸入口
11 sbit DIN = P0^7;//led小數點控制
12 /*sbit P3_4 = P3^4; //溫度輸入口
13 sbit P3_5 = P3^5; //溫度輸入口
14 sbit P3_6 = P3^6; //溫度輸入口
15 sbit P3_7 = P3^7; //溫度輸入口
16
17
18 uchar DQ; */
19 uint h;
20 uchar code ditab[16]=
21 {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
22 uchar code dis_7[12]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
23
24 uchar code scan_con[4]={0xf7,0xfB,0xFD,0xFE};//列掃描控制字
25 uchar data temp_data[2]={0x00, 0x00,}; //讀出溫度暫存
26 uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據,1個運算暫存用
27
28 void delay(uint t)
29 {
30 1 for(;t>0;t--);
31 1 }
32
33 /******************************顯示掃描函數******************************/
34 scan()
35 {
36 1 char k;
37 1 for(k=0;k<4;k++) //4位LED掃描控制
38 1 {
39 2 disdata=dis_7[display[k]];
40 2 if(k==1){DIN=0;} //當K=1時,P0^7為低電平顯示小數點
41 2 discan=scan_con[k]; //列掃描
42 2 delay(30);
43 2 discan=0xFF;
44 2 }
45 1 }
46
47 /*******************************DS復位函數******************************/
48 ow_reset(void)
49 {
50 1 char presence=1;
51 1
52 1 while(presence)
53 1 {
54 2 while(presence)
55 2 {
C51 COMPILER V8.02 44 05/15/2008 19:00:41 PAGE 2
56 3 DQ=1;_nop_();_nop_();
57 3 DQ=0;
58 3 delay(50); //延時550毫秒
59 3 DQ=1;
60 3 delay(6);
61 3 presence=DQ;
62 3 }
63 2 delay(45);
64 2 presence=~DQ;
65 2 }
66 1 DQ=1;
67 1 }
68
69 /*****************************DS寫命令函數*********************************/
70 void write_byte(uchar val) //向1-WIRE總線上寫一字節
71 {
72 1 uchar i;
73 1
74 1 for(i=8;i>0;i--)
75 1 {
76 2 DQ=1;_nop_();_nop_();
77 2 DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
78 2
79 2 DQ=val&0x01; //最低位移出
80 2 delay(6);
81 2
82 2 val=val/2; //右移1位
83 2 }
84 1 DQ=1;
85 1 delay(1);
86 1 }
87
88 /*******************************DS讀一字節函數****************************************************/
89 uchar read_byte(void)
90 {
91 1 uchar i;
92 1 uchar value=0;
93 1
94 1 for(i=8;i>0;i--)
95 1 {
96 2 DQ=1;_nop_();_nop_();
97 2
98 2 value>>=1;
99 2
100 2 DQ=0;
101 2 _nop_();_nop_();_nop_();_nop_();
102 2
103 2 DQ=1;_nop_();_nop_();_nop_();_nop_();
104 2
105 2 if(DQ) value|=0x80;
106 2 delay(6);
107 2 }
108 1 DQ=1;
109 1 return(value);
110 1 }
111
112 /******************************讀出溫度函數*************************************************/
113 read_temp()
114 {
115 1 ow_reset();
116 1 write_byte(0xcc);
117 1 write_byte(0xbe);
C51 COMPILER V8.02 44 05/15/2008 19:00:41 PAGE 3
118 1
119 1 temp_data[0]=read_byte();
120 1 temp_data[1]=read_byte();
121 1
122 1 ow_reset();
123 1 write_byte(0xcc);
124 1 write_byte(0x44);
125 1 }
126
127 /********************************計算溫度子函數**********************************************/
128 work_temp()
129 {
130 1 uchar n=0;
131 1 if(temp_data[1]>127)
132 1 {temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0]);n=1;} //負溫度求補碼
133 1
134 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
135 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
136 1
137 1 display[3]=display[4]/100;
138 1 display[1]=display[4]%100;
139 1 display[2]=display[1]/10;
140 1 display[1]=display[1]%10;
141 1
142 1 if(!display[3]){display[3]=0x0a;
143 2 if(!display[2]){display[2]=0x0a;}} //最高位為0時不顯示
144 1 if(n){display[3]=0x0b;} //負溫度是最高為顯示“-”
145 1 }
146
147 /*******************************主函數**********************************************************/
148 main ()
149 {
150 1 disdata=0xff;// 初始化端口
151 1 discan=0xff;
152 1
153 1 for(h=0;h<4;h++) //開機顯示“8888”scan();
154 1 {display[h]=8;}
155 1
156 1 ow_reset(); //開機先轉換一次
157 1 write_byte(0xcc);//skip ROM
158 1 write_byte(0x44);//發轉換命令
159 1
160 1 for(h=0;h<500;h++)//開機顯示“8888”兩秒
161 1 {scan();}
162 1
163 1 while(1)
164 1 {
165 2 read_temp(); //讀出溫度數據
166 2 work_temp(); //處理溫度數據
167 2 for(h=0;h<500;h++) //顯示溫度兩秒
168 2 {scan();}
169 2 }
170 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 437 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
C51 COMPILER V8.02 44 05/15/2008 19:00:41 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 + -