出租车计价器源程序.doc_第1页
出租车计价器源程序.doc_第2页
出租车计价器源程序.doc_第3页
出租车计价器源程序.doc_第4页
出租车计价器源程序.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* C51* * * * * Sunday, July 01 2012* */#include#include#include#define uchar unsigned char#define uint unsigned int#define _NOP_(); _nop_();_nop_();_nop_();_nop_();#define OP_WRITE 0xa0 / #define OP_READ 0xa1 / #define key_set 0/ = P33;#define key_down 1/ = P34;#define key_up 2/ = P35;#define key_ok 3/= P36;/* USR_DAT ,PRESET_DAT saved daytime: distance,price,night: distance,priceTIME : hour , min , sec*/uchar data USR_DAT4 = 3,2,3,6;/uchar PRESET_DAT4 = 3,2,3,3;uchar data ITEMS3 = 0,0,0;/-uchar data TIME3 = 0,0,12;/-uchar cycle_time; /100-5km/h,1.44s-0.02s72uint stop_time,stop_time_all,mileometer,temp_s,speed;uchar cycle_time_info,lock = 1,lock_items = 1;/;uchar key_pressed_time,key_num;/setuchar hour,min,sec,count;uchar code STR1 = Time:;/uchar code SPACE = ;/uchar code STR2 = S: P: A: ; /uchar code STR3 = Stop time: min;uchar code STR_SET = Setting ;uchar code STR_SET_HOUR = Setting hour ;uchar code STR_SET_MIN = Setting min ;uchar code STR_SET_PRICE = Setting price ;uchar code STR_SET_START = Setting start ;uchar code DAY = Day: ;uchar code NIGHT = Night: ;uchar code STR_RST = Reset? No Y ;sbit lcd_rs = P20;sbit lcd_rw = P21;sbit lcd_e = P22;sbit LED = P11;sbit SDA = P17;sbit SCL = P16;void delay(uchar z);void lcd_write_cmd(uchar cmd);void lcd_write_dat(uchar dat);void lcd_init();void lcd_display(uchar addr,uchar dat);void lcd_display_2(uchar addr,uchar dat);void lcd_display_3(uchar addr,uchar dat);void lcd_write_str(uchar addr,uchar *str);void time0_init();void time1_init();void display_time();void display_reset();void display_items();void display_set_time();void display_stop_time();void ex_int_init();void set_items();uchar key_scan();void key_set_dat();/*24c02*/void start();void stop();uchar shin();bit shout(uchar write_data);void write_byte( uchar addr, uchar write_data);uchar read_current();uchar read_addr(uchar addr);void save_user_dat();void restore_user_dat();void main(void)/uchar set_ok = 0;time0_init();time1_init();ex_int_init();lcd_init();restore_user_dat();while(1)/lcd_display_2(0x02,cycle_time_info);set_items();key_num = key_scan();if(!key_pressed_time)if(lock|(cycle_time = 72)|(stop_time 0)display_stop_time();elsedisplay_time();display_items();elsekey_set_dat();/* key_scan()* * */uchar key_scan()P3 |= 0xfb;if(P3 & 0xfb) != 0xfb)delay(200);if(P3 & 0xfb) != 0xfb)switch (P3 & 0xfb)case 0xeb:return key_down;case 0xdb:return key_up;case 0xf9:return key_ok;default:return 0;/* uchar key_set_dat(uchar key_pressed_time)* set,* /0,1* set* 1. * 2.,* 3.* 4.* */void key_set_dat()switch(key_pressed_time)case 1:display_reset();if(key_num = key_up) /2ITEMS0 = 0;ITEMS2 = 0;mileometer = 0;stop_time_all = 0;cycle_time = 0;key_pressed_time = 0;if(key_num = key_down) /1key_pressed_time +;if(key_num = key_ok)key_pressed_time = 0;/key_num = 0;break;case 2:lcd_write_str(0x80,STR_SET_HOUR);lcd_display(0x40+0x06, -0x30);lcd_display(0x40+0x07, -0x30);display_set_time();/hourif(key_num = key_up)TIME2 +;if(key_num = key_down)TIME2 -;if(key_num = key_ok)key_pressed_time = 0;/ key_num = 0;break;case 3:lcd_write_str(0x80,STR_SET_MIN);lcd_display(0x40+0x09, -0x30);lcd_display(0x40+0x0a, -0x30);display_set_time();if(key_num = key_up)/minTIME1 +;if(key_num = key_down)TIME1 -;if(key_num = key_ok)key_pressed_time = 0;break;case 4:lcd_write_str(0x80,STR_SET_PRICE);lcd_write_str(0x80+0x40,DAY);lcd_display_2(0x40+0x08,USR_DAT1);/lcd_display(0x40+0x09, -0x30);/lcd_display(0x40+0x0a, -0x30);if(key_num = key_up)/minUSR_DAT1 +;if(key_num = key_down)USR_DAT1 -;if(key_num = key_ok)key_pressed_time = 0;break;case 5:lcd_write_str(0x80,STR_SET_PRICE);lcd_write_str(0x80+0x40,NIGHT);lcd_display_2(0x40+0x08,USR_DAT3);/lcd_display(0x40+0x09, -0x30);/lcd_display(0x40+0x0a, -0x30);if(key_num = key_up)/minUSR_DAT3 +;if(key_num = key_down)USR_DAT3 -;if(key_num = key_ok)key_pressed_time = 0;break;case 6:lcd_write_str(0x80,STR_SET_START);lcd_write_str(0x80+0x40,DAY);lcd_display_2(0x40+0x08,USR_DAT0);/lcd_display(0x40+0x09, -0x30);/lcd_display(0x40+0x0a, -0x30);if(key_num = key_up)/minUSR_DAT0 +;if(key_num = key_down)USR_DAT0 -;if(key_num = key_ok)key_pressed_time = 0;break;case 7:lcd_write_str(0x80,STR_SET_START);lcd_write_str(0x80+0x40,NIGHT);lcd_display_2(0x40+0x08,USR_DAT2);/lcd_display(0x40+0x09, -0x30);/lcd_display(0x40+0x0a, -0x30);if(key_num = key_up)/minUSR_DAT2 +;if(key_num = key_down)USR_DAT2 -;if(key_num = key_ok)key_pressed_time = 0;break;default:key_pressed_time = 0;/save_user_dat();_-WARNING L15: MULTIPLE CALL TO SEGMENT/* set_items()* * ITEMS* */void set_items()ITEMS0 = (mileometer * 2)/1000;/*while(lock_items)temp_s = ITEMS0;lock_items -;lcd_display(0x0d,lock_items);*/if(TIME2 18 | TIME2 USR_DAT2)/*if(ITEMS0 - temp_s) != 0)ITEMS2 += ITEMS1;lock_items +;*/ITEMS2 = (ITEMS0 - USR_DAT2)*ITEMS1 + 5 + stop_time_all/300;elseITEMS2 = 5 + stop_time_all/300; / 5 elseITEMS1 = USR_DAT1; /ITEMS0 ITEMS1 ITEMS2if(ITEMS0 USR_DAT0)/*if(ITEMS0 - temp_s) != 0)ITEMS2 += ITEMS1;lock_items +;*/ITEMS2 = (ITEMS0 - USR_DAT0)*ITEMS1 + 5 + stop_time_all/300;elseITEMS2 = 5 + stop_time_all/300;/* ex_int_init()* * */void ex_int_init()EX0 = 1;IT0 = 1;IP = 0x0a;/0,1EX1 = 1;IT1 = 1;/* ex1_int() interrupt 2* USR_DAT* */void ex1_int() interrupt 2EX1 = 0;delay(200);EX1 = 1;key_pressed_time +;/* void ex_int() interrupt 0* */void ex0_int() interrupt 0if(cycle_time = 72)|(stop_time 0) /5km/hstop_time_all += (stop_time + cycle_time/50);cycle_time_info +;elsecycle_time_info = 10;if(cycle_time_info 10)lock = 1;elselock = 0;stop_time = 0;cycle_time = 0;/if(stop_time_all = 300)/ITEMS2 += stop_time_all/300;/stop_time_all %= 300;/else/while(lock) /*/lock -;/stop_time = sec;/stop_time/;/display_stop_time();/*/ * display_stop_time 1s display_time */if(sec - stop_time) != 0)/display_time();/stop_time = 0;/lock + ;/mileometer + ;if(mileometer%2 = 0)LED = !LED;/* void time1_init()* 1,* */void time1_init()TMOD = TMOD | 0x10;TH1 = (65535 - 20000)/256;TL1 = (65535 - 20000)%256;EA = 1;ET1 = 1; /TR1 = 1; /* void time1() interrupt 3* * */void time1() interrupt 3TH1 = (65535 - 20000)/256;TL1 = (65535 - 20000)%256;cycle_time +;if(cycle_time = 100) /100stop_time += 2;cycle_time = 0;/lcd_display_3(0x40+ 0x02,stop_time);/lcd_display_3(0x40+ 0x06,cycle_time);/* void display_set_time()* * */void display_set_time()/lcd_write_str(0x80,STR_SET);lcd_write_str(0x80+0x40,STR1);lcd_display(0x40+0x08,-0x30);lcd_display(0x40+0x0b,-0x30);lcd_display(0x40+0x0e, -0x30);lcd_display_2(0x40+0x06,TIME2);lcd_display_2(0x40+0x09,TIME1);lcd_display_2(0x40+0x0c,TIME0);/* display_reset()* * Setting* Reset? No Y* */void display_reset()lcd_write_str(0x80,STR_SET);lcd_write_str(0x80+0x40,STR_RST);/* display_stop_time()* 5km/h* Stop time:00 min* */void display_stop_time()lcd_write_str(0x80,STR3);lcd_display_2(0x0a,stop_time_all/60);/* display_items()* * S: P: A:* */void display_items()/lcd_write_str(0x80+0x40,STR2); /lcd_display(0x40+0x00,S-0x30);lcd_display(0x40+0x01,:-0x30);lcd_display(0x40+0x04, -0x30);lcd_display(0x40+0x05,P-0x30);lcd_display(0x40+0x06,:-0x30);lcd_display(0x40+0x09, -0x30);lcd_display(0x40+0x0a,-0x2f);/$lcd_display(0x40+0x0b,:-0x30);lcd_display_2(0x40+0x02,ITEMS0); /lcd_display_2(0x40+0x07,ITEMS1); /lcd_display_3(0x40+0x0c,ITEMS2); /* display_time()* lcd* Time: 00-00-00* */void display_time()lcd_write_str(0x80,STR1);lcd_display(0x06, -0x30);lcd_display(0x09,-0x30);lcd_display(0x0c,-0x30);lcd_display_2(0x07,TIME2);lcd_display_2(0x0a,TIME1);lcd_display_2(0x0d,TIME0);lcd_display(0x0f, -0x30);/* void time0_init()* 0,* */void time0_init()TMOD = TMOD | 0x01;TH0 = (65535 - 50000)/256;TL0 = (65535 - 50000)%256;EA = 1;ET0 = 1; /TR0 = 1; /* void time0() interrupt 1* * */void time0() interrupt 1TH0 = (65535 - 50000)/256;TL0 = (65535 - 50000)%256;count +;if(count = 20)count = 0;TIME0 +;if(60 = TIME0)TIME0 = 0;TIME1 +;save_user_dat(); / 1 minif(60 = TIME1)TIME1 = 0;TIME2 +;if(24 0;x-)for(y=100;y0;y-);/* lcd_write_cmd()* lcd* */void lcd_write_cmd(uchar cmd)XBYTE0xfcff = cmd;delay(1);/* lcd_write_dat()* :lcd* */void lcd_write_dat(uchar dat)XBYTE0xfdff = dat;delay(1);/* lcd_init()* lcd* */void lcd_init()delay(16);lcd_write_cmd(0x3f);delay(5);lcd_write_cmd(0x3f);delay(1);lcd_write_cmd(0x3c);lcd_write_cmd(0x08);/lcd/lcd/lcd_write_cmd(0x38);lcd_write_cmd(0x08);/lcd_write_cmd(0x01);/lcd_write_cmd(0x03);/lcd_write_cmd(0x0c);/lcd_write_cmd(0x06);/* lcd_display(uchar addr,uchar dat)* addr,0x40+addrascii* * */void lcd_display(uchar addr,uchar dat)lcd_write_cmd(0x80 + addr);lcd_write_dat(dat + 0x30);/ascii/* lcd_display_2(uchar addr,uchar dat)* addr,0x40+addrascii* * */void lcd_display_2(uchar addr,uchar dat)lcd_write_cmd(0x80 + addr);lcd_write_dat(dat/10 + 0x30);/asciilcd_write_dat(dat%10 + 0x30);/* lcd_display_3(uchar addr,uchar dat)* addr,0x40+addrascii* * */void lcd_display_3(uchar addr,uchar dat)lcd_write_cmd(0x80 + addr);lcd_write_dat(dat/100 + 0x30);/asciilcd_write_dat(dat%100/10 + 0x30);lcd_write_dat(dat%100%10 + 0x30);/* lcd_write_str* * * */void lcd_write_str(uchar addr,uchar *str)lcd_write_cmd(addr);dolcd_write_dat(*str);str +;while(*str != 0);/* 24C00 */* */void start()SDA = 1;SCL = 1;_NOP_();SDA = 0;_NOP_();SCL = 0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论