找回密码
 立即注册

QQ登录

只需一步,快速开始

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

6位时钟可调可复位

[复制链接]
跳转到指定楼层
楼主
ID:653143 发表于 2019-12-6 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 环境开会看见和 于 2019-12-10 21:46 编辑

#include<reg52.h> //头文件
#define uc unsigned char //宏定义
#define ui unsigned int    //宏定义

sbit key1=P1^0;//定义调小时
sbit key2=P1^1;//定义调分钟
sbit key3=P1^2;//定义秒清零        

sbit LED=P1^6;//定义LED
sbit beep=P1^7;//设蜂鸣器

uc min,hour,sec,led,num; //无符号字符型变量

bit bdata hourLED,halfLED,hourbeep,halfbeep; //位变量

//uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                //共阴极编码
uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};           //共阳级编码

void delay(ui x)//1ms延时函数
{
    ui i,j;
    for(i=0;i<x;i++)
    for(j=0;j<121;j++);
}
void display()        //扫描显示函数,高位到低位
{

    P0=tab[hour/10];        //给小时的十位送形
          P2=0x01;                        //1000 0000   共阳打开位选          共阳需要接高电平才亮
    delay(1);                         //延时动态扫描
        P2=0x00;                   //共阳的  关闭位选

    /*P3=0xfe;                //1111 1110   共阴打开位选         共阴需要接低电平才亮
        delay(1);
        P3=0xff;                 //共阴的  关闭位选           */

    P0=(tab[hour%10]);        //|0x80;*//给第二位后加“点
        P2=0x02;        //0100 0000
    delay(1);
        P2=0x00;

        /*P3=0xfd;        //1111 1101          共阴
        delay(1);
        P3=0xff;*/

/***********G横杠效果***************/

        P0=0xbf;        //        横杠共阳                          
        P2=0x04;        //0010 0000         
        delay(1);
        P2=0x00;

        /*P2=0x40;          //共阴
        P3=0xfb;                   //1111 1011
        delay(1);
        P3=0xff;*/
/***********G横杠效果***************/


    P0=tab[min/10];
        P2=0x08;    //0001 0000
    delay(1);
        P2=0x00;

        /*P3=0xf7;        //1111 0111
        delay(1);
        P3=0xff; */

    P0=(tab[min%10]);        /*|0x80;*/        //给第四位后加“点”
        P2=0x10;                //0000 1000
    delay(1);
        P2=0x00;

        /*P3=0xef;                //1110 1111
            delay(1);
     P3=0xff;*/


/***********G横杠效果***************/

        P0=0xbf;                 //共阳        
        P2=0x20;                //0000 0100
        delay(1);
        P2=0x00;

        /*P2=0x40;                //共阴
        P3=0xdf;                //1101 1111         共阴
        delay(1);
        P3=0xff;*/

/***********G横杠效果***************/


    P0=tab[sec/10];
        P2=0x40;                //0000 0010
    delay(1);
        P2=0x00;

        /*P3=0xbf;        //1011 1111
        P3=0xff;
        delay(1);*/        

    P0=tab[sec%10];   
        P2=0x80;        //0000 0001
    delay(1);
        P2=0x00;

        /*P3=0x7f;        //0111 1111
        delay(1);
        P3=0xff;*/

}

void keyscan()//键盘扫描,开关接地
{
    if(key1==0)     //如果小时加按键按下
    {
        delay(5);  //延时去抖
        if(key1==0)     //确定是否按键
        {
            hour++;     //小时加一
            if(hour==24) //如果小时等于24
            hour=0;        //小时归零
        }
        while(!key1) display();//判断是否松开
    }
    if(key2==0)      //如果分钟加按键按下
    {
        delay(5);  //延时去抖
        if(key2==0)    //确定是否按键
        {
            min++; //分钟加一
            if(min==60)// 如果分钟等于60
            min=0;    //分钟归零
        }
        while(!key2) display();//判断是否松开
    }
    if(key3==0)//判断调整秒按键
    {
        delay(5);  //延时去抖
        if(key3==0)    //确定是否按键
        {sec=0;} //秒清零
        while(!key3) display();//判断是否松开
    }
}
void strike()//报时函数
{
    if((hour>6)&&(hour<22))//判断大于6点并且小于22点
    {
        if(sec==0)//以下判断是否整点
        {
            if(min==0)//如果秒和分都等于0
            {
                hourbeep=1;    //那么蜂鸣器和小灯位开启
                hourLED=1;
            }
            else if(min==30)//如果分钟等于30
            {
                if(num<10)    //闪5下响一声
                halfbeep=1;
                halfLED=1;
            }
        }
    }
    else //小于6点和大于22点的时候
    {
        if(sec==0)//以下判断是否整点
        {
            if(min==0)//如果分钟等于0
            hourLED=1; //led位开
            else if(min==30)//如果分钟=0
            halfLED=1;//进行半点报时
        }
    }
}

void init()//初始化函数
{
    sec=0;//一通电,显示12:30:00,蜂鸣器响一下
    min=30;
    hour=12;
    TMOD=0x01;//设置定时器为定时器0工作方式为1
    TH0=(65536-46083)/256;    //赋初值
    TL0=(65536-46083)%256;  //赋初值
    EA=1; //开总中断
    ET0=1; //开定时器0中断
    TR0=1; //启动定时器0
}

void main()//主函数
{
    init();//初始化函数
    while(1) //主循环
    {
        display(); //显示
        keyscan();//扫描是否有键按下
        strike();//报时函数
    }
}

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

使用道具 举报

沙发
ID:1 发表于 2019-12-10 00:26 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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