本设计的是一个基于单片机 AT89S52 的出租车自动计费设计 ,附有复位电路 ,时钟电路,键盘电路等。 复位电路是单片机的初始化操作 ,除了正常的初始化外 ,为摆脱困境 ,通过复位电路可以重新开始。 时钟电路采用 12MHz 的晶振 ,作为系统的时钟源 ,具有较高的准确性。
在上电时字符型液晶 1602 显示最初的起步价, 里程收费,等待时间收费三种收费,通过按键可以调整起步价,里程收费,等待时间收费。通过按键模拟出租车的运行,暂停,停止。在 1602 液晶上可以显示运行的时间,运行时暂停的时间,通过计算可以得出总共的费用和总的路程。 在这里主要是以 AT89S52 单片机为核心控制器, P0 口接 1602液晶显示模块, P1 口接按键的,通过按键输入。
方案一:采用数字电子技术,利用 555 定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号, 采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,一下是该方案的流程框图,方案一如图 1.1 所示:
案二:采用 EDA 技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块 计量模块、译码和动态扫描显示模块,其系统框图如图 1.2 所示:
方案三:采用 MCU 技术,通过单片机作为主控器,利用 1602 字符液晶作为显示电路,采用外部晶振作为时钟脉冲,通过按键可以方便调节,一下是方案三的系统流程图,本方案主要是必须对于数字电路比较熟悉,成本又高。方案图如图 1.3 所示:
方案总结:通过各个方案的比较本次采用方案三,不但控制简单,而且成本低廉,设计电路简单。
程序:
- #include
- #define uchar unsigned char
- #define uint unsigned int
- sbit rw=P2^1;// 读或写
- sbit rs=P2^0;//
- sbit en=P2^2;//读写时能控制端
- sbit b=P0^7;//液晶判断忙标志位
- void lcd_init();//
- void wr_com(uchar command);// 液晶写命令
- void wr_data(uchar data0);//写数据
- void lcd_clear();// 液晶清屏
- void lcd_set();// 设置液晶的起始位置
- void busy();// 液晶判忙函数
- void display();// 显示
- void printstring(uchar *s);// 直接写字符
- void display1();
- void key1();
- sbit K=P1^0;
- sbit K1=P1^1;
- sbit K2=P1^2;
- sbit K3=P1^3;
- sbit K4=P1^4;
- sbit g=P2^7;
- sbit aa=P2^3;
- sbit bb=P2^4;
- sbit cc=P2^5;
- sbit led_run=P3^0;
- sbit led_await=P3^1;
- sbit led_stop=P3^2;
- bit f_start;// 开始标志位
- bit jump_in;// 跳入开始标志位
- bit jump_out;// 跳出标志位
- void key();
- uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x70};// 字符 1,
- 2,3,,,,,0
- uchar dispbuf[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uchar dispbuf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uchar v,v1;//按键次数累加变量
- uchar i;
- void init();//
- void chuli();//
- void chuli1();//
- void delay(uchar t);//
- void clear();//
- void set(uchar x);//
- void set1(uchar y);//
- uchar command;//
- uchar count,count1;//
- uchar second,minite,second1,minite1;//
- unsigned int tt,tt1;//
- unsigned char value1=50,value2=25,value3=15;//起始价,运行价,等待价
- unsigned int money;//金额变量
- //*******************************************
- void main()
- {
- init();
- lcd_init();
- while(1)
- {
- key1();
- chuli();
- display();
- if(jump_in==1)
- {
- jump_in=0;
- lcd_init();
- while(1)
- {
- key();
- chuli1();
- display1();
- if(jump_out==1)
- {
- lcd_init();
- jump_out=0;
- clear();
- break;
- }
- }
- }
- }
- }
- //*******************************************
- void clear()// 跳出下一次
- {
- TR0=0;
- TR1=0;
- money=0;
- second=0;
- second1=0;
- minite=0;
- minite1=0;
- value1=50;
- value2=25;
- value3=15;
- led_run=1;
- led_await=1;
- led_stop=1;
- v=0;
- v1=0;
- for(i=0;i<15;i++)
- {
- dispbuf[i]=0;
- dispbuf1[i]=0;
- }
- }
- //*******************************************
- void init()// 定时器初始化
- {
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- ET0=1;
- ET1=1;
- EA=1;
- TR0=0;
- TR1=0;
- }
- //*******************************************
- void t0_(void) interrupt 1 using 0// 定时器 0 中断
- {
- count++;
- if(count==20)
- {
- count=0;
- second++;
- if(second==60)
- {
- second=0;
- minite++;
- if(minite==99)
- {
- minite=0;
- }
- }
- }
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- dispbuf1[0]=minite/10;
- dispbuf1[1]=minite%10;
- dispbuf1[2]=second/10;
- dispbuf1[3]=second%10;
- }
- //*******************************************
- void t1_(void) interrupt 3 using 3// 定时器 1 中断
- {
- count1++;
- if(count1==20)
- {
- count1=0;
- second1++;
- if(second1==60)
- {
- second1=0;
- minite1++;
- if(minite1==99)
- {
- minite1=0;
- }
- }
- }
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- dispbuf1[4]=minite1/10;
- dispbuf1[5]=minite1%10;
- dispbuf1[6]=second1/10;
- dispbuf1[7]=second1%10;
- }
- //*******************************************
- void lcd_init()// 液晶初始化
- {
- wr_com(0x3c);
- wr_com(0x06);
- wr_com(0x0c);
- wr_com(0x01);
- }
- //*******************************************
- void wr_com(uchar command)// 液晶写命令
- {
- busy();
- rs=0;
- rw=0;
- P0=command;
- en=1;
- en=0;
- }
- //*******************************************
- void wr_data(uchar data0)//液晶写数据
- {
- busy();
- rs=1;
- rw=0;
- P0=data0;
- en=1;
- en=0;
- }
- //*******************************************
- void busy()//液晶判忙
- {
- while(1)
- {
- en=0;
- rs=0;
- rw=1;
- P0=0xff;
- en=1;
- if(b!=1)break;
- }
- en=0;
- }
- //*******************************************
- void chuli()// 数值处理
- {
- dispbuf[0]=value1/100%10;
- dispbuf[1]=value1/10%10;
- dispbuf[2]=value1%10;
- dispbuf[3]=value2/100%10;
- dispbuf[4]=value2/10%10;
- dispbuf[5]=value2%10;
- dispbuf[6]=value3/100%10;
- dispbuf[7]=value3/10%10;
- dispbuf[8]=value3%10;
- }
- //*******************************************
- void display()
- {
- set(0);
- printstring("step :");
- wr_data(table[dispbuf[0]]);
- wr_data(table[dispbuf[1]]);
- printstring(".");
- wr_data(table[dispbuf[2]]);
- set(16);
- printstring("mileage :");
- wr_data(table[dispbuf[3]]);
- wr_data(table[dispbuf[4]]);
- printstring(".");
- wr_data(table[dispbuf[5]]);
- set1(0);
- printstring("await :");
- wr_data(table[dispbuf[6]]);
- wr_data(table[dispbuf[7]]);
- printstring(".");
- wr_data(table[dispbuf[8]]);
- /*
- set1(16);
- printstring("run : ");
- wr_data(table[dispbuf1[0]]);
- wr_data(table[dispbuf1[1]]);
- printstring(":");
- wr_data(table[dispbuf1[2]]);
- wr_data(table[dispbuf1[3]]);
- */
- }
- //*******************************************
- void chuli1()
- {
- if(f_start==1)
- {
- tt=minite*60+second;// 总时间
- tt1=minite1;// 等待时间
- money=value1+value2*0.1*tt+value3*tt1;// 起始价 +每公里价 * 时间 *速度 +等待价 *等待
- 时间
- }
- else if(f_start==0)
- {
- money=0;
- }
- dispbuf1[8]=money/100%10;//
- dispbuf1[9]=money/10%10;//
- dispbuf1[10]=money%10;//
- }
- //*******************************************
- void display1()
- {
- set(0);
- printstring("run: ");
- wr_data(table[dispbuf1[0]]);
- wr_data(table[dispbuf1[1]]);
- printstring(":");
- wr_data(table[dispbuf1[2]]);
- wr_data(table[dispbuf1[3]]);
- set(14);
- printstring("await:");
- wr_data(table[dispbuf1[4]]);
- wr_data(table[dispbuf1[5]]);
- printstring(":");
- wr_data(table[dispbuf1[6]]);
- wr_data(table[dispbuf1[7]]);
- set1(0);
- printstring("sum is: ");
- wr_data(table[dispbuf1[8]]);
- wr_data(table[dispbuf1[9]]);
- printstring(".");
- wr_data(table[dispbuf1[10]]);
- }
- //*******************************************
- void printstring(uchar *s)// 行字符函数
- {
- while(*s)
- wr_data(*s++);
- }
- //*******************************************
- void key()
- {
- if(K3==0)
- {
- delay(50);
- if(K3==0)
- {
- while(K3==0);
- v1++;
- if(v1==4) v1=0;
- }
- }
- switch(v1)
- {
- case
- 1:f_start=1;TR0=1;TR1=0;led_run=0;led_await=1;led_stop=1;aa=1;bb=0;cc=1;break;
- case 2:TR0=0;TR1=1;led_run=1;led_await=0;led_stop=1;aa=0;cc=0;break;
- case 3:TR0=0;TR1=0;led_run=1;led_await=1;led_stop=0;break;
- }
- if(K4==0)
- {
- delay(50);
- if(K4==0)
- {
- while(K4==0);
- jump_out=1;
- }
- }
- }
- //*******************************************
- void delay(uchar t)
- {
- while(--t);
- }
- //*******************************************
- void set(uchar x)
- {
- command=0x80+x;
- wr_com(command);
- }
- //*******************************************
- void set1(uchar y)
- {
- command=0xc0+y;
- wr_com(command);
- }
- //*******************************************
- void key1()
- {
- if(K==0)
- {
- delay(100);
- if(K==0)
- {
- while(K==0);
- v++;
- if(v==4) v=0;
- }
- }
- switch(v)
- {
- case 0:break;
- case 1:if(K1==0){while(K1==0);value1=value1+10;}break;// 起步价加 10
- case 2:if(K1==0){while(K1==0);value2=value2+5;}break;// 单价加 5
- case 3:if(K1==0){while(K1==0);value3=value3+5;}break;// 停止加 5
- }
- if(K2==0)
- {
- delay(50);
- if(K2==0)
- {
- while(K2==0);
- jump_in=1;//
- }
- }
- }
文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-210619-1-1.html