写了个秒表的程序,有些困惑

2020-01-30 14:16发布

00 :00 . 00
分   秒  分秒

代码:
  1. /***************************************************************
  2. 文件名:秒表.c
  3. 晶振频率:12MHz
  4. ****************************************************************/
  5. #include<reg52.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define dataport P0

  9. uchar code weima[]={
  10. 0xfe,0xfd,0xfb,0xf7,
  11. 0xef,0xdf,0xbf,0x7f};
  12. uchar code duanma[]={
  13. 0x3f,0x06,0x5b,0x4f,0x66,
  14. 0x6d,0x7d,0x07,0x7f,0x6f};
  15. uchar tempdata[8];
  16. uchar tt0,tt1,tt2;

  17. sbit wela=P2^2;
  18. sbit dula=P2^3;

  19. void display(uchar,uchar);
  20. void Init_Timer0(void);
  21. void delayms(uint);

  22. void main(void)
  23. {
  24.         Init_Timer0();
  25.         while(1)
  26.                 display(0,6);
  27. }

  28. void Init_Timer0(void)
  29. {
  30.         TMOD=0x01;
  31.         TH0=(65536-10000)/256;
  32.         TL0=(65536-10000)%256;

  33.         IE=0x82;
  34.         //EA=1;
  35.         //ET0=1;
  36.         TR0=1;
  37. }

  38. void T0_isr(void)interrupt 1
  39. {
  40.         TH0=(65536-10000)/256;
  41.         TL0=(65536-10000)%256;
  42.         tt0++;
  43.         if(tt0==100)                //1秒
  44.         {
  45.                 tt0=0;
  46.                 tt1++;
  47.                 if(tt1==60)
  48.                 {
  49.                         tt1=0;
  50.                         tt2++;
  51.                         if(tt2==60)
  52.                                 tt2=0;
  53.                 }
  54.         }
  55.         tempdata[0]=duanma[tt2/10];                                //分前一位
  56.         tempdata[1]=duanma[tt2%10];                                //分后一位
  57.         tempdata[2]=duanma[tt1/10];                                //秒前一位
  58.         tempdata[3]=duanma[tt1%10];                                //秒后一位
  59.         tempdata[4]=duanma[tt0/10];                                //分秒前一位
  60.         tempdata[5]=duanma[tt0%10];                                //分秒后一位
  61. }

  62. void display(uchar firstbit,uchar num)
  63. {
  64.         uchar i;
  65.         for(i=0;i<num;i++)
  66.         {
  67.                 dataport=0;
  68.                 dula=1;
  69.                 dula=0;

  70.                 dataport=weima[i+firstbit];
  71.                 wela=1;
  72.                 wela=0;

  73.                 dataport=tempdata[i];
  74.                 dula=1;
  75.                 dula=0;

  76.                 delayms(2);
  77.         }
  78. }

  79. void delayms(uint ms)
  80. {
  81.         uint i;
  82.         while(ms--)
  83.                 for(i=110;i>0;i--);
  84. }

复制代码不知道问题出现在哪,数码管显示不对,高手指点下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
alwen
1楼-- · 2020-01-31 19:51
一匹狼 发表于 2013-2-14 16:31
还是不行、、、

首先你先确认,你已经成功点亮数码管子,可以静态76543210 的数字
alwen
2楼-- · 2020-02-01 01:48
/***************************************************************
文件名:秒表.c
晶振频率:12MHz
****************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define dataport P0

uchar code weima[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar tempdata[8];
uchar tt0,tt1,tt2;

sbit wela=P2^2;
sbit dula=P2^3;

void display(void);
void Init_Timer0(void);
void delayms(uint);

void main(void)
{
        Init_Timer0();
        while(1)
                display();
}

void Init_Timer0(void)
{
        TMOD=0x01;
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;

        IE=0x82;
        //EA=1;
        //ET0=1;
        TR0=1;
}

void T0_isr(void)interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        tt0++;
        if(tt0==100)                //1秒
        {
                tt0=0;
                tt1++;
                if(tt1==60)
                {
                        tt1=0;
                        tt2++;
                        if(tt2==60)
                                tt2=0;
                }
        }
        tempdata[0]=duanma[tt2/10];                                //分前一位
        tempdata[1]=duanma[tt2%10];                                //分后一位
        tempdata[2]=duanma[tt1/10];                                //秒前一位
        tempdata[3]=duanma[tt1%10];                                //秒后一位
        tempdata[4]=duanma[tt0/10];                                //分秒前一位
        tempdata[5]=duanma[tt0%10];                                //分秒后一位
}

void display(void)
{
        dataport=0xfe;
        wela=1;
        wela=0;
       dataport=tempdata[0];        dula=1;
        dula=0;
        delayms(1);

        dataport=0xfd;
        wela=1;
        wela=0;
        dataport=tempdata[1];
        dula=1;
        dula=0;
        delayms(1);

        dataport=0xfb;
        wela=1;
        wela=0;
        dataport=tempdata[2];
        dula=1;
        dula=0;
        delayms(1);

        dataport=0xf7;
        wela=1;
        wela=0;
        dataport=tempdata[3];
        dula=1;
        dula=0;
        delayms(1);

        dataport=0xef;
        wela=1;
        wela=0;
        dataport=tempdata[4];
        dula=1;
        dula=0;
        delayms(1);

        dataport=0xdf;
        wela=1;
        wela=0;
        dataport=tempdata[5];
        dula=1;
        dula=0;
        delayms(1);

        dataport=0xbf;
        wela=1;
        wela=0;
        dataport=tempdata[5];
        dula=1;
        dula=0;
        delayms(1);
}

void delayms(uint ms)
{
        uint i;
        while(ms--)
                for(i=110;i>0;i--);
}



这段代码中的dataport=tempdata[0-5]; 更改成dataport=duanma[X];
看看能否静态显示个个数字
i55x
3楼-- · 2020-02-01 06:11
定时器16位模式没有自动重装载功能吧。
一匹狼
4楼-- · 2020-02-01 09:29
 精彩回答 2  元偷偷看……
一匹狼
5楼-- · 2020-02-01 12:57
alwen 发表于 2013-2-14 16:55
/***************************************************************
文件名:秒表.c
晶振频率:12MHz

显示不了
不知道为什么,
但我的单片机开发板还是好的,因为我烧写了以前写的8位共阴数码管的程序,数码管显示是正常。

谢谢你的耐心回答~节日快乐
Tliang
6楼-- · 2020-02-01 18:54
是不是把两个573搞错了?

一周热门 更多>