请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 11999|回复: 13

数码管动态显示如何作出定时炸弹的效果?

 关闭 [复制链接]

4

主题

10

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2018-3-20 23:34:25 | 显示全部楼层 |阅读模式
我用的是89C52实验板,138译码器,想作出的效果是,“booo in X s”  (“s”用数字“5”表示),X从数字“9”变化到数字”0“,其他数码管的字样都保持不变。就这样的效果我已经折腾了一整天,均以失败告终,心态已经小崩。希望哪位大神能够出手相助!!!

-----以下是我的代码,就是初始但是保持不变的字样--------------
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

void delay(uint z){
        while(z--);
}

uint code letter[8]={0x6d,0x6f,0x37,0x06,0x5c,0x5c,0x5c,0x7c};
uint code number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void booo()
{
        int i;

                for(i=0;i<8;i++)
                {
                switch(i)
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;break;
                        case(1):
                                LSA=1;LSB=0;LSC=0;break;
                        case(2):
                                LSA=0;LSB=1;LSC=0;break;
                        case(3):
                                LSA=1;LSB=1;LSC=0;break;
                        case(4):
                                LSA=0;LSB=0;LSC=1;break;
                        case(5):
                                LSA=1;LSB=0;LSC=1;break;
                        case(6):
                                LSA=0;LSB=1;LSC=1;break;
                        case(7):
                                LSA=1;LSB=1;LSC=1;break;
                }
                        P0=letter[i];
                        delay(100);
                        P0=0x00;
                }
       
}

void main()
{
        booo();
}
回复

使用道具 举报

20

主题

1343

帖子

8345

积分

论坛元老

Rank: 8Rank: 8

积分
8345
发表于 2018-3-21 09:31:09 | 显示全部楼层
我给你搞定了。
因为数码管显示,是用扫描法,中间是不能有太多时间延时,所以,只能用定时器了。
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

void delay(uint z){
        while(z--);
}

uint code letter[7]={0x6d,0x37,0x06,0x5c,0x5c,0x5c,0x7c};
uint code number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char j=9,TT=0;
void booo()
{
        int i;

                for(i=0;i<7;i++)
                {
                switch(i)
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;break;
                        case(1):
                                LSA=0;LSB=1;LSC=0;break;
                        case(2):
                                LSA=1;LSB=1;LSC=0;break;
                        case(3):
                                LSA=0;LSB=0;LSC=1;break;
                        case(4):
                                LSA=1;LSB=0;LSC=1;break;
                        case(5):
                                LSA=0;LSB=1;LSC=1;break;
                        case(6):
                                LSA=1;LSB=1;LSC=1;break;
                }
                        P0=letter[i];
                        delay(100);
                        P0=0x00;
                }
        
}
void TimeConfig()
{
    TMOD = 0x10;
    TH1 = 0x3c;       
    TL1 = 0xb0;
    EA = 1;               
    ET1 = 1;       
        TF1=0;
    TR1 = 0;       
}

void xs()
{
        LSA=1;LSB=0;LSC=0;
                        P0=number[j];
                        delay(100);
                        P0=0x00;
}
void main()
{
TimeConfig();
TR1 = 1;
        while(1)
        {
        booo();
                xs();
                if (j==0)
                {
                        TR1 = 0;
                        EA = 0;
                        j=0;
                }
        }
}

void Time1() interrupt 3
{
        TH1 = 0x3c;       
    TL1 = 0xb0;
        TT++;               
        if (TT>=20)
        {
                TT=0;
                j--;
        }
        TF1=0;
}
回复 支持 反对

使用道具 举报

4

主题

10

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2018-3-21 11:42:30 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-3-21 09:31
我给你搞定了。
因为数码管显示,是用扫描法,中间是不能有太多时间延时,所以,只能用定时器了。
#inclu ...

首先感谢大神出手相助,真的做到了我想要的效果!因为我刚学没多久,现在就学到这数码管,定时器还没学。一开始就想动态显示做一个定时炸弹的效果,但是很快就考虑到了扫描延时不一致的问题。然后我编程试了一下,发现数码管就算变化了,其他数码管的扫描延时也会受影响,会变得非常淡。然后,折腾一整天想把延时搞一致,都以失败告终。。所以请问大神,如果要作出这样的效果,是不是只能用定时器完成,而扫描延时同步是不可能实现的呢?
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8345

积分

论坛元老

Rank: 8Rank: 8

积分
8345
发表于 2018-3-21 13:02:54 | 显示全部楼层
Michael1999 发表于 2018-3-21 11:42
首先感谢大神出手相助,真的做到了我想要的效果!因为我刚学没多久,现在就学到这数码管,定时器还没学。 ...

是的!
就是因为数码管是用的扫描法,所以只能这样做了。
如果有足够的I/O口,不使用译码器,那么,就可以不用定时器了。
回复 支持 反对

使用道具 举报

11

主题

42

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
发表于 2018-3-21 21:48:40 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-3-21 09:31
我给你搞定了。
因为数码管显示,是用扫描法,中间是不能有太多时间延时,所以,只能用定时器了。
#inclu ...

我想问一下,那个定时器你用的是8位自动重装定时器,这个是方式2,是不是方式1那个16位定时计数器也可以用,你用的那个方式二TH1和TL1定时时长是多少毫秒呀,还有那个TMOD下面的TF1=0是不是可以去掉
回复 支持 反对

使用道具 举报

11

主题

42

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
发表于 2018-3-21 22:24:25 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-3-21 09:31
我给你搞定了。
因为数码管显示,是用扫描法,中间是不能有太多时间延时,所以,只能用定时器了。
#inclu ...

还想问一下那个最后TF1=0是干什么的
回复 支持 反对

使用道具 举报

11

主题

42

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
发表于 2018-3-21 22:36:14 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-3-21 13:02
是的!
就是因为数码管是用的扫描法,所以只能这样做了。
如果有足够的I/O口,不使用译码器,那么,就 ...

再问一下一个程序中可不可以有两个定时器,如果有的话,两个定时器是不是要分开写
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8345

积分

论坛元老

Rank: 8Rank: 8

积分
8345
发表于 2018-3-22 08:45:13 | 显示全部楼层
抬头就是阳光 发表于 2018-3-21 22:36
再问一下一个程序中可不可以有两个定时器,如果有的话,两个定时器是不是要分开写

呵呵,问题这么多?一个一个地来解答。
第一:定时器定时:12M晶振下,50ms。你可以用辅助程序自己设置,也可以看懂原理后自己算。



第二:TMOD下面的TF1=0是可以去掉的,只是要说明一个道理——先设置说明,后使用;有备无患。
第三:最后的TF1=0,就是清中断标志啊。与上一个问题相关。上一个问题中,是预先清除中断标志(当然可以不做这个,通常单片机没问题时是自然为零的),定时器要告诉CPU需要中断,就是通过这个中断标志进行的,它为1,则发生中断(前提是允许中断),如果你在中断服务程序中没有清除它,那么就不会有下一次的定时器计数,即反复发生中断,程序就死这里了,因为CPU还以为要中断嘛。
第四:程序中可以用单片机的所有资源。例如:STC89C52RC单片机,有四个外部中断、三个定时器中断、一个串口中断,这些资源你在同一个程序中都是可以同时使用的。设置函数可以写一个,把所有设置都写在一起是没问题的,不过我们都不这样做,各写各的,如外部中断写一个,定时器中断写一个,等等,是为了修改、调试方便。但中断服务程序,只能一个一个地写,因为那个定义函数中,有中断号,就是这个——void Time1() interrupt 3
刚才说的那8个中断源,每个都有中断号,如定时器中断1的号就是3,另的中断发生时,只能执行对应的中断函数,所以只能一个一个地写。
回答完毕。好累。呵呵,希望说明白了,对你有用。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

11

主题

42

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
发表于 2018-3-22 14:00:14 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-3-22 08:45
呵呵,问题这么多?一个一个地来解答。
第一:定时器定时:12M晶振下,50ms。你可以用辅助程序自己设置 ...

耽误了大佬的宝贵时间,非常感谢
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8345

积分

论坛元老

Rank: 8Rank: 8

积分
8345
发表于 2018-3-22 14:08:13 | 显示全部楼层
抬头就是阳光 发表于 2018-3-22 14:00
耽误了大佬的宝贵时间,非常感谢

开个玩笑而已,如果真累了,不回答就是了嘛。
我不是大佬,只是爱好者,在这里的时间长而已。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-3-29 23:27 , Processed in 0.104237 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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