打印
[51单片机]

新手求助。程序流水灯和数码管都能工作,但是和我定的时间不匹配

[复制链接]
750|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DT天若有情|  楼主 | 2017-6-20 23:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//利用定时器1和动态扫描实现定时器1在数码管上显示从765432
//以十分之一秒往下下降,降到765398并且保持此数,与此同时定时器0
//以500ms的速度从上到下进行流水灯从上到下流动。当数码管减到停止时
//流水灯也停止,然后开始全部闪烁,3s后流水灯全部停止,数码管显示HELLO

//实验结果,流水灯和数码管跑动的时间太快,不是我定时器设定的时间。

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
uchar temp,t0,t1,aa,bb,cc,bai,shi,ge,flag,flag1;
uint shu;
void delayms(uint z);
void init();
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);
void main()
{
        init();
        while(1)
        {
                if(flag1!=1)//如果此处成立,运行下面语句。
                        display(7,6,5,bai,shi,ge);
          else//不然,运行此语句
                  display(16,17,18,18,19,20);
        }
}
               
        void init()//总的概括
        {
                shu=432;
                temp=0xfe;
                TH0=(65536-45872)/256;
                TL0=(65536-45872)%256;
                TH1=(65536-45872)/256;
                TL1=(65536-45872)%256;
                EA=1;
                ET0=1;
                ET1=1;
                TR0=1;
                TR1=1;
        }
       
void delayms(uint z)//延时函数体
        {
        uint i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);
        }
       
        void time0() interrupt 1//中断0函数
{
         TH0=(65536-45872)/256;
         TL0=(65536-45872)%256;
         t0++;
       
        if(flag!=1)//标志位flag,承下面106语句附近,灯灭了,数码管停了,需要重新打开0定时器,让灯全部亮起来
                {
                        if(t0==10)
                                {
                                        t0=0;
                                        temp=_crol_(temp,1);
                                        P1=temp;//流水灯流动
                                }
                }
               
         else//接上面if语句。因为等全部亮起来,需要三秒停下来。然后数码管显示HELLO,用的是标志位flag2
         {
                if(t0%4==0)
                        P1=~P1;//亮间隔大概200ms.(此处对4求模不是很理解,求解释)
                if(t0==60)
                                {
                                        TR0=0;
                                        P1=0xff;
                                        flag1=1;//如果总的3秒时间到了,开启标志位1,准备显示HELLO.
                                       
                                }
                }
         
}


        void time1() interrupt 3        //定时器1
{
         TH1=(65536-50000)/256;
         TL1=(65536-50000)%256;
                t1++;
                if(t1==2)
                {
                        t1=0;
                        shu--;
                        bai=shu/100;
                        shi=shu%100/10;
                        ge=shu%10;//因为数的前几个数字都一样,数我就直接定义变化的后三位398
                        if(shu==398)
                        {
                                TR0=0;
                                TH0=(65536-50000)/256;//关闭了一次,内部有数字,所以需要重新装一次
                                TL0=(65536-50000)%256;//接上面数停,流水灯停,需要重新再打开定时器0,后面要全部在闪起来。
                                TR0=1;
                                flag=1;//第一个标志位
                                t0=0;//t0必须清0 ,之前里面有数字再跑。
                                TR1=0;
                                P1=0xff;
                               
                        }
                }               

        }
        void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge)
{               
                        wela=1;//显示函数没什么好说的
                        P0=0xfe;
                        wela=0;
                        dula=1;
                        P0=table[aa];
                        dula=0;
                        P0=0xff;
            delayms(1);
       
                        wela=1;
                        P0=0xfd;
                        wela=0;
                        dula=1;
                        P0=table[bb];
                        dula=0;
                        P0=0xff;
            delayms(1);
                       
                        wela=1;
                        P0=0xfb;
                        wela=0;
                        dula=1;
                        P0=table[cc];
                        dula=0;
                        P0=0xff;
            delayms(1);
                       
                        wela=1;
                        P0=0xf7;
                        wela=0;
                        dula=1;
                        P0=table[bai];
                        dula=0;
                        P0=0xff;
            delayms(1);
                       
                       
                        wela=1;
                        P0=0xef;
                        wela=0;
                        dula=1;
                        P0=table[shi];
                        dula=0;
                        P0=0xff;
            delayms(1);
                       
                       
                        wela=1;
                        P0=0xdf;
                        wela=0;
                        dula=1;
                        P0=table[ge];
                        dula=0;
                        P0=0xff;
            delayms(1);
}

相关帖子

沙发
ckc| | 2017-6-22 00:14 | 只看该作者
速度快了多少倍?用的是啥mcu?是不是加强型的51?

使用特权

评论回复
板凳
qwrjnb| | 2017-6-22 13:46 | 只看该作者
天祥的风格,网上很多。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

23

帖子

0

粉丝