找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11877|回复: 9
打印 上一主题 下一主题
收起左侧

STC89C52单片机简易时钟程序电路设计(附源代码和电路图)

[复制链接]
跳转到指定楼层
楼主
51(STC89C52)单片机简易时钟程序电路设计(附源代码和电路图)
上一篇做了一个温湿度采集电路,觉得这东西玩起来还是挺有意思,然后就想做一个时钟,于是就有了下文
1.成品图


2.电路设计
电路设计如下这里蜂鸣器用led等替代了,我觉得无所谓吧


电路仿真工程文件
时钟电路仿真.rar (53.5 KB, 下载次数: 51)

3.程序开发调试
程序
//****************************************************************//
//大男孩简易时钟
//单片机 STC89C52RC
//功能   简单时钟设计,按键调整时间和定闹钟
//****************************************************************//

#include <reg51.h>
#include <intrins.h>


//数据类型定义
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */



//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//

//数码管显示io定义
sbit S1=P2^7;
sbit S2=P2^6;
sbit S3=P2^5;
sbit S4=P2^4;

//按键开关io定义
sbit KEY1=P1^0;
sbit KEY2=P1^1;

//蜂鸣器io定义
sbit BELL=P2^3;

//----------------------------------------------//
//----------------数码管数字 0--9---------------//
//----------------------------------------------//

U8 dat1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0X80,0X90,0xff,0xc6};
U8 dat2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0X00,0X10,0xff};//有小数点

//位选
U8 table[4]={0,0,2,1};


S8 flag=0;
S8 t=0;
S8 miao=0;
S8 xs=0;
S8 menu=0;
S8 feng=0,fens=0,shig=0,shis=0;
S8 nfeng=0,nfens=3,nshig=6,nshis=0;
S8 djsm=0,djsf=99;
S8 ksdjs=0;
S8 nkg=0;
S8 zdbs=0;

U8 count = 100;


//延时程序
void Delayms(U16 t)
{
         U8 i;
        while(t--)
           for(i=0;i<100;i++);
}

//数码管显示
void display()
{
        S1=0;S4=1;
        P0=dat1[table[0]];
        Delayms(2);        

        S4=0;S3=1;
        P0=dat1[table[1]];
        Delayms(2);
        
        S3=0;S2=1;
        if(flag>0)P0=dat2[table[2]];
        else      P0=dat1[table[2]];
               
        Delayms(2);
        
        S2=0;S1=1;
        P0=dat1[table[3]];
        Delayms(2);                                                        
}        

void key()
{
        if(BELL==0)
        {
                if(KEY2==0)
                {
                        while(KEY2==0);
                        BELL=1;
                        nkg=0;
                }
        }
        if(KEY1==0)
        {
                Delayms(10);
                if(KEY1==0)
                {
                        BELL=0;
                        while(KEY1==0);
                        BELL=1;
                        menu++;
                        if(menu==1){feng=table[0];fens=table[1];}
                        if(menu==2){shig=table[2];shis=table[3];}
                        if(menu==3){table[0]=nfeng;table[1]=nfens;table[2]=nshig;table[3]=nshis;}
                        if(menu==9){BELL=1;djsm=0;djsf=0;ksdjs=0;}        
                        if(menu==10){table[0]=feng;table[1]=fens;table[2]=shig;table[3]=shis;menu=0;}               
                }

        }
        if(menu==1)//设置时间分
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                feng++;
                                if(feng==10)
                                {
                                        feng=0;
                                        fens++;
                                        if(fens==6)fens=0;
                                }                        
                        }
                }
        }
        if(menu==2)//设置时间时
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                shig++;
                                if(shig==10)
                                {
                                        shig=0;
                                        shis++;
                                }
                                if(shis==2 && shig==4)shig=shis=0;                                
                        }
                }
        }
        if(menu==3)//设置闹钟分
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                nfeng++;
                                if(nfeng==10)
                                {
                                        nfeng=0;
                                        nfens++;
                                        if(nfens==6)nfens=0;
                                }                        
                        }
                }
        }
        if(menu==4)//设置闹钟时
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                nshig++;
                                if(nshig==10)
                                {
                                        nshig=0;
                                        nshis++;
                                }
                                if(nshis==2 && nshig==4)nshig=nshis=0;                                
                        }
                }
        }
        if(menu==5)//开启关闭闹钟
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                nkg++;
                                if(nkg==2)nkg=0;                        
                        }
                }
        }
        if(menu==6)//开启关闭整点报时
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                zdbs++;
                                if(zdbs==2)zdbs=0;                        
                        }
                }
        }
        if(menu==7)//倒计时设置
        {
                if(KEY2==0)
                {
                        Delayms(10);
                        if(KEY2==0)
                        {
                                BELL=0;
                                while(KEY2==0);
                                BELL=1;
                                djsf++;
                                if(djsf>99)djsf=0;               
                        }
                }
        }
}
void init()
{
    TMOD= 0x10;                                   
    TL1 = (65536-50000)%256;        //设置定时初值
    TH1 = (65536-50000)/256;        //设置定时初值
    ET1 = 1;
    TR1 = 1;
    EA  = 1;
}
void main()
{
        init();
while(1)
        {
                key();
                display();
                if(nkg==1)
                {
                        if(table[0]==nfeng && table[1]==nfens && table[2]==nshig && table[3]==nshis)BELL=0;
                        else BELL=1;
                }
                if(zdbs==1)
                {
                        if(table[0]==0 && table[1]==0 && miao<2)BELL=0;
                        else BELL=1;           
                }
        }
}




void InitTimer1() interrupt 3  // 1毫秒@11.0592MHz
{
    TL1 = (65536-50000)%256;        //设置定时初值
    TH1 = (65536-50000)/256;        //设置定时初值
        t++;
        if(menu==0)
        {
                if(t==20)
                {
                        t=0;
                        miao++;
                        if(miao==60)
                        {
                                miao=0;
                                table[0]++;                                                                        //分个位加
                                if(table[0]==10)
                                {
                                        table[0]=0;
                                        table[1]++;                                                                //分十位加
                                        if(table[1]==6)
                                        {
                                                table[1]=0;
                                                table[2]++;                                                        //时个位加
                                                if(table[2]==10)
                                                {
                                                        table[2]=0;
                                                        table[3]++;                                                //时十位加
                                                }
                                                if(table[3]==2 && table[2]==4)table[2]=table[3]=0;//满24时
                                        }
                                }        
                        }
                }
        }
        if(menu==1)
        {
                if(t<10)
                {
                        table[0]=feng;
                        table[1]=fens;               
                }
                if(t<20 && t>=10)
                {
                        table[0]=10;
                        table[1]=10;               
                }
                if(t==20)t=0;                        
        }
        if(menu==2)
        {
                table[0]=feng;
                table[1]=fens;
                if(t<10)
                {
                        table[2]=shig;
                        table[3]=shis;               
                }
                if(t<20 && t>=10)
                {
                        table[2]=10;
                        table[3]=10;               
                }
                if(t==20)t=0;                        
        }
        if(menu==3)
        {
                if(t<10)
                {
                        table[0]=nfeng;
                        table[1]=nfens;               
                }
                if(t<20 && t>=10)
                {
                        table[0]=10;
                        table[1]=10;               
                }
                if(t==20)t=0;                        
        }
        if(menu==4)
        {
                table[0]=nfeng;
                table[1]=nfens;
                if(t<10)
                {
                        table[2]=nshig;
                        table[3]=nshis;               
                }
                if(t<20 && t>=10)
                {
                        table[2]=10;
                        table[3]=10;               
                }
                if(t==20)t=0;                        
        }
        if(menu==5)//开启关闭闹钟
        {
                table[0]=table[1]=table[2]=table[3]=nkg;
        }
        if(menu==6)//开启关闭整点报时
        {
                table[0]=table[1]=table[2]=table[3]=zdbs;
        }
        if(menu==7)//倒计时
        {
                table[0]=0;
                table[1]=0;
                table[2]=djsf%10;
                table[3]=djsf/10;                                
        }

        if(menu==8)//倒计时
        {
                if(KEY2==0)//开始倒计时
                {
                        t=0;
                        BELL=0;
                        while(KEY2==0);
                        BELL=1;                                          
                        ksdjs=1;
                        djsm=59;
                        djsf=djsf-1;
                }
                if(t==20 && ksdjs==1)
                {
                        t=0;
                        djsm--;
                        if(djsf==0 && djsm==0){BELL=0;ksdjs=0;}        
                        if(djsm==-1)
                        {
                                djsm=59;
                                djsf--;               
                        }
                }
                table[3]=djsf/10;
                table[2]=djsf%10;
                table[1]=djsm/10;
                table[0]=djsm%10;
        }

        if(menu==9)
        {
                if(KEY2==0)//秒表开计时
                {
                        t=0;
                        BELL=0;
                        while(KEY2==0);
                        BELL=1;                                          
                        ksdjs++;
                        if(ksdjs==2)ksdjs=0;
                }
                if(t==20 && ksdjs==1)
                {
                        t=0;
                        djsm++;
                        if(djsm==60)
                        {
                                djsm=0;
                                djsf++;
                                if(djsf>99){ksdjs==0;djsf==99;}
                        }
                }
                table[3]=djsf/10;
                table[2]=djsf%10;
                table[1]=djsm/10;
                table[0]=djsm%10;               
        }

        xs++;
        if(xs==10)
        {
                xs=0;
                flag=!flag;        
        }
}




源代码c语言程序
时钟程序设计.rar (37.42 KB, 下载次数: 30)


电路调试制作焊接等


4.制作外壳
购买了手钻和亚克力板等,然后就简单制作了个外壳




然后顺便已给我的温湿度计也做了一个外壳,哈哈


51hei图片_20200404134212.jpg (1.99 MB, 下载次数: 42)

51hei图片_20200404134212.jpg

51hei图片_20200404134237.jpg (2.13 MB, 下载次数: 34)

51hei图片_20200404134237.jpg

51hei图片_20200404134242.jpg (1.83 MB, 下载次数: 38)

51hei图片_20200404134242.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:125719 发表于 2020-4-4 21:27 | 只看该作者
这个动手能力很棒的,走线也很漂亮
回复

使用道具 举报

板凳
ID:70614 发表于 2020-4-24 16:30 | 只看该作者
用的都是什么原件,有什么功能
回复

使用道具 举报

地板
ID:459560 发表于 2020-4-24 20:47 | 只看该作者
很漂亮,外壳也不错,
回复

使用道具 举报

5#
ID:499163 发表于 2020-5-18 17:14 | 只看该作者
星星一眨眼 发表于 2020-4-24 16:30
用的都是什么原件,有什么功能

元器件的话我没有列出来,但是看图片都有了,对于你们这样的大神,我觉得看一眼就知道怎么回事了,功能有时钟、闹钟
回复

使用道具 举报

6#
ID:499163 发表于 2020-5-18 17:16 | 只看该作者
shyboy133 发表于 2020-4-24 20:47
很漂亮,外壳也不错,

哈哈,做这个外壳其实还是需要专业的设备,我直接用刀裁剪,误差太大,打孔也是,总是差一点点。。尴尬,总算是凑活好了,也浪费了不好板材
回复

使用道具 举报

7#
ID:732581 发表于 2020-5-18 20:11 来自手机 | 只看该作者
还得需要开发板吧
回复

使用道具 举报

8#
ID:499163 发表于 2020-5-20 15:49 | 只看该作者
永琪琪 发表于 2020-5-18 20:11
还得需要开发板吧

途中的小板就是个小开发板,实际上做这个简单的,有个面包板能调试就可以了,只是说有个开发板更方便调试测试
回复

使用道具 举报

9#
ID:443306 发表于 2020-5-21 08:02 来自手机 | 只看该作者
我也不懂编程感觉你这个过于复杂能不能做个简单的时钟 就用stcf104之类的8脚单片机的6个端子,四个用于1602串口屏的输出,二个用于时间设置,呵呵也就是说单片机设置成一小时计时器,重复使用了你设计好我也做个玩,虽然不用1302,精度可以调整定时器时间改善吧,这样简单的时钟也没必要讲究高精度吧八九不离十就可以了设计好给我一份我也做个玩玩,谢谢
回复

使用道具 举报

10#
ID:443306 发表于 2020-5-21 08:06 来自手机 | 只看该作者
qingfengjyf 发表于 2020-5-20 15:49
途中的小板就是个小开发板,实际上做这个简单的,有个面包板能调试就可以了,只是说有个开发板更方便调试 ...

我也不懂编程感觉你这个过于复杂能不能做个简单的时钟 就用stc15f104之类的8脚单片机的6个端子,四个用于1602串口屏的输出,二个用于时间设置,呵呵也就是说单片机设置成一小时计时器,重复使用了你设计好我也做个玩,虽然不用1302,精度可以调整定时器时间改善吧,这样简单的时钟也没必要讲究高精度吧八九不离十就可以了设计好给我一份我也做个玩玩,谢谢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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