仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
部分源码:完整源码见附件
- /**************************************
- 计价规则:
- 用时间模拟路程,前三秒以内8.00元,若超出3秒
- 每增加一秒,价格增加1元。用数码管显示价钱和
- 时间(用一个按键控制显示时间或价钱)。
- **************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit p00=P0^0 ;
- sbit p01=P0^1 ;
- sbit p02=P0^2 ;
- sbit p37=P3^7 ;
- uint i,j;
- uint code Seg[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x80};
- //数码管译码表: { 0 , 1 , 2 , 3 , 4 ,5 6 7 8 9 0 . } P}
- uchar jps,ks,key_do;//键盘缓存,上次有按键按下标志位,按键已处理标志位
- uint count_10ms=0,second=0;
- float cost; //价钱
- void delay(uint tt) //延时函数
- {
- uint i;
- for(;tt>0;tt--)
- for(i=0;i<200;i++);
- }
- void LED(uint d1,uint d2)
- {
- if(d1==1) P0=(P0|0xf0)&0x1f;
- if(d1==2) P0=(P0|0xf0)&0x2f;
- if(d1==3) P0=(P0|0xf0)&0x4f;
- if(d1==4) P0=(P0|0xf0)&0x8f;
- P0=P0|0x0f;
- P1=Seg[d2];
- }
- int keyscan() //键盘扫描函数
- {
- int t=0;
- if(p00==0) { t=1; jps=1;}
- if(p01==0) { t=1; jps=2;}
- if(p02==0) { t=1; jps=3;}
- return(t);
- }
- void money() //价钱计算
- {
- count_10ms++;
- if(count_10ms==100)
- {count_10ms=0;second++;}
- if(second<=3) cost=8.0;
- else if(second>3) cost=8.0+1.0*(second-3);
- }
- void ledshow()
- {
- while(j%2==0) // 价钱显示
- {
- LED(1,(int) (cost/10) );
- delay(5);
- LED(2,(int) cost%10 );
- delay(5);
- LED(3,(int) (cost*10)%10 );
- delay(5);
- LED(4,(int) (cost*100)%10 );
- delay(5);
- LED(2,11);
- delay(5);
- }
-
- while(j%2==1) // 时间显示
- {
- LED(1,second/10);
- delay(5);
- LED(2,second%10);
- delay(5);
- LED(3,count_10ms/10);
- delay(5);
- LED(4,count_10ms%10);
- delay(5);
- LED(2,11);
- delay(5);
- }
-
- }
- void Time_fun() interrupt 1 //10ms中断函数
- {
- uint k;
- if(k==15) { k=0; p37=1; }
- else k++;
- TH0=(0xffff-10000)/256; //10ms
- TL0=(0xffff-10000)%256; //10ms
-
- if(i%2==1) money(); // 暂停/播放
- if((ks==1)&&(keyscan()==1)&&(key_do==0))
- {
- k=0;
- p37=0; //按键提示音
- key_do=1;
- if(jps==1) i++; // 暂停/播放键
- if(jps==2) j++; // 时间价钱显示转换
- if(jps==3) // 清零键
- {
- count_10ms=0;
- second=0;
- cost=0;
- }
- }
- ks=keyscan();
- if(ks==0) key_do=0;
- }
- main()
- {
- TMOD=0x01; //Time0为16计数器
- TH0=(0xffff-10000)/256;
- TL0=(0xffff-10000)%256;
- TR0=1; //打开定时器
- IE=0x82; //EA=1 ET0=1 打开中断
- while(1)
- {
- ledshow();
- }
- }
复制代码 完整c源码和proteus仿真:
出租车.rar
(48.35 KB, 售价: 3 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|