📄 060305.lst
字号:
C51 COMPILER V8.01 060305 05/18/2008 12:47:07 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE 060305
OBJECT MODULE PLACED IN 060305.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 060305.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //几点说明:关机可以让单片机真正休眠进入真正低功耗状态,但是由于液晶一直有电供应且不知其功耗,故能省多少电
-并不知道,当然可以通过一个管脚通过
2 //控制三极管的基极来给液晶供电,关机时给其断电
3 #include <at89x52.h>
4 #include"LCD1602.h"
5 #include"I2C.h"
6 sfr P1Port = 0x90;
7 sbit led1=P3^7;
8 sbit led2=P3^6;
9 sbit led3=P3^5;
10 sbit led4=P3^4;
11 sbit lcd_on=P2^7;//P2^7控制lcd的开关
12 //########################################################################################################
-##############################
13 //I2C程序
14 //########################################################################################################
-##############################
15 unsigned char wheel_radi;
16 unsigned short sec_add1;
17 unsigned char second1;
18 unsigned char minute;
19 unsigned char hour;
20 unsigned short sec_add2; //ms
21 unsigned int cal_sec_add2; //
22 unsigned int mil_temp;
23 unsigned int miles; //最大值为65536,即655.36km
24 unsigned int speed;
25 unsigned int max_speed;
26 unsigned int time_round; //保存一个时间里面包含了几个36ms
27 unsigned int temp_radi;
28 unsigned int totalmile=0;
29 unsigned int wspeed;//存放圈速度
30 unsigned char butt_down;
31 bit speedflag;
32 bit firstime_flag;//消除速度第一次效应
33 unsigned char timearray[]={0x30,0x30,0x3a,0x30,0x30,0x3a,0x30,0x30,0xff};
34 unsigned char speedarray[]={0x30,0x30,0x2e,0x30,0x6b,0x6d,0x2f,0x68,0xff};
35 unsigned char milesarray[]={0x30,0x30,0x30,0x2e,0x30,0x30,0x6b,0x6d,0xff};
36 unsigned char wspeedarray[]={0x30,0x30,0x30,0x72,0x2f,0x6d,0x69,0x6e,0xff};
37 void Delay1ms(unsigned char count)
38 {
39 1 unsigned char i,j;
40 1 for(i=0;i<count;i++)
41 1 for(j=0;j<33;j++);
42 1 }
43 void inttial_reg()
44 {
45 1 max_speed=0;
46 1 speedflag=0;
47 1 firstime_flag=0;
48 1 sec_add1=0;
49 1 second1=0;
50 1 minute=0;
51 1 hour=0; //时、分、秒、毫秒计数器,用来寄存行驶时间
52 1 sec_add2=0;
C51 COMPILER V8.01 060305 05/18/2008 12:47:07 PAGE 2
53 1 cal_sec_add2=0;
54 1 mil_temp=0;
55 1 miles=0;
56 1 speed=0;
57 1 time_round=0;
58 1 temp_radi=180*wheel_radi;
59 1 }
60 void initiall()
61 {
62 1 //warm up 延时
63 1 lcd_on=1;
64 1 Delay1ms(60);
65 1 sta();
66 1 wri_one_char(0xa0);
67 1 ack();
68 1 wri_one_char(0x02);
69 1 ack();
70 1 sta();
71 1 wri_one_char(0xa1);
72 1 ack();
73 1 wheel_radi=read();
74 1 no_ack();
75 1 stop();
76 1 inttial_reg();
77 1 TMOD=0x11;
78 1 TL0=0xb0;
79 1 TH0=0x3c;
80 1 TL1=0x30;
81 1 TH1=0xf8; //打开外中断0,定时器0和定时器1、总中断的中断允许
82 1 TCON=0x01; //将外中断0设置为跳变触发方式
83 1 //下面从外部存储器中读入车轮周长的值
84 1 //将中断设为下降沿,定时器模式设为1
85 1 //将定时器0用来计时,定时器1用来计相邻脉冲的时间间隔
86 1 //如果下一脉冲还没有到来而已经经过很长时间,则可以将速度置零
87 1 //$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88 1 LCD_Initial();
89 1 }
90 void timer0 (void) interrupt 1 //计时程序,时间数据输出到LCD上
91 {
92 1 TL0=0xb0;
93 1 TH0=0x3c;
94 1 if (sec_add1==19) //定时时长50ms
95 1 {
96 2 sec_add1=0;
97 2 if (second1==59)
98 2 {
99 3 second1=0;
100 3 if (minute==59)
101 3 {
102 4 minute=0;
103 4 if (hour==9)
104 4 {
105 5 hour=0;
106 5 }
107 4 else
108 4 {
109 5 hour++;
110 5 }
111 4 }
112 3 else
113 3 {
114 4 minute++;
C51 COMPILER V8.01 060305 05/18/2008 12:47:07 PAGE 3
115 4 }
116 3 }
117 2 else
118 2 {
119 3 second1++;
120 3 }
121 2 }
122 1 else
123 1 {
124 2 sec_add1++;
125 2 }
126 1 }
127 void timer1 (void) interrupt 3 //定时器1的中断,对转一圈的时间进行计时
128 {
129 1 TL1=0x30;
130 1 TH1=0xf8; //定时时长2ms
131 1 sec_add2++;
132 1 if(sec_add2>2500){speed=0;wspeed=0;speedflag=1;}
133 1 else{speedflag=0;}
134 1 }
135 void pulse_in (void) interrupt 0
136 {
137 1 //将当前寄存器数值保存并置零,同时开启定时器
138 1 //Delay1ms(100);
139 1 mil_temp+=wheel_radi; //因为wheel_radi是以厘米为单位的,而且我们的显示精度到0.01km(即10m),故要和1000
-进行比较
140 1 if (mil_temp>=1000)
141 1 {
142 2 mil_temp-=1000;
143 2 miles++; //这里miles也是取的整数,单位也是10m,尽管最后在lcd上显示的是km/s
144 2 }
145 1 cal_sec_add2=sec_add2;
146 1 sec_add2=0;
147 1 if(speedflag==0)
148 1 {
149 2 speed=temp_radi/cal_sec_add2;
150 2 wspeed=30000/cal_sec_add2;
151 2 } //*************#########################*******************由于简化运算,这里的精度不可能很
-高,
152 1 else {
153 2 speed=0;
154 2 wspeed=0;
155 2 } //这里速度的单位是:百米/小时
156 1 if(firstime_flag==0){firstime_flag=1;speed=0;wspeed=0;}//消除速度第一次效应
157 1 if(speed>max_speed) max_speed=speed;
158 1 IE0=0; //清中断标志
159 1 }
160 //时间格式: hour(1bit) : minute (int) : second1 (int)
161 //速度: speed(3bits) 百米/小时------->**.*
162 //里程: miles 十米------>km .**
163 //这里很重要的一件事情就是将数据形式转换为可以送去显示的形式
164 void display()
165 {
166 1 timearray[1]=hour+0x30;
167 1 timearray[3]=minute/10+0x30;
168 1 timearray[4]=minute%10+0x30;
169 1 timearray[6]=second1/10+0x30;
170 1 timearray[7]=second1%10+0x30;
171 1 speedarray[0]=speed/100+0x30;
172 1 speedarray[1]=(speed/10)%10+0x30;
173 1 speedarray[3]=speed%10+0x30;
174 1 milesarray[0]=miles/10000+0x30;
C51 COMPILER V8.01 060305 05/18/2008 12:47:07 PAGE 4
175 1 milesarray[1]=(miles/1000)%10+0x30;
176 1 milesarray[2]=(miles/100)%10+0x30;
177 1 milesarray[4]=(miles/10)%10+0x30;
178 1 milesarray[5]=miles%10+0x30;
179 1 wspeedarray[0]=wspeed/100+0x30;
180 1 wspeedarray[1]=(wspeed/10)%10+0x30;
181 1 wspeedarray[2]=wspeed%10+0x30;
182 1 }
183 unsigned int cal_total_miles()
184 {
185 1 unsigned int stoa=0;
186 1 sta();
187 1 wri_one_char(0xa0);
188 1 ack();
189 1 wri_one_char(0x00);
190 1 ack();
191 1 sta();
192 1 wri_one_char(0xa1);
193 1 ack();
194 1 stoa=read();
195 1 no_ack();
196 1 stop();
197 1 stoa=stoa<<8;
198 1 sta();
199 1 wri_one_char(0xa0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -