找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4058|回复: 16
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
以上是代码,功能是实现秒表计时,60清零,精确到后两位,我觉得代码没问题啊

以下是仿真
  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.         }
复制代码







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:245521 发表于 2017-11-2 23:00 | 只看该作者
有人吗
回复

使用道具 举报

板凳
ID:123289 发表于 2017-11-3 10:10 | 只看该作者
不知道你要表达的意思是什么!
回复

使用道具 举报

地板
ID:84652 发表于 2017-11-3 12:58 | 只看该作者
数组寻址是从0开始吧?score[0]开始。还有取余数用%就行了,不用那么麻烦。
回复

使用道具 举报

5#
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,一是错位,二是最后一个数据超出地址空间了。
回复

使用道具 举报

6#
ID:245521 发表于 2017-11-3 17:02 | 只看该作者
yzwzfyz 发表于 2017-11-3 10:10
不知道你要表达的意思是什么!

秒表计时呢
回复

使用道具 举报

7#
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++),为什么还是不能正常显示呢
回复

使用道具 举报

8#
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;
                        }
                }
        }               
回复

使用道具 举报

9#
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不满足条件
回复

使用道具 举报

10#
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)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。若需99.99秒,硬件电路增加一位595。软件程序增加0.01s10ms计数器,并修改相应计数显示程序。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

11#
ID:245521 发表于 2017-11-3 23:14 | 只看该作者
zl2168 发表于 2017-11-3 21:08
实例93  99.9秒秒表
先Proteus仿真一下,确认有效。

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

使用道具 举报

12#
ID:229799 发表于 2017-11-4 09:26 | 只看该作者
位扫描要加延时,不然看不到效果
回复

使用道具 举报

13#
ID:229799 发表于 2017-11-4 09:28 | 只看该作者
Afan的单片机 发表于 2017-11-3 23:14
额。。。感谢 但是我的哪里错了呢

位扫描要有延时
回复

使用道具 举报

14#
ID:111634 发表于 2017-11-4 09:56 | 只看该作者
Afan的单片机 发表于 2017-11-3 23:14
额。。。感谢 但是我的哪里错了呢

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

使用道具 举报

15#
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]呀。剩下那几句也是……。
回复

使用道具 举报

16#
ID:245521 发表于 2017-11-5 22:27 | 只看该作者
zjb2106558 发表于 2017-11-4 09:26
位扫描要加延时,不然看不到效果

是的 为什么
回复

使用道具 举报

17#
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 (114.74 KB, 下载次数: 39)

1.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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