一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3625|回复: 30
收起左侧

[51单片机] [求助]单片机码表,程序有问题

[复制链接]
发表于 2014-9-11 14:48 | 显示全部楼层 |阅读模式
本帖最后由 sjz_xj 于 2014-9-11 14:55 编辑

bike.jpg


网上看到的自行车码表电路,感觉电中比较简单,所以就试着玩一下。

作者公开的程序,输入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++)
;
}
}

发表于 2014-9-11 15:16 | 显示全部楼层
用40PIN的89系列单片机替换掉89C2051,IO口直接驱动6位数码管,程序改动不大分开显示应该可以。
如果实在不想改用40PIN的单片机,用串行驱动的话(如595,TM16系列,MAX7219大材小用了而且成本高),可能效果会有点差(闪烁感和段显示亮度不均匀),程序需要大改动,再就是2051估计存不下程序了。
 楼主| 发表于 2014-9-11 15:29 | 显示全部楼层
本帖最后由 sjz_xj 于 2014-9-11 15:30 编辑

谢谢,89c52是不是可以用,里程应该还要有记忆功能。关键是本人太菜鸟,不太懂程序,不知道怎么改,而且这个程序DEBUG的时候,好像有错误,我也找不出来
发表于 2014-9-11 16:39 | 显示全部楼层
什么错误 ,贴上来看看
发表于 2014-9-11 17:50 | 显示全部楼层
只会AVR和STM,帮不了你了,其实这东西很简单,算法也很简单,建议看下教程学习一下,分分钟的事!~
发表于 2014-9-11 18:06 | 显示全部楼层
for(3_0==0;)
这一句似乎有问题吧,就算是改成
for(P3_0==0;) 也不对呀。
发表于 2014-9-11 18:29 | 显示全部楼层
把错误提示的内容发上来啊!
 楼主| 发表于 2014-9-11 21:29 | 显示全部楼层
huchuan987 发表于 2014-9-11 18:29
把错误提示的内容发上来啊!

要是知道哪里错了,就不来这里求助了,编程上本人是菜鸟一个……
 楼主| 发表于 2014-9-11 21:30 | 显示全部楼层
gz_dailin 发表于 2014-9-11 18:06
for(3_0==0;)
这一句似乎有问题吧,就算是改成
for(P3_0==0;) 也不对呀。

or(3_0==0;)
这一句似乎有问题吧,就算是改成
for(P3_0==0;) 也不对呀



好像有道理,不过本人门外汉,只能试试


 楼主| 发表于 2014-9-11 21:32 | 显示全部楼层
40560335 发表于 2014-9-11 17:50
只会AVR和STM,帮不了你了,其实这东西很简单,算法也很简单,建议看下教程学习一下,分分钟的事!~

谢谢!懂的人自然简单,一通百通。 不懂的还要努力装研!!!

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-21 05:47 , Processed in 0.064463 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表