📄 14-2.lst
字号:
C51 COMPILER V6.20c 14_2 09/02/2001 15:14:51 PAGE 1
C51 COMPILER V6.20c, COMPILATION OF MODULE 14_2
OBJECT MODULE PLACED IN 14-2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 14-2.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3
4 sbit RST = P2^0;
5 sbit CLK = P2^1;
6 sbit DQ = P2^2;
7 sbit TSOR = P2^3;
8 sbit ALERT =P2^4;
9 sbit RS = P2^7;
10 sbit RW = P2^6;
11 sbit EN = P2^5;
12 /*------------------------------------------全局变量------------------------------------------------------
--*/
13 static unsigned char temp1,temp2; //温度值的整数部分、小数部分
14 static unsigned char pos,posset; //数字电位器电位值、设定值
15 static unsigned char min,sec; //分钟、秒
16 static unsigned char count; //Timer0中断计数
17 static unsigned char minset; //设定的分钟数
18 static unsigned char status1,status2; //状态标志
19 bit stop,timeover; //定时停止、结束
20 static char line0[] =" 00:00 ";
21 static char line1[] =" . C W";
22
23 /*--------------------------------------------------------------------------------------------------------
------*/
24 void InitInterupt();
25 void KeyboardDelay();
26 /*-------------------------------------------LCD驱动函数------------------------------------------------*/
27 void DelayL();
28 void DelayS();
29 void WriteCommand(unsigned char c);
30 void WriteData(unsigned char c);
31 void ShowChar(unsigned char pos,unsigned char c);
32 void ShowString(unsigned char line,char *ptr);
33 void InitLcd();
34 /*----------------------------------------------键盘-程序-------------------------------------------------
--*/
35 unsigned char GetKey();
36 /*---------------------------------------------数字温度计驱动-------------------------------------------*/
37 void ChangePos(bit sel,unsigned char pos1,unsigned char pos2);
38 /*------------------------------------------温度传感器驱动----------------------------------------------*/
39 void Delay15();
40 void Delay60();
41 void Delay100ms();
42 void Write0TS();
43 void Write1TS();
44 bit ReadTS();
45 void ResetTS();
46 void WriteByteTS(unsigned char byte);
47 unsigned char ReadByteTS();
48 void InitTS();
49 void GetTempTS();
50 /*-------------------------------------------------主程序-------------------------------------------------
---*/
51 void main (void) {
C51 COMPILER V6.20c 14_2 09/02/2001 15:14:51 PAGE 2
52 1 char code str1[] =" Hello World! ";
53 1 char code str2[] =" 2002-10-20 ";
54 1 unsigned char i;
55 1
56 1 SP=0x50;
57 1 ALERT=0; //报警灯灭
58 1 TSOR=1; //1-wire总线释放
59 1
60 1 DelayL();
61 1 InitLcd(); //初始化LCD
62 1 DelayL();
63 1 ShowString(0,str1); //启动画面
64 1 ShowString(1,str2);
65 1 for(i=0;i<15;i++)
66 1 Delay100ms();
67 1 InitInterupt(); //初始化中断设置
68 1
69 1 minset=10; //缺省定时10分钟
70 1 posset=0; //缺省电位器值0
71 1 min=minset; //初始化数据
72 1 pos=posset;
73 1 sec=0;
74 1 count=0;
75 1 P1=0xF0;
76 1 status1=0;
77 1 status2=0;
78 1 stop=1;
79 1 timeover=0;
80 1
81 1 ChangePos(0,255-pos,255-pos); //设置电位器
82 1
83 1 InitTS(); //初始化温度计
84 1 while(1) //循环显示温度值
85 1 {
86 2 GetTempTS();
87 2 line1[0]=0x20;
88 2 i=temp1;
89 2 if(i>39) //超过40摄氏度,告警灯亮
90 2 ALERT=1;
91 2 if(i>99) //超过100摄氏度,显示温度的百位
92 2 {
93 3 line1[0]=0x31;
94 3 i-=100;
95 3 }
96 2 line1[1]=i/10+0x30; //显示温度的十位
97 2 line1[2]=i%10+0x30; //显示个位
98 2 line1[4]=temp2+0x30; //显示小数位
99 2 if(timeover) //若定时结束,则电位器缓慢复0
100 2 {
101 3 for(;pos>0;pos--)
102 3 {
103 4 ChangePos(0,255-pos,255-pos);
104 4 _nop_();
105 4 _nop_();
106 4 }
107 3 timeover=0;
108 3 posset=0;
109 3 }
110 2 if(pos>posset) //若按键修改电位器位置
111 2 {
112 3 for(;pos>posset;pos--) //则缓变到设定值
113 3 {
C51 COMPILER V6.20c 14_2 09/02/2001 15:14:51 PAGE 3
114 4 ChangePos(0,255-pos,255-pos);
115 4 _nop_();
116 4 _nop_();
117 4 }
118 3 ChangePos(0,255-pos,255-pos);
119 3 }
120 2 else if(pos<posset)
121 2 {
122 3 for(;pos<posset;pos++)
123 3 {
124 4 ChangePos(0,255-pos,255-pos);
125 4 _nop_();
126 4 _nop_();
127 4 }
128 3 ChangePos(0,255-pos,255-pos);
129 3 }
130 2 i=pos;
131 2 line1[9]=0x20; //显示电位器等级值
132 2 if(i>99)
133 2 {
134 3 line1[9]=i/100+0x30;
135 3 i=i%100;
136 3 }
137 2 line1[10]=i/10+0x30;
138 2 line1[11]=i%10+0x30;
139 2 ShowString(1,line1);
140 2 line0[5]=min/10+0x30; //显示时间
141 2 line0[6]=min%10+0x30;
142 2 line0[8]=sec/10+0x30;
143 2 line0[9]=sec%10+0x30;
144 2 ShowString(0,line0);
145 2 Delay100ms();
146 2 }
147 1 }
148
149 void InitInterupt()
150 {
151 1 TMOD=0x21; //初始化中断设置
152 1 TL1=0xFD;
153 1 TH1=0xFD;
154 1 PX0=1;
155 1 EA=1;
156 1 ES=1;
157 1 PCON=0;
158 1 TR1=1;
159 1 SCON=0x50;
160 1
161 1
162 1 TL0=0x00; //定时0.05m
163 1 TH0=0x4C;
164 1 ET0=1;
165 1
166 1 EX0=1;
167 1 IT0=1;
168 1 }
169
170 void KeyboardDelay() //按键中断延时
171 {
172 1 unsigned char i,j;
173 1 i=0x40;
174 1 j=0xFF;
175 1 while(i--)
C51 COMPILER V6.20c 14_2 09/02/2001 15:14:51 PAGE 4
176 1 while(j--);
177 1 }
178
179 /*--------------------------------------------中断处理----------------------------------------------------
--*/
180 Int0_process() interrupt 0 using 0
181 {
182 1 unsigned char key;
183 1 unsigned char keycode[]= "TP";
184 1 unsigned char step[3]={1,2,5};
185 1 EA=0;
186 1 key=GetKey(); //获得按键值
187 1 switch(key)
188 1 {
189 2 case 0:
190 2 stop=!stop;
191 2 min=minset;
192 2 sec=0;
193 2 break;
194 2 case 1:
195 2 case 2:
196 2 case 3:
197 2 if(stop)
198 2 {
199 3 minset+=step[key-1];
200 3 if(minset>60)
201 3 minset=0;
202 3 min=minset;
203 3 }
204 2 break;
205 2 case 5:
206 2 case 6:
207 2 case 7:
208 2 if(stop)
209 2 {
210 3 minset-=step[key-5];
211 3 if(minset>60)
212 3 minset=0;
213 3 min=minset;
214 3 }
215 2 break;
216 2 case 9:
217 2 case 10:
218 2 case 11:
219 2 posset+=step[key-9];
220 2 break;
221 2 case 13:
222 2 case 14:
223 2 case 15:
224 2 posset-=step[key-13];
225 2 break;
226 2 default:
227 2 break;
228 2 }
229 1 TR0=!stop;
230 1 KeyboardDelay();
231 1 P1=0xF0;
232 1 EA=1;
233 1 }
234
235 Timer0_process() interrupt 1 using 0
236 {
C51 COMPILER V6.20c 14_2 09/02/2001 15:14:51 PAGE 5
237 1 EA=0;
238 1 TR0=0;
239 1 TL0=0x00;
240 1 TH0=0x4C;
241 1 count++;
242 1 if(count==20) //如果到累计定时到达1s
243 1 {
244 2 if(sec==0) //定时处理
245 2 {
246 3 if(min==0) //总定时到,则置结束标志
247 3 timeover=1;
248 3 else
249 3 {
250 4 min--;
251 4 sec=59;
252 4 }
253 3 }
254 2 else
255 2 sec--;
256 2 count=0;
257 2 }
258 1 TR0=1;
259 1 EA=1;
260 1 }
261 /*--------------------------------------LCD驱动子程序--------------------------------------------------*/
262 void DelayL()
263 {unsigned char i,j;
264 1 i=0xF0;
265 1 j=0xFF;
266 1 while(i--)
267 1 while(j--);
268 1 }
269
270 void DelayS()
271 {
272 1 unsigned char i;
273 1 i=0x1F;
274 1 while(i--);
275 1 }
276
277 void WriteCommand(unsigned char c)
278 {
279 1 DelayS();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -