普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 2987|回复: 7

通过定时器实现数码管秒表显示

[复制链接]

22

主题

24

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2021-1-9 17:25:41 | 显示全部楼层 |阅读模式
/* 程序功能:数码管显示秒表计时,前2个数码管表示小时,3、4数码管表示分钟,5、6数码管表示秒
   欢迎交流51单片机编程思路  QQ30777103
*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Duan P0
sbit Wei_a=P1^0;
sbit Wei_b=P1^1;
sbit Wei_c=P1^2;
uchar smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};

static uint i;

void delay(uint t)
{
        while(t--);

}

void Timer1Init()
{
        TMOD=0X10;
        TH1=0XFC; TL1=0X18;
        ET1=1;
        EA=1;
        TR1=1;
}

void Timer1() interrupt 3
{

        TH1=0XFC; TL1=0X18;
        i++;
}

void SMG_Display()
{
        static uchar sec,minu,hour;
        uchar j;
        if(i==1000)
        {
                i=0;
                sec++;
               
        }
        if(sec==60)
        {
                sec=0;
                minu++;
        }
        if(minu==60)
        {
                hour++;
        }
        if(hour==24)
        {
                hour=0;
        }
       
        for(j=0;j<6;j++)
        {
                switch(j)
                {
                        case 0: Wei_a=0; Wei_b=0;  Wei_c=0;  Duan=~smg[hour/10]; break;
                        case 1: Wei_a=1; Wei_b=0;  Wei_c=0;  Duan=~smg[hour%10]|0x80; break;
                        case 2: Wei_a=0; Wei_b=1;  Wei_c=0;  Duan=~smg[minu/10]; break;
                        case 3: Wei_a=1; Wei_b=1;  Wei_c=0;  Duan=~smg[minu%10]|0x80; break;
                        case 4: Wei_a=0; Wei_b=0;  Wei_c=1;  Duan=~smg[sec/10]; break;
                        case 5: Wei_a=1; Wei_b=0;  Wei_c=1;  Duan=~smg[sec%10]; break;
               
                }
                Duan=0x00;

        }


}

void main()
{
        Duan=0x00;
        Timer1Init();
        while(1)
        SMG_Display();
}
回复

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-1-10 09:05:17 | 显示全部楼层
我也新学的  有说的不对的 大佬们别介意 while(1)         SMG_Display(); 这里没有使用大括号   while  这里是不是死循环
回复 支持 反对

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-1-10 09:05:33 | 显示全部楼层
我也新学的  有说的不对的 大佬们别介意 while(1)         SMG_Display(); 这里没有使用大括号   while  这里是不是死循环
回复 支持 反对

使用道具 举报

10

主题

44

帖子

278

积分

中级会员

Rank: 3Rank: 3

积分
278
发表于 2021-1-10 10:47:49 | 显示全部楼层
实际运行程序 给分钟赋值59  之后 运行一分钟后 显示的是错误的时间  ,  而且数码管消影之前最好做个短暂的延时  代码中的延时函数并没有使用  消影之前不加延时 数码管看起来亮度很低
回复 支持 反对

使用道具 举报

22

主题

24

帖子

136

积分

注册会员

Rank: 2

积分
136
 楼主| 发表于 2021-1-10 10:55:46 | 显示全部楼层
liang123 发表于 2021-1-10 09:05
我也新学的  有说的不对的 大佬们别介意 while(1)         SMG_Display(); 这里没有使用大括号   while  这 ...

while(1) 后面不能加分号,让程序不停循环显示,过程中去处理中断
回复 支持 反对

使用道具 举报

22

主题

24

帖子

136

积分

注册会员

Rank: 2

积分
136
 楼主| 发表于 2021-1-10 11:01:46 | 显示全部楼层
liang123 发表于 2021-1-10 10:47
实际运行程序 给分钟赋值59  之后 运行一分钟后 显示的是错误的时间  ,  而且数码管消影之前最好做个短暂的 ...

多谢,确实分钟里面漏掉了清零,增加一句就可以了。
if(minu==60)
        {
                hour++;
                minu=0;
        }

我没用延迟,亮度没有发现问题。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2021-7-10 20:11:30 | 显示全部楼层
liang123 发表于 2021-1-10 09:05
我也新学的  有说的不对的 大佬们别介意 while(1)         SMG_Display(); 这里没有使用大括号   while  这 ...

是死循环,只有断电才会结束程序
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-24 13:52 , Processed in 0.107775 second(s), 33 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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