打印

52单片机控制数字时钟程序

[复制链接]
2362|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenxiaoting|  楼主 | 2017-5-24 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar a,num;
char hour,fen,miao;
sbit wela=P2^7;
sbit dula=P2^6;
sbit s1=P3^4;
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7;
void delay(uchar z)
{
        uchar i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);       
}
void init()
{
        TMOD=0x01;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        EA=1;
        ET0=1;
        TR0=1;
        miao=0;
        fen=0;
        hour=0;       
        num=0;
}
void display()
{
        wela=1;
        P0=0xfe;
        wela=0;
        dula=1;
        P0=table[hour/10];
        dula=0;
        P0=0xff;
        delay(5);
       
        wela=1;
        P0=0xfd;
        wela=0;
        dula=1;
        P0=table[hour%10];
        dula=0;
        P0=0xff;
        delay(5);

        wela=1;
        P0=0xfb;
        wela=0;
        dula=1;
        P0=table[fen/10];
        dula=0;
        P0=0xff;
        delay(5);

        wela=1;
        P0=0xf7;
        wela=0;
        dula=1;
        P0=table[fen%10];
        dula=0;
        P0=0xff;
        delay(5);

        wela=1;
        P0=0xef;
        wela=0;
        dula=1;
        P0=table[miao/10];
        dula=0;
        P0=0xff;
        delay(5);

        wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[miao%10];
        dula=0;
        P0=0xff;
        delay(5);       
}
void keyscan()
{
        if(s1==0)
        {
                delay(10);
                if(s1==0)
                {
                        while(!s1);
                        num++;       
                }       
        }
        if(num==1)
        {
                TR0=0;
                if(s2==0)
                {
                        delay(10);
                        if(s2==0)
                        {
                                while(!s2);
                                miao++;
                                if(miao==60)
                                        miao=0;
                        }
                }
                if(s3==0)
                {
                        delay(10);
                        if(s3==0)
                        {
                                while(!s3);
                                miao--;
                                if(miao==-1)
                                        miao=59;
                               
                        }
                }
        }
        if(num==2)
        {
                if(s2==0)
                {
                        delay(10);
                        if(s2==0)
                        {
                                while(!s2);
                                fen++;
                                if(fen==60)
                                        fen=0;
                        }
                }
                if(s3==0)
                {
                        delay(10);
                        if(s3==0)
                        {
                                while(!s3);
                                fen--;
                                if(fen==-1)
                                        fen=59;
                        }
                }

        }
        if(num==3)
        {
                if(s2==0)
                {
                        delay(10);
                        if(s2==0)
                        {
                                while(!s2);
                                hour++;
                                if(hour==24)
                                        hour=0;
                        }
                }
                if(s3==0)
                {
                        delay(10);
                        if(s3==0)
                        {
                                while(!s3);
                                hour--;
                                if(hour==-1)
                                        hour=23;
                        }       
                }
        }
        if(num==4)
        {
                num=0;
                TR0=1;
        }

}
void main()
{
        init();
        while(1)
        {
                display();
                keyscan();
               
        }
}
void timer0() interrupt 1
{
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        a++;
        if(a==20)
        {
                a=0;
                miao++;
                if(miao==60)
                {
                        miao=0;
                        fen++;
                        if(fen==60)
                        {
                                fen=0;
                                hour++;
                                if(hour==24)
                                {
                                        hour=0;
                                }
                        }
                }
        display();
        }
}

相关帖子

沙发
cjseng| | 2017-5-24 21:32 | 只看该作者
这程序怎么了?似乎没啥用啊,到处都是delay

使用特权

评论回复
板凳
dirtwillfly| | 2017-5-25 08:10 | 只看该作者
感谢楼主分享

使用特权

评论回复
地板
chenxiaoting|  楼主 | 2017-5-25 10:24 | 只看该作者
cjseng 发表于 2017-5-24 21:32
这程序怎么了?似乎没啥用啊,到处都是delay

我用delay是用于按键去抖,刚刚学习单片机,不懂之处多多指教。

使用特权

评论回复
5
ningling_21| | 2017-5-25 10:40 | 只看该作者
chenxiaoting 发表于 2017-5-25 10:24
我用delay是用于按键去抖,刚刚学习单片机,不懂之处多多指教。

为何不在中断中扫描数码管

使用特权

评论回复
6
cjseng| | 2017-5-25 11:01 | 只看该作者
chenxiaoting 发表于 2017-5-25 10:24
我用delay是用于按键去抖,刚刚学习单片机,不懂之处多多指教。

那你一开始学的就是错的啊,你这只不过是做一个数字时钟,要是做一个稍微复杂点的东西,比如说有20个按键,有16位数码管,那你的程序运行起来是什么效果呢?
你这个程序,要是按键按着不放,数码管扫描是不是就停止了?

使用特权

评论回复
7
宇容创行| | 2017-5-25 11:27 | 只看该作者
用的是t0,误差比较大吧

使用特权

评论回复
8
chenxiaoting|  楼主 | 2017-5-25 19:52 | 只看该作者
cjseng 发表于 2017-5-25 11:01
那你一开始学的就是错的啊,你这只不过是做一个数字时钟,要是做一个稍微复杂点的东西,比如说有20个按键 ...

这里的按键我是用来调时间的,刚刚去试了下,按着不放的话,数码管会动,但是好像不太稳定,学这个真的是一个艰难的过程啊

使用特权

评论回复
9
chenxiaoting|  楼主 | 2017-5-25 19:54 | 只看该作者
宇容创行 发表于 2017-5-25 11:27
用的是t0,误差比较大吧

嘻嘻,好多我都不懂,写个程序放这上面,有大家的指点,很好。

使用特权

评论回复
10
cjseng| | 2017-5-25 22:17 | 只看该作者
chenxiaoting 发表于 2017-5-25 19:52
这里的按键我是用来调时间的,刚刚去试了下,按着不放的话,数码管会动,但是好像不太稳定,学这 ...

把按键扫描放到定时中断里,以固定时间间隔去扫描,可以不用delay,实际上你的display也可以放定时中断里,固定刷新频率。反正也没用到别的中断了,只要在定时周期内能完成按键扫描和数码管刷新以及计时的工作,中断退出后,就没事干了,可以让单片机进入省电模式,歇会儿多好啊。

使用特权

评论回复
11
chenxiaoting|  楼主 | 2017-6-1 11:12 | 只看该作者
cjseng 发表于 2017-5-25 22:17
把按键扫描放到定时中断里,以固定时间间隔去扫描,可以不用delay,实际上你的display也可以放定时中断里 ...

谢谢

使用特权

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

本版积分规则

3

主题

10

帖子

0

粉丝