📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 08/28/2005 16:44:46 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.OBJ
COMPILER INVOKED BY: E:\Program Files\专业工具\keil\C51\BIN\C51.EXE MAIN.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //多模块程序编写得I2C程序!!
2 //实现简单的数字时钟---DS1307
3 //experience
4 //判断时刻,读取时钟为bcd码,十六进制
5 //先存起步价,无一个误差脉冲(100m),否则先判断则有100m误差(一个脉冲)
6 //比较分段里程,不用公里,而直接比较100m,还可以减少一个除法
7 //按键切换的问题,标志位在中断服务程序取反!!!!!!!可悲!!!-----------------------
8 //整个单片机执行时序问题?----计算等待费用时候!!----------------------
9 //串口问题!!一定是定时器2出现问题 !!!!
10 //串行口关于两个文件变量定义的问题!!
11 //IDATA为什么不会抱错呢
12 //养成良好的编程习惯!!内存分配-----------
13
14 #include<reg52.h>
15 #include<intrins.h>
16 #include<serial.h>
17 #include<lcd.h>
18 #include<IIC.h>
19 #define uchar unsigned char
20 #define uint unsigned int
21 #define ulong unsigned long
22
23 unsigned char idata buf_seri[6];
24 bit ack_seri;
25
26 uchar code table1[16]=" MARTIAN STUDIO ";
27 uchar code table2[16]="状态:载客 ";
28 uchar code table3[16]="状态:空车 ";
29
30
31 //声明全局变量
32 uchar *s ; //I2C器件读写单元缓冲区首地址指针
33 uchar no; //读写I2C器件字节数
34 uchar sla ; //I2C器件内部地址,都为写地址
35 uchar suba; //器件内部地址
36 uchar bdata flag ; //位寻址区定义
37
38 uchar bcd_num ;
39
40 sbit fg_1s =flag^4; //1s刷新标志
41 sbit fg_1s1=flag^5; //1s刷新,计算等待费用
42
43 sbit fg_qibu =flag^7;
44 bit fg_day_ng;
45 bit fg_100 ;
46 bit fg_wait;
47 bit key_fg;
48 bit fg_on;
49 bit fg_seri;
50 uchar buf_key ; //存按键值
51 uchar idata time_temp[4] ; //存实时读取1307系统时间
52 uchar idata date_temp[3] ; //存实时读取1307系统时间
53 uchar idata lcd_temp[16] ; //显示缓冲?
54 uchar idata dis_temp[8];
55 uchar idata mrd[8] ; //接收缓冲区
C51 COMPILER V7.50 MAIN 08/28/2005 16:44:46 PAGE 2
56 uchar idata trd[8] ; //发送缓冲区
57 // uchar idata table_shape0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//字形表0-9
58 // uchar idata table_shape1[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字形表
59
60 uchar idata table_time[7]={0x00,0x00,0x06,0x03,0x08,0x09,0x05};//设置起始时间2005年9月8号8点0分0秒
61 uchar buf_sec;
62
63 uchar idata stack[10] ; //人工栈
64 uchar idata buf_bcd[9] ; //存放hex to bcd 后的 bcd 最多存放8位
65
66 ulong buf_dis ; //存放里程,四个字节
67 ulong buf_pre ; //存放价格,四个字节
68 ulong pre_dis ; //存放上次载客里程
69 ulong pre_pre ; //存放上次载客费用
70
71 ulong total_pre; //存放总营业额
72 ulong day_pre ; //日额
73
74 uint qibu_day ; //存白天起步价格,10元转1000
75 uint qibu_ng ; //存夜间起步价格,12元转1200
76
77 uint midd_day ; //存3-8km价格1.6元转16
78 uint huikong_day ; //存>8km价格2.2元转22
79 uint wait_day ; //等待价格,1.5元转150
80
81
82 ulong wait_sec ; //存等待时间,为精确计算,按照秒算
83 uint wait_min ; //存等待分
84 uint wait_second ; //存等待秒
85
86 uchar dis_wmin ; //载客结束显示等待分钟
87 uchar dis_wsec ; //载客结束显示等待秒
88
89 uchar dec_sec ; //存20,1s刷新
90 uchar dia ; //存放直径
91 uchar buf_dia ; //计算速度,定时次数
92 uchar extra ; //加价
93 uint buf_sp ; //存放速度
94 uint buf_sp_temp;
95
96 uchar pu ; //存脉冲数191----计算里程
97 uchar buf_pu ; //暂存脉冲数191
98
99
100
101 uchar error_type _at_ 0x30 ; //存放写器件错误代码类型,全局变量
102
103
104 //初始化清零子函数
105 void clr_ram( uchar * s,uchar no )
106 { static uchar i;
107 1 for(i=0;i<no;i++)
108 1 s[i]=0;
109 1 }
110
111
112 //清除LCD
113 void clr_lcd( uchar *s,uchar no)
114 { static uchar i;
115 1 for(i=0;i<no;i++)
116 1 s[i]=0x20;
117 1 }
C51 COMPILER V7.50 MAIN 08/28/2005 16:44:46 PAGE 3
118
119
120 //hex 转 bcd 子程序
121 //入口参数长整型数据
122 //出口参数存bcd码缓冲区
123 void hextobcd(ulong a ,uchar * s)
124 {
125 1 static uchar i;
126 1 ulong temp=a;
127 1 for(i=0; temp;i++ )
128 1 { s[i]=temp%10;
129 2 temp/=10;
130 2 }
131 1 s[i]='\0';
132 1 bcd_num=i;
133 1
134 1 }
135
136
137
138 void out_put( uint a)
139 {
140 1 static idata uchar b[6]; //存bcd码
141 1 static idata uchar c[6]; //指针
142 1 static uchar j,i;
143 1
144 1 hextobcd(a,b);
145 1 //倒转
146 1 i=bcd_num;
147 1 for(j=0;j<i; j++)
148 1 c[j]=b[i-j-1]+0x30;
149 1
150 1 for(j=0;j<i;j++)
151 1 b[j]=c[j];
152 1 b[j]='\0'; //结束标志
153 1
154 1 UartSendString(b); //UartSendString(c);错误,指针已经被改变
155 1
156 1 }
157
158
159 //初始化函数
160 void init(void)
161 { clr_ram(time_temp,4) ; //时间存放单元清零
162 1 clr_ram(date_temp,3) ; //日期存放单元清零
163 1 clr_ram(dis_temp,8) ; //显示缓冲区清零
164 1 clr_ram(trd,8) ; //发送缓冲区单元清零
165 1 clr_ram(mrd,8) ; //接收缓冲区单元清零
166 1 clr_ram(buf_bcd,9) ; //bcd码缓冲区清零
167 1 clr_ram(stack,10) ; //清除人工栈
168 1
169 1 //以下单元清零
170 1
171 1 fg_1s =0; //显示刷新1s未到
172 1 fg_1s1=0; //计算等待费用1s未到
173 1 fg_wait=0;
174 1 key_fg=0;
175 1 fg_on=0;
176 1 fg_100=0;
177 1 fg_qibu=1; //计算起步价
178 1 fg_day_ng=1; //day
179 1 buf_sp=0;
C51 COMPILER V7.50 MAIN 08/28/2005 16:44:46 PAGE 4
180 1 buf_sp_temp=0;
181 1
182 1 wait_sec=0;
183 1 wait_min=0;
184 1 buf_sp=0;
185 1 dec_sec=20;
186 1 buf_key=0; //清除按键值
187 1 buf_dis=0;
188 1 buf_pre=0;
189 1 pre_dis=0;
190 1 pre_pre=0;
191 1 total_pre=0;
192 1 day_pre=0;
193 1 buf_sec=table_time[0];
194 1
195 1
196 1 //以下参数可通过与PC机通信
197 1 dia=50; //存直径
198 1 extra=12; //夜间加价0.2
199 1 qibu_day=10000; //起步价格10
200 1 midd_day=160; //中间价格1.6元/km
201 1 huikong_day=210; //回空价格2.2元/km
202 1 wait_day=1500; //等待价格1.5元/min
203 1 pu=buf_pu=191; //计算里程,脉冲数
204 1 buf_dia=dia;
205 1 qibu_ng= qibu_day/10*extra;//起步价格12
206 1
207 1
208 1
209 1
210 1
211 1
212 1
213 1 //定时器设置
214 1 TMOD=0X21; //设置TO工作方式
215 1 TH0=0X6c; //设置T0计数初值 65536-37680=0x6cd0;
216 1 TL0=0Xd0;
217 1 ET0=1; //启动定时中断
218 1 ET1=0;
219 1 //中断设置
220 1
221 1 IE0=0 ;
222 1 IE1=0 ;
223 1 IT0=1 ;
224 1 IT1=1 ;
225 1 EX0=1 ;
226 1 EX1=1 ;
227 1 EA=1 ;
228 1 TR0=1; //启动定时器
229 1 TR1=1;
230 1 }
231
232
233 //设置时间
234 void set_time(void)
235 {
236 1 no=7; //写入1307七个字节
237 1 suba=0X00; //器内地址
238 1 sla=0XD0; //器件地址
239 1
240 1 if ( ! ISendStr(sla,suba,table_time,no) )
241 1
C51 COMPILER V7.50 MAIN 08/28/2005 16:44:46 PAGE 5
242 1 error_type=0x01; //写时钟错误,代码0x01
243 1
244 1 }
245
246
247 //读取1307系统时间,入口参数为指向字节单元的指针,
248 //返回1表示读取成功,读取内容存指针所指缓冲区
249 void rd_time_date(uchar *p_time, uchar *p_date )
250 { //读时间
251 1 no=4; //读取1307七个字节
252 1 suba=0X00; //器内地址
253 1 sla=0XD0; //器件地址
254 1 if ( ! IRcvStr(sla,suba, p_time, no) )
255 1
256 1 error_type=0x02; //读时钟错误,代码0x02
257 1
258 1
259 1
260 1
261 1
262 1
263 1
264 1
265 1
266 1 //读日期
267 1 no=3; //读取1307七个字节
268 1 suba=0X04; //器内地址
269 1 sla=0XD0; //器件地址
270 1
271 1 if ( ! IRcvStr(sla,suba, p_date, no) )
272 1
273 1 error_type=0x02; //读时钟错误,代码0x02
274 1 }
275
276
277
278
279
280 //车行驶,切换按键,不影响车里程和费用计算
281 void on_taxi(void)
282 {
283 1 //根据100m脉冲加1,代表100m ,根据价格计算费用
284 1 if ( fg_100 )
285 1 { buf_dis+=1; //里程加100m
286 2 fg_100=0; //清标志
287 2
288 2 //price
289 2 if ( buf_dis<=30 ) buf_pre=buf_pre;
290 2 if( buf_dis>30 && buf_dis<=80 && fg_day_ng ) buf_pre+=midd_day ;
291 2 if( buf_dis>30 && buf_dis<=80 && !fg_day_ng ) buf_pre=buf_pre+midd_day/10*extra;
292 2 if( buf_dis>80 && fg_day_ng ) buf_pre+=huikong_day;
293 2 if( buf_dis>80 && !fg_day_ng ) buf_pre+=(huikong_day/10*extra);
294 2 }
295 1
296 1 //等待费用
297 1 if ( buf_sp<=5 && fg_1s1 )
298 1 {
299 2 wait_sec+=1; //等待累加1s
300 2 dis_wmin=wait_min= wait_sec/60;
301 2 dis_wsec=wait_second=wait_sec%60;
302 2 }
303 1 //解决了问题,终于发现问题了!!
C51 COMPILER V7.50 MAIN 08/28/2005 16:44:46 PAGE 6
304 1 if ( wait_min >5 && wait_second==0 &&fg_1s1 )
305 1 fg_wait=1; //类似中断处理内设置标志位
306 1
307 1 if ( fg_wait )
308 1
309 1 { fg_wait=0;
310 2 if ( fg_day_ng )
311 2 buf_pre+=wait_day;
312 2 else
313 2 buf_pre=buf_pre+(wait_day/10*extra);
314 2 }
315 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -