| 
高级会员 主题
回帖0
积分559
阅读权限30
注册时间2014-9-11
最后登录1970-1-1
在线时间 小时
 
 | 
 
| 本帖最后由 sjz_xj 于 2014-9-11 14:55 编辑 
 
   
 
 网上看到的自行车码表电路,感觉电中比较简单,所以就试着玩一下。
 
 作者公开的程序,输入keil中,debug的时候,提示有错误,本人菜鸟,不太懂程序,在此,请各位高手帮忙看看,能不能解决一下程序的问题。
 
 此电路是 速度和里程 由开关控制分别显示,能否在硬件和软件上改动下,增加一路数码管,让速度和里程能够同时显示!!!
 
 希望大家能够帮菜鸟一个忙,谢谢!!!
 
 下面是程序
 
 #include <reg51.h>
 unsigned char i,j,t,m,key,DelayTime,DispBuf[3];
 unsigned int n;
 unsigned long int c,spm;
 unsigned char code
 BitTab[3]={0xf7,0xef,0xdf};//位驱动码
 unsigned char code
 DispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形码
 sbit P3_0=P3^0;
 void delay(DelayTime);
 main() //主程序
 {
 TMOD=0x01;//定时器T0工作于方式1
 IT0=1; //外部中断0为边沿触发方式
 TH0=0xec;
 TL0=0x78;//T0定时时间为5ms
 IE=0X83; //开中断
 TR0=1; //开定时器T0
 key=0;
 for(;;) //键盘处理
 {
 if(key==1)
 {
 if(P3_0==0)
 {
 delay(100);
 if(P3_0==0)
 key=0;
 }
 }
 else
 {
 if(P3_0==0)
 {
 delay(100);
 if(P3_0==0)
 key=1;
 }
 }
 for(3_0==0;)
 ;
 }
 }
 external0() interrupt 0//外部中断0服务程序
 {
 c++;
 if(key==0) //计算速度
 {
 if(n==0)//
 spm=0;
 else
 spm=14904/n;
 }
 else //计算里程
 {
 spm=207*c;
 spm=spm/10000;
 }
 n=0;
 DispBuf[2]=spm%10;//取个位数
 spm=spm/10;
 DispBuf[1]=spm%10;//取十位数
 DispBuf[0]=spm/10;//取百位数
 }
 Timer0() interrupt 1//定时器T0中断服务程序
 {
 TH0=0xec;
 TL0=0x78;
 n++;
 t=BitTab[j]; //取位值
 P3=P3|0x38; //P3.3-P3.5送1
 P3=P3&t; //P3.3-P3.5输出取出的位值
 t=DispBuf[j];//取出待显示的数
 t=DispTab[t];//取字形码
 P1=t; //字型码由P3输出显示
 j++; //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管
 if(j==3)
 j=0;
 if(n>1000) //自行车停止超过5秒钟,n复位
 n=0;
 }
 void delay(DelayTime)//延时子程序
 {
 for(;DelayTime>0;DelayTime--)
 {
 for(i=0;i<250;i++)
 ;
 }
 }
 
 
 | 
 |