搜索
bottom↓
回复: 28

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

[复制链接]

出0入0汤圆

发表于 2013-2-14 15:12:56 | 显示全部楼层 |阅读模式
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. }

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-2-14 15:20:47 | 显示全部楼层
没电路图,没怎么不对的情况,你当大家都是算命的吗?

出0入0汤圆

发表于 2013-2-14 15:23:44 | 显示全部楼层
怎么个不对

出0入0汤圆

 楼主| 发表于 2013-2-14 15:29:58 | 显示全部楼层
单片机开发板的电路原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-2-14 15:30:33 | 显示全部楼层
单片机表面丝印图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-2-14 15:33:21 | 显示全部楼层
本帖最后由 一匹狼 于 2013-2-14 15:37 编辑
william_rain 发表于 2013-2-14 15:23
怎么个不对


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

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

出0入0汤圆

 楼主| 发表于 2013-2-14 15:39:00 | 显示全部楼层
i55x 发表于 2013-2-14 15:20
没电路图,没怎么不对的情况,你当大家都是算命的吗?



开发板的电路原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-2-14 15:41:24 | 显示全部楼层
你那个tt0不用初始化一个值吗?

出0入0汤圆

 楼主| 发表于 2013-2-14 15:45:05 | 显示全部楼层
faduo2012 发表于 2013-2-14 15:41
你那个tt0不用初始化一个值吗?

默认赋值0

出0入0汤圆

发表于 2013-2-14 15:49:31 | 显示全部楼层
你还是一位位的点亮吧。不用急

出0入0汤圆

发表于 2013-2-14 15:59:15 | 显示全部楼层
没仔细看,但一般都是延时的问题。

出0入0汤圆

 楼主| 发表于 2013-2-14 16:31:04 | 显示全部楼层
alwen 发表于 2013-2-14 15:49
你还是一位位的点亮吧。不用急
  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(void);
  20. void Init_Timer0(void);
  21. void delayms(uint);

  22. void main(void)
  23. {
  24.         Init_Timer0();
  25.         while(1)
  26.                 display();
  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(void)
  63. {
  64.         dataport=0xfe;
  65.         wela=1;
  66.         wela=0;
  67.         dataport=tempdata[0];
  68.         dula=1;
  69.         dula=0;
  70.         delayms(1);

  71.         dataport=0xfd;
  72.         wela=1;
  73.         wela=0;
  74.         dataport=tempdata[1];
  75.         dula=1;
  76.         dula=0;
  77.         delayms(1);

  78.         dataport=0xfb;
  79.         wela=1;
  80.         wela=0;
  81.         dataport=tempdata[2];
  82.         dula=1;
  83.         dula=0;
  84.         delayms(1);

  85.         dataport=0xf7;
  86.         wela=1;
  87.         wela=0;
  88.         dataport=tempdata[3];
  89.         dula=1;
  90.         dula=0;
  91.         delayms(1);

  92.         dataport=0xef;
  93.         wela=1;
  94.         wela=0;
  95.         dataport=tempdata[4];
  96.         dula=1;
  97.         dula=0;
  98.         delayms(1);

  99.         dataport=0xdf;
  100.         wela=1;
  101.         wela=0;
  102.         dataport=tempdata[5];
  103.         dula=1;
  104.         dula=0;
  105.         delayms(1);

  106.         dataport=0xbf;
  107.         wela=1;
  108.         wela=0;
  109.         dataport=tempdata[5];
  110.         dula=1;
  111.         dula=0;
  112.         delayms(1);
  113. }

  114. void delayms(uint ms)
  115. {
  116.         uint i;
  117.         while(ms--)
  118.                 for(i=110;i>0;i--);
  119. }



复制代码
还是不行、、、

出0入0汤圆

 楼主| 发表于 2013-2-14 16:47:01 | 显示全部楼层
bg6ixm 发表于 2013-2-14 15:59
没仔细看,但一般都是延时的问题。

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

出0入0汤圆

发表于 2013-2-14 16:50:28 | 显示全部楼层
一匹狼 发表于 2013-2-14 16:31
还是不行、、、

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

出0入0汤圆

发表于 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[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];
看看能否静态显示个个数字

出0入0汤圆

发表于 2013-2-14 17:12:25 | 显示全部楼层
定时器16位模式没有自动重装载功能吧。

出0入0汤圆

 楼主| 发表于 2013-2-14 17:39:05 | 显示全部楼层
i55x 发表于 2013-2-14 17:12
定时器16位模式没有自动重装载功能吧。

第47、48行重新装载初值

出0入0汤圆

 楼主| 发表于 2013-2-14 18:27:57 | 显示全部楼层
alwen 发表于 2013-2-14 16:55
/***************************************************************
文件名:秒表.c
晶振频率:12MHz

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

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

出0入0汤圆

发表于 2013-2-14 19:14:15 | 显示全部楼层
是不是把两个573搞错了?

出0入0汤圆

 楼主| 发表于 2013-2-14 19:19:43 | 显示全部楼层
Tliang 发表于 2013-2-14 19:14
是不是把两个573搞错了?

l两个573?

出0入0汤圆

发表于 2013-2-14 22:02:55 | 显示全部楼层
一匹狼 发表于 2013-2-14 18:27
显示不了
不知道为什么,
但我的单片机开发板还是好的,因为我烧写了以前写的8位共阴数码管的程序,数码 ...


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

出0入0汤圆

发表于 2013-2-14 22:05:58 | 显示全部楼层
一匹狼 发表于 2013-2-14 19:19
l两个573?

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

出0入0汤圆

 楼主| 发表于 2013-2-14 22:49:08 | 显示全部楼层
alwen 发表于 2013-2-14 22:05
我也想知道,PA0~PA7 是接到哪里的

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

出0入0汤圆

发表于 2013-2-14 23:35:51 | 显示全部楼层
楼主可以先试试单独点数码管显示固定数字,比如动态扫描显示1234,这个测试没问题了再试秒表的计数值

出0入0汤圆

 楼主| 发表于 2013-2-15 00:56:19 | 显示全部楼层
月光疾風 发表于 2013-2-14 23:35
楼主可以先试试单独点数码管显示固定数字,比如动态扫描显示1234,这个测试没问题了再试秒表的计数值 ...

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

出0入0汤圆

 楼主| 发表于 2013-2-15 00:57:22 | 显示全部楼层
不知道程序在哪出现差错了。。。。

出0入0汤圆

发表于 2013-2-15 14:59:19 | 显示全部楼层
好用的代码贴出来看看

出0入0汤圆

发表于 2013-2-18 10:18:33 | 显示全部楼层
一匹狼 发表于 2013-2-14 15:33
数码管显示很乱,根本就没法读数,
我设计本意是显示6位,而数码管显示了8位


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

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

  6. #include <reg52.h>

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

  9. #define DATA P0

  10. unsigned char Second = 0;
  11. unsigned char Minute =0;
  12. unsigned char Hour = 0;

  13. unsigned char Count = 0;
  14. unsigned char Scan = 0;

  15. unsigned char SMG_Buffer[8] = {0};

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

  24. void Timer0_Init(void){
  25.         TMOD=0x01;
  26.         TH0=(65536-10000)/256;
  27.         TL0=(65536-10000)%256;

  28.         ET0 = 1;
  29.         TR0 = 1;
  30. }

  31. void Timer1_Init(void)        {
  32.         TMOD = 0x21;                                               
  33.         TH1 = (256 - 250);
  34.         TL1 = (256 - 250);
  35.        
  36.         ET1 = 1;                        //打开定时器中断
  37.         TR1 = 1;                        //开启定时器
  38. }

  39. void main(){
  40.         Timer0_Init();
  41.         Timer1_Init();

  42.         EA = 1;

  43.         while (1){

  44.                  SMG_Buffer[4] = Second /10;       
  45.                 SMG_Buffer[5] = Second % 10;       
  46.        
  47.        
  48.                 SMG_Buffer[2] = Minute / 10;       
  49.                 SMG_Buffer[3] = Minute % 10;

  50.                 SMG_Buffer[0] = Hour / 10;
  51.                 SMG_Buffer[1] = Hour % 10;



  52.         }               
  53. }


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

  57.         Second ++;

  58.         if (100 == Second) {
  59.                 Second = 0;
  60.                 Minute ++;
  61.                 if (Minute == 60) {
  62.                         Minute = 0;
  63.                         Hour ++;
  64.                         if (Hour == 60){
  65.                                 Hour =0;
  66.                         }
  67.                 }
  68.        
  69.         }       
  70. }

  71. void Timer1_Service(void) interrupt 3{
  72.         TH1 = (256 - 250);
  73.         TL1 = (256 - 250);       

  74.         P0 = ~ (1 << Scan);
  75.         WeCs = 1;
  76.         WeCs = 0;
  77.        

  78.         P0 = TAB[SMG_Buffer[Scan]];
  79.         DuCs = 1;
  80.         DuCs = 0;

  81.         Scan ++;
  82.         if (Scan > 7){
  83.                 Scan = 0;
  84.         }
  85. }
复制代码

出0入0汤圆

发表于 2013-2-18 10:38:03 | 显示全部楼层
要写一行,调一行,对码编程.这样写完就调完了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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