📄 shi.lst
字号:
C51 COMPILER V8.02 SHI 06/17/2011 01:00:25 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SHI
OBJECT MODULE PLACED IN shi.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE shi.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4 uchar qianwei,baiwei,shiwei,gewei; //显示数据各个位置数字的临时变量
5 char led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码表示0-9
6 uint tt,aa,pulse,distance,cost,danjia,wait,way; //定义路程、价钱、等待时间及一些全局的变量等;
7 uchar dengdai,second,minute;
8
9 //按键的定义,所有按键按下去为低电平
10 sbit key0=P1^0; //清零
11 sbit key1=P1^1; //切换路程与等待时间
12 sbit key2=P1^2; //单程还是往返设置
13 sbit key3=P1^3; //暂停按钮
14 sbit led1=P1^4; // 指示
15 sbit led2=P1^5;
16 sbit led3=P1^6;
17 sbit led4=P1^7;
18
19
20 bit key1_flag; //由于按键会自动复位,这个为标志位
21 bit key2_flag;
22 bit key3_flag;
23 bit flag;
24
25 //初始化函数
26 void initial_data(void)
27 {
28 1 distance=0;
29 1 cost=0;
30 1 second=0;
31 1 minute=0;
32 1 way=0;
33 1 key1_flag=1; //
34 1 key2_flag=0; //单程or往返,接指示灯;
35 1 key3_flag=1; //暂停,接指示灯;
36 1 flag=0;
37 1 pulse=0;
38 1 dengdai=0;
39 1 led1=1; //双程指示
40 1 led2=1; //暂停指示
41 1 led3=1; //堵车指示
42 1 led4=1; // 等待时间切换标志
43 1
44 1 }
45
46 //暂停程序
47 void zanting(void)
48 {
49 1 if(key3_flag)
50 1 {
51 2 EX0=0; //关闭中断 定时器
52 2 TR0=0;
53 2 }
54 1 else
55 1 {
C51 COMPILER V8.02 SHI 06/17/2011 01:00:25 PAGE 2
56 2 EX0=1;
57 2 TR0=1;
58 2 }
59 1 key3_flag=!key3_flag;
60 1 }
61
62
63 //计算数据处理
64 void jisuan()
65 {
66 1 if(pulse<=180)
67 1 {
68 2 distance=pulse/6+way/3000;
69 2 cost=50; //60角
70 2 }
71 1 danjia=20; //单程价格
72 1 if(key2_flag) danjia=15; //往返价格
73 1 if(pulse>180)
74 1 {
75 2 distance=pulse/6+way/3000;
76 2 cost=danjia*(distance-30)/10+50;
77 2 }
78 1
79 1 wait=minute*100+second;
80 1 }
81 //显示的辅助程序,分离一个数的各个数字
82 void fenli(uint temp) //数据的分离处理
83 {
84 1 if(temp>9999) temp=9999;
85 1 qianwei=temp/1000;
86 1 baiwei=temp/100%10;
87 1 shiwei=temp%100/10;
88 1 gewei=temp%10;
89 1 }
90
91 //延时约1ms,数码管显示时使用
92 void diplay_delay(void)
93 {
94 1 uchar i;
95 1 for(i=0;i<240;i++);
96 1 }
97
98 //显示程序;
99 void led_show()
100 {
101 1 //-----显示路程或者等待时间----
102 1 if(key1_flag) fenli(distance);
103 1 else fenli(wait);
104 1 P2=0xfe;
105 1 P0=led_seg_code[gewei];
106 1 diplay_delay();
107 1 P2=0xfd;
108 1 if(key1_flag) P0=led_seg_code[shiwei]|0x80; //如果是路程,点亮小数点儿
109 1 else P0=led_seg_code[shiwei]; //如果是时间,不需要点亮小数点儿
110 1 diplay_delay();
111 1 P2=0xfb;
112 1 if(key1_flag) P0=led_seg_code[baiwei];
113 1 else P0=led_seg_code[baiwei]|0x80;
114 1 diplay_delay();
115 1 P2=0xfb7;
116 1 P0=led_seg_code[qianwei];
117 1 diplay_delay();
C51 COMPILER V8.02 SHI 06/17/2011 01:00:25 PAGE 3
118 1
119 1 //-----显示价格----
120 1 fenli(cost);
121 1 P2=0xef;
122 1 P0=led_seg_code[gewei];
123 1 diplay_delay();
124 1 P2=0xdf;
125 1 P0=led_seg_code[shiwei]|0x80;
126 1 diplay_delay();
127 1 P2=0xbf;
128 1 P0=led_seg_code[baiwei];
129 1 diplay_delay();
130 1 P2=0x7f;
131 1 P0=led_seg_code[qianwei];
132 1 diplay_delay();
133 1 }
134
135
136 //延时时基为1ms
137 void delay(uint x)
138 {
139 1 int i,j;
140 1 for(i=x;i>0;i--)
141 1 for(j=340;j>0;j--);
142 1 }
143
144
145 //键盘的扫描
146 void keyscan()
147 { if(key1==0) // 按键消抖并判断按下去的次数为基数还是偶数
148 1 { delay(5);
149 2 if(key1==0)
150 2 key1_flag=!key1_flag;
151 2 }
152 1 if(key0==0) // 清零
153 1 { delay(5);
154 2 if(key0==0)
155 2 initial_data();
156 2 }
157 1 if(key3==0) // 暂停
158 1 { delay(5);
159 2 if(key3==0)
160 2 zanting();
161 2 }
162 1 if(key2==0) // 单程还是往返
163 1 { delay(5);
164 2 if(key2==0)
165 2 key2_flag=!key2_flag;
166 2 }
167 1 //指示等扫描
168 1 led1=!key2_flag; // 指示,单程还是往返,灯低电平点亮; 往返亮;
169 1 led2=key3_flag; // 指示,暂停时亮;
170 1 led3=flag; // 指示是否等待;
171 1 led4=key1_flag; //切换指示,显示路程还是等待时间;
172 1 diplay_delay();
173 1
174 1 }
175
176 //定时器初始化
177 void initial_time()
178 {
179 1 TMOD=0x01;
C51 COMPILER V8.02 SHI 06/17/2011 01:00:25 PAGE 4
180 1 TH0=(65536-10000)/256;
181 1 TL0=(65536-10000)%256;
182 1 IE=0x83;
183 1 IT0=1; //外部边沿触发方式
184 1 TR0=1;
185 1 }
186 // 中断记录脉冲数
187 void zd() interrupt 0 //中断0
188 {
189 1 aa++;
190 1 if(flag) pulse++; //进入中途等待计价
191 1 }
192 //********* 定时器 ********
193 void time0() interrupt 1 //定时0
194 {
195 1 TH0=(65536-10000)/256; //10ms
196 1 TL0=(65536-10000)%256;
197 1 tt++;
198 1 if(tt>=100) //1s采样
199 1 {
200 2 tt=0;
201 2 aa=aa/5; //速度(n*圈/s)
202 2 if(aa<=5) flag=0;
203 2 else flag=1;
204 2 aa=0;
205 2 }
206 1 if(!flag)
207 1 {
208 2 way++;
209 2 dengdai++;
210 2 if(dengdai==100)
211 2 { dengdai=0;
212 3 second++;
213 3 if(second==60)
214 3 {
215 4 minute++;
216 4 second=0;
217 4 }
218 3 }
219 2 }
220 1 }
221
222 //主程序
223 void main(void)
224 {
225 1 initial_data(); //初始化数据
226 1 initial_time(); //初始化定时器
227 1 while(1)
228 1 {
229 2 keyscan();
230 2 jisuan();
231 2 led_show();
232 2 }
233 1 }
234
235
236
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 751 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V8.02 SHI 06/17/2011 01:00:25 PAGE 5
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 33 ----
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -