找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2621|回复: 16
收起左侧

小白求助制作秒表,单片机代码问题

[复制链接]
ID:245521 发表于 2017-11-2 22:39 | 显示全部楼层 |阅读模式
以上是代码,功能是实现秒表计时,60清零,精确到后两位,我觉得代码没问题啊
1.jpg
以下是仿真
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. int number=0;
  5. char score[]={0,0,0,0};
  6. void timer0(void) interrupt 1
  7. {
  8.     number++;
  9.         score[1]=number/1000;
  10.         score[2]=(number-score[1]*1000)/100;
  11.         score[3]=(number-score[1]*1000-score[2]*100)/10;
  12.         score[4]=number-score[1]*1000-score[2]*100-score[3]*10;
  13.         if (number>6000){number=0;}
  14.         TL0=0Xf0;
  15.         TH0=0Xd8;
  16. }
  17. main(){
  18.         int k=0;
  19.         int wei=0x01;
  20.         TMOD=0X01;
  21.         TH0=0Xd8;
  22.         TL0=0Xf0;//10ms
  23.         TR0=1;
  24.         ET0=1;
  25.         EA=1;
  26.         while(1){
  27.         for(k=1;k<5;k++)
  28.         {        P2=led[score[k]];
  29.                 wei=_crol_(wei,2);
  30.                 P3=wei;
  31.                         }
  32.                 }
  33.         }
复制代码







回复

使用道具 举报

ID:245521 发表于 2017-11-2 23:00 | 显示全部楼层
有人吗
回复

使用道具 举报

ID:123289 发表于 2017-11-3 10:10 | 显示全部楼层
不知道你要表达的意思是什么!
回复

使用道具 举报

ID:84652 发表于 2017-11-3 12:58 | 显示全部楼层
数组寻址是从0开始吧?score[0]开始。还有取余数用%就行了,不用那么麻烦。
回复

使用道具 举报

ID:245680 发表于 2017-11-3 14:16 | 显示全部楼层
声明处:05.char score[]={0,0,0,0};初始为4个元素,编译器分配4个存储空间,数组长度为4,最大有效下标3:有效下标score[0]---score[3];“ for(k=1;k<5;k++)”中k=1~5,一是错位,二是最后一个数据超出地址空间了。
回复

使用道具 举报

ID:245521 发表于 2017-11-3 17:02 | 显示全部楼层
yzwzfyz 发表于 2017-11-3 10:10
不知道你要表达的意思是什么!

秒表计时呢
回复

使用道具 举报

ID:245521 发表于 2017-11-3 17:04 | 显示全部楼层
spark399 发表于 2017-11-3 14:16
声明处:05.char score[]={0,0,0,0};初始为4个元素,编译器分配4个存储空间,数组长度为4,最大有效下标3: ...

我改成了for(k=0;k<4;k++),为什么还是不能正常显示呢
回复

使用道具 举报

ID:245521 发表于 2017-11-3 17:05 | 显示全部楼层
改动了以下:
#include<reg51.h>
#include<intrins.h>
char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int number=0;
char score[]={0,0,0,0};
void timer0(void) interrupt 1
{
    number++;
        score[0]=number/1000;
        score[1]=(number-score[1]*1000)/100;
        score[2]=(number-score[1]*1000-score[2]*100)/10;
        score[3]=(number-score[1]*1000-score[2]*100)%10;
        if (number>6000){number=0;}
        TL0=0Xf0;
        TH0=0Xd8;
}
main(){
        int k=0;
        int wei=0x01;
        TMOD=0X01;
        TH0=0Xd8;
        TL0=0Xf0;//10ms
        TR0=1;
        ET0=1;
        EA=1;
        while(1){
        for(k=0;k<4;k++)
        {        P2=led[score[k]];
                wei=_crol_(wei,2);
                P3=wei;
                        }
                }
        }               
回复

使用道具 举报

ID:245521 发表于 2017-11-3 17:11 | 显示全部楼层
spark399 发表于 2017-11-3 14:16
声明处:05.char score[]={0,0,0,0};初始为4个元素,编译器分配4个存储空间,数组长度为4,最大有效下标3: ...

是1-4呢,5不满足条件
回复

使用道具 举报

ID:111634 发表于 2017-11-3 21:08 | 显示全部楼层
本帖最后由 zl2168 于 2017-11-3 21:10 编辑

实例93  99.9秒秒表
Proteus仿真一下,确认有效。
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 4)
回复

使用道具 举报

ID:245521 发表于 2017-11-3 23:14 | 显示全部楼层
zl2168 发表于 2017-11-3 21:08
实例93  99.9秒秒表
先Proteus仿真一下,确认有效。

额。。。感谢 但是我的哪里错了呢
回复

使用道具 举报

ID:229799 发表于 2017-11-4 09:26 | 显示全部楼层
位扫描要加延时,不然看不到效果
回复

使用道具 举报

ID:229799 发表于 2017-11-4 09:28 | 显示全部楼层
Afan的单片机 发表于 2017-11-3 23:14
额。。。感谢 但是我的哪里错了呢

位扫描要有延时
回复

使用道具 举报

ID:111634 发表于 2017-11-4 09:56 | 显示全部楼层
Afan的单片机 发表于 2017-11-3 23:14
额。。。感谢 但是我的哪里错了呢

读懂正确有效程序,就知道自己错在哪儿了!
回复

使用道具 举报

ID:84652 发表于 2017-11-4 11:44 | 显示全部楼层
Afan的单片机 发表于 2017-11-3 17:05
改动了以下:
#include
#include

score[1]=(number-score[1]*1000)/100;后面的score[1]也得跟着改成score[0]呀。剩下那几句也是……。
回复

使用道具 举报

ID:245521 发表于 2017-11-5 22:27 | 显示全部楼层
zjb2106558 发表于 2017-11-4 09:26
位扫描要加延时,不然看不到效果

是的 为什么
回复

使用道具 举报

ID:245521 发表于 2017-11-5 22:37 | 显示全部楼层
#include<reg51.h>
#include<intrins.h>
char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int number=0;
sbit LED = P2^7;
char score[]={0,0,0,0};
char key=0;
void delayms(unsigned int x)
{
  unsigned char t;
  while(x--)
  for (t=0;t<120;t++);
}
void timer0(void) interrupt 1
{
    number++;
        score[0]=number/1000;
        score[1]=number%1000/100;
        score[2]=number%100/10;
        score[3]=number%100%10;
        if (number>6000){number=0;}
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
}
main(){
        int k=0;
        int wei=0x01;
        TMOD=0X01;
        TH0=(65536-12000)/256;
        TL0=(65536-12000)%256;
        TR0=1;
        ET0=1;
        EA=1;
        key=0xff&P1;
        if(key=0xff)
{       
        while(1){
        for(k=0;k<4;k++)
                {        P2=led[score[k]];
                        P3=wei;
                        if (P3==0x04){LED=0;}
                        delayms(15);
                        P2=0xff;
                        wei=_crol_(wei,2);
                }
                        }
}
                        if(key!=0xff)        TR0=0;
}
       
       
        这样怎么不能实现按键暂停呢啊

1.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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