一匹狼 发表于 2013-2-14 15:12:56

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

00 :00 . 00
分   秒分秒

代码:/***************************************************************
文件名:秒表.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;
uchar tt0,tt1,tt2;

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

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

void main(void)
{
        Init_Timer0();
        while(1)
                display(0,6);
}

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=duanma;                                //分前一位
        tempdata=duanma;                                //分后一位
        tempdata=duanma;                                //秒前一位
        tempdata=duanma;                                //秒后一位
        tempdata=duanma;                                //分秒前一位
        tempdata=duanma;                                //分秒后一位
}

void display(uchar firstbit,uchar num)
{
        uchar i;
        for(i=0;i<num;i++)
        {
                dataport=0;
                dula=1;
                dula=0;

                dataport=weima;
                wela=1;
                wela=0;

                dataport=tempdata;
                dula=1;
                dula=0;

                delayms(2);
        }
}

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

不知道问题出现在哪,数码管显示不对,高手指点下

i55x 发表于 2013-2-14 15:20:47

没电路图,没怎么不对的情况,你当大家都是算命的吗?

william_rain 发表于 2013-2-14 15:23:44

怎么个不对

一匹狼 发表于 2013-2-14 15:29:58

单片机开发板的电路原理图

一匹狼 发表于 2013-2-14 15:30:33

单片机表面丝印图

一匹狼 发表于 2013-2-14 15:33:21

本帖最后由 一匹狼 于 2013-2-14 15:37 编辑

william_rain 发表于 2013-2-14 15:23 static/image/common/back.gif
怎么个不对

数码管显示很乱,根本就没法读数,
我设计本意是显示6位,而数码管显示了8位

说明下:P0口接8位共阴数码管

一匹狼 发表于 2013-2-14 15:39:00

i55x 发表于 2013-2-14 15:20 static/image/common/back.gif
没电路图,没怎么不对的情况,你当大家都是算命的吗?



开发板的电路原理图

faduo2012 发表于 2013-2-14 15:41:24

你那个tt0不用初始化一个值吗?

一匹狼 发表于 2013-2-14 15:45:05

faduo2012 发表于 2013-2-14 15:41 static/image/common/back.gif
你那个tt0不用初始化一个值吗?

默认赋值0

alwen 发表于 2013-2-14 15:49:31

你还是一位位的点亮吧。不用急

bg6ixm 发表于 2013-2-14 15:59:15

没仔细看,但一般都是延时的问题。

一匹狼 发表于 2013-2-14 16:31:04

alwen 发表于 2013-2-14 15:49 static/image/common/back.gif
你还是一位位的点亮吧。不用急

/***************************************************************
文件名:秒表.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;
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=duanma;                                //分前一位
        tempdata=duanma;                                //分后一位
        tempdata=duanma;                                //秒前一位
        tempdata=duanma;                                //秒后一位
        tempdata=duanma;                                //分秒前一位
        tempdata=duanma;                                //分秒后一位
}

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

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

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

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

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

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

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

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



还是不行、、、

一匹狼 发表于 2013-2-14 16:47:01

bg6ixm 发表于 2013-2-14 15:59 static/image/common/back.gif
没仔细看,但一般都是延时的问题。

显示函数display延时范围在1~8ms都有试过,貌似不是这方面原因

alwen 发表于 2013-2-14 16:50:28

一匹狼 发表于 2013-2-14 16:31 static/image/common/back.gif
还是不行、、、

首先你先确认,你已经成功点亮数码管子,可以静态76543210 的数字

alwen 发表于 2013-2-14 16:55:35

/***************************************************************
文件名:秒表.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;
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=duanma;                              //分前一位
      tempdata=duanma;                              //分后一位
      tempdata=duanma;                              //秒前一位
      tempdata=duanma;                              //秒后一位
      tempdata=duanma;                              //分秒前一位
      tempdata=duanma;                              //分秒后一位
}

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

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

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

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

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

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

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

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



这段代码中的dataport=tempdata; 更改成dataport=duanma;
看看能否静态显示个个数字

i55x 发表于 2013-2-14 17:12:25

定时器16位模式没有自动重装载功能吧。

一匹狼 发表于 2013-2-14 17:39:05

i55x 发表于 2013-2-14 17:12 static/image/common/back.gif
定时器16位模式没有自动重装载功能吧。

第47、48行重新装载初值

一匹狼 发表于 2013-2-14 18:27:57

alwen 发表于 2013-2-14 16:55 static/image/common/back.gif
/***************************************************************
文件名:秒表.c
晶振频率:12MHz


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

谢谢你的耐心回答~节日快乐

Tliang 发表于 2013-2-14 19:14:15

是不是把两个573搞错了?

一匹狼 发表于 2013-2-14 19:19:43

Tliang 发表于 2013-2-14 19:14 static/image/common/back.gif
是不是把两个573搞错了?

l两个573?

alwen 发表于 2013-2-14 22:02:55

一匹狼 发表于 2013-2-14 18:27 static/image/common/back.gif
显示不了
不知道为什么,
但我的单片机开发板还是好的,因为我烧写了以前写的8位共阴数码管的程序,数码 ...

你可以找一个成功运行的文件,再修改,功能实现后,在自己从头写一次,这样不就OK咯

alwen 发表于 2013-2-14 22:05:58

一匹狼 发表于 2013-2-14 19:19 static/image/common/back.gif
l两个573?

我也想知道,PA0~PA7 是接到哪里的

一匹狼 发表于 2013-2-14 22:49:08

alwen 发表于 2013-2-14 22:05 static/image/common/back.gif
我也想知道,PA0~PA7 是接到哪里的

P0接8位数码管,我的板子标明J3,

月光疾風 发表于 2013-2-14 23:35:51

楼主可以先试试单独点数码管显示固定数字,比如动态扫描显示1234,这个测试没问题了再试秒表的计数值

一匹狼 发表于 2013-2-15 00:56:19

月光疾風 发表于 2013-2-14 23:35 static/image/common/back.gif
楼主可以先试试单独点数码管显示固定数字,比如动态扫描显示1234,这个测试没问题了再试秒表的计数值 ...

动态扫描xxxx xxxx没问题啊,
我三位的秒表测试也没问题
就是写的六位的秒表没有成功

一匹狼 发表于 2013-2-15 00:57:22

不知道程序在哪出现差错了。。。。

i55x 发表于 2013-2-15 14:59:19

好用的代码贴出来看看

william_rain 发表于 2013-2-18 10:18:33

一匹狼 发表于 2013-2-14 15:33 static/image/common/back.gif
数码管显示很乱,根本就没法读数,
我设计本意是显示6位,而数码管显示了8位



楼主,我写了个。在我的实验板上调试通了。

你把位选、段选定义改一下就好了。/*
*板极调试成功
*6位数码管显示
*
*/

#include <reg52.h>

sbit DuCs = P2^6;
sbit WeCs = P2^7;

#define DATA P0

unsigned char Second = 0;
unsigned char Minute =0;
unsigned char Hour = 0;

unsigned char Count = 0;
unsigned char Scan = 0;

unsigned char SMG_Buffer = {0};

unsigned char code TAB[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char code WEI[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};

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

        ET0 = 1;
        TR0 = 1;
}

void Timer1_Init(void)        {
        TMOD = 0x21;                                               
        TH1 = (256 - 250);
        TL1 = (256 - 250);
       
        ET1 = 1;                        //打开定时器中断
        TR1 = 1;                        //开启定时器
}

void main(){
        Timer0_Init();
        Timer1_Init();

        EA = 1;

        while (1){

               SMG_Buffer = Second /10;       
                SMG_Buffer = Second % 10;       
       
       
                SMG_Buffer = Minute / 10;       
                SMG_Buffer = Minute % 10;

                SMG_Buffer = Hour / 10;
                SMG_Buffer = Hour % 10;



        }               
}


void Timer0_SRV(void) interrupt 1{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;

        Second ++;

        if (100 == Second) {
                Second = 0;
                Minute ++;
                if (Minute == 60) {
                        Minute = 0;
                        Hour ++;
                        if (Hour == 60){
                                Hour =0;
                        }
                }
       
        }       
}

void Timer1_Service(void) interrupt 3{
        TH1 = (256 - 250);
        TL1 = (256 - 250);       

        P0 = ~ (1 << Scan);
        WeCs = 1;
        WeCs = 0;
       

        P0 = TAB];
        DuCs = 1;
        DuCs = 0;

        Scan ++;
        if (Scan > 7){
                Scan = 0;
        }
}

daicp 发表于 2013-2-18 10:38:03

要写一行,调一行,对码编程.这样写完就调完了
页: [1]
查看完整版本: 写了个秒表的程序,有些困惑