?? main.lst
字號:
C51 COMPILER V8.02 MAIN 06/02/2007 10:41:58 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***********************************************************************************
2 Project: SHTxx demo program (V2.1)
3 Filename: SHTxx_Sample_Code.c
4
5 Prozessor: 80C51 family
6 Compiler: Keil Version 6.14
7
8 Autor: MST
9 Copyrigth: (c) Sensirion AG
10 ***********************************************************************************/
11
12 #include <REGX51.H>
13 //#include <AT89s52.h> //Microcontroller specific library, e.g. port definitions
14 #include <intrins.h> //Keil library (is used for _nop()_ operation)
15 #include <math.h> //Keil library
16 #include <stdio.h> //Keil library
17
18 typedef union
19 { unsigned int i;
20 float f;
21 } value;
22
23 //----------------------------------------------------------------------------------
24 // modul-var
25 //----------------------------------------------------------------------------------
26 enum {TEMP,HUMI};
27
28 #define DATA P1_1
29 #define SCK P1_0
30
31 #define noACK 0
32 #define ACK 1
33 //adr command r/w
34 #define STATUS_REG_W 0x06 //000 0011 0
35 #define STATUS_REG_R 0x07 //000 0011 1
36 #define MEASURE_TEMP 0x03 //000 0001 1
37 #define MEASURE_HUMI 0x05 //000 0010 1
38 #define RESET 0x1e //000 1111 0
39
40 ///////////////////////////////////////////////////////////////
41
42
43
44 unsigned char data dis_digit;
45 unsigned char key_s, key_v;
46
47 unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
48 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
49 unsigned char dis_buf[8]; // 顯示緩沖區
50 unsigned char sec_bcd[8]; // 秒計數值, BCD碼
51 unsigned char dis_index; //
52 unsigned char key_times; // K1 按下次數 //
53
54 void clr_time();
55 void update_disbuf();
C51 COMPILER V8.02 MAIN 06/02/2007 10:41:58 PAGE 2
56 bit scan_key();
57 void proc_key();
58 void delayms(unsigned char ms);
59
60 sbit K1 = P1^4;
61 ///////////////////////////////////////////////////////////////
62
63
64 /* *
65 * 數碼管顯示秒表, 分辨率0.01s *
66 * K1=P1.4---控制按鈕 *
67 * 第一次按下時, 啟動開始計時 *
68 * 第二次按下時, 停止 *
69 * 第三次按下時, 歸零 *
70 * *
71 * 秒單位,寄存器與數碼管對應關系: *
72 * *
73 * --- 秒單位 ---------- 數碼管端口 ---- 緩沖區 --------- 計時BCD碼值寄存器 *
74 * 十萬位 P20 dis_buf[7] sec_bcd[7] *
75 * 萬位 P21 dis_buf[6] sec_bcd[6] *
76 * 千位 P22 dis_buf[5] sec_bcd[5] *
77 * 百位 P23 dis_buf[4] sec_bcd[4] *
78 * 十位 P24 dis_buf[3] sec_bcd[3] *
79 * 個位(1.s) P25 dis_buf[2] sec_bcd[2] *
80 * 十分位(0.1s) P26 dis_buf[1] sec_bcd[1] *
81 * 百分位(0.01s) P27 dis_buf[0] sec_bcd[0] *
82 * *
83 ********************************************************************************
84 */
85
86
87
88
89 void smg(void)
90 {
91 1 P0 = 0xff;
92 1 P2 = 0xff;
93 1 TMOD = 0x11; // 定時器0, 1工作模式1, 16位定時方式
94 1 TH1 = 0xdc;
95 1 TL1 = 0;
96 1
97 1 TH0 = 0xFC;
98 1 TL0 = 0x17;
99 1
100 1 clr_time(); //
101 1
102 1 dis_digit = 0x7f; // 初始顯示P20口數碼管
103 1 dis_index = 0; //
104 1
105 1 key_times = 0;
106 1 key_v = 0x01;
107 1
108 1 IE = 0x8a; // 使能timer0, timer1中斷
109 1
110 1 TR0 = 1;
111 1 TR1 = 0;
112 1 while(1)
113 1 {
114 2 if(scan_key())
115 2 {
116 3 delayms(10);
117 3 if(scan_key())
C51 COMPILER V8.02 MAIN 06/02/2007 10:41:58 PAGE 3
118 3 {
119 4 key_v = key_s;
120 4 proc_key();
121 4 }
122 3 }
123 2
124 2 }
125 1 }
126
127 void clr_time()
128 {
129 1 sec_bcd[0] = 0x0;
130 1 sec_bcd[1] = 0x0;
131 1 sec_bcd[2] = 0x0;
132 1 sec_bcd[3] = 0x0;
133 1 sec_bcd[4] = 0x0;
134 1 sec_bcd[5] = 0x0;
135 1 sec_bcd[6] = 0x0;
136 1 sec_bcd[7] = 0x0;
137 1
138 1 update_disbuf();
139 1
140 1 }
141
142 bit scan_key()
143 {
144 1 key_s = 0x00;
145 1 key_s |= K1;
146 1 return(key_s ^ key_v);
147 1 }
148
149 void proc_key()
150 {
151 1 if((key_v & 0x01) == 0)
152 1 {
153 2 key_times++;
154 2 if(key_times == 1)
155 2 {
156 3 TR1 = 1;
157 3 }
158 2 else if(key_times == 2)
159 2 {
160 3 TR1 = 0;
161 3 }
162 2 else
163 2 {
164 3 clr_time();
165 3 key_times = 0;
166 3 }
167 2
168 2 }
169 1 }
170
171 void timer0() interrupt 1
172 // 定時器0中斷服務程序, 用于數碼管的動態掃描
173 // dis_index --- 顯示索引, 用于標識當前顯示的數碼管和緩沖區的偏移量
174 // dis_digit --- 位選通值, 傳送到P2口用于選通當前數碼管的數值, 如等于0xfe時,
175 // 選通P2.0口數碼管
176 // dis_buf --- 顯于緩沖區基地址
177 {
178 1 TH0 = 0xFC;
179 1 TL0 = 0x17;
C51 COMPILER V8.02 MAIN 06/02/2007 10:41:58 PAGE 4
180 1
181 1 P2 = 0xff; // 先關閉所有數碼管
182 1 P0 = dis_buf[dis_index]; // 顯示代碼傳送到P0口
183 1 P2 = dis_digit; //
184 1
185 1 dis_digit = _cror_(dis_digit,1); // 位選通值右移(P20<-P27), 下次中斷時選通下一位數碼管
186 1 dis_index++; //
187 1
188 1 dis_index &= 0x07; // 8個數碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
189 1 }
190
191 void timer1() interrupt 3
192 //
193 {
194 1 unsigned char i;
195 1 TH1 |= 0xdc;
196 1 for(i = 0; i < 8; i++)
197 1 {
198 2 sec_bcd[i]++; // 低位加1
199 2 if(sec_bcd[i] < 10) // 如果低位滿10則向高位進1
200 2 break; // 低位未滿10
201 2 sec_bcd[i] = 0; // 低位滿10清0
202 2 }
203 1 update_disbuf(); // 更新顯示緩沖區
204 1 }
205
206 void update_disbuf()
207 // 更新顯示緩沖區
208 {
209 1 dis_buf[0] = dis_code[sec_bcd[0]];
210 1 dis_buf[1] = dis_code[sec_bcd[1]];
211 1 dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f; // 加上小數點
212 1 dis_buf[3] = dis_code[sec_bcd[3]];
213 1 dis_buf[4] = dis_code[sec_bcd[4]];
214 1 dis_buf[5] = dis_code[sec_bcd[5]];
215 1 dis_buf[6] = dis_code[sec_bcd[6]];
216 1 dis_buf[7] = dis_code[sec_bcd[7]];
217 1 }
218
219 void delayms(unsigned char ms)
220 // 延時子程序
221 {
222 1 unsigned char i;
223 1 while(ms--)
224 1 {
225 2 for(i = 0; i < 120; i++);
226 2 }
227 1 }
228
229
230
231
232 //////////////////////////////////////////////////////////////
233
234 //////////////////////////////////////////////////////////////
235
236
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -