找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机24小时制时钟显示,且可调闹钟程序

  [复制链接]
跳转到指定楼层
楼主
运用6位集成数码管;蜂鸣器;4个按键开关;(我用的是4*4扫描按键的开关没有改图,不影响)
k1为模式按键,第一次按下调整时,第二次按下调整分,第三次按下调整秒;
K2为调闹钟(同K1);
k3为时间加一;
k4为时间减一;

proteus接发如下:


程序如下:

#include <reg51.h>

void delay(unsigned int i)
{
        unsigned int k;
        for(k = 0; k < i; k++);
}

unsigned char count = 0;
unsigned char miao = 0, min = 0, hour = 0;
unsigned char miao2 = 0, min2 = 0, hour2 = 0;
unsigned int b = 0, c = 0, d = 0; i = 0, bm = 0, btime = 0;

sbit keymode = P2^3;
sbit keyclock = P2^2;
sbit keyup = P2^1;
sbit keydown = P2^0;
sbit beep_b = P3^6;

void dispall();
void key_mode();
void key_clock();
void key_scan();
void key_scan2();
void set();
void set2();
void disp();
void disp2();
void beep();


void main()
{
        TMOD = 0x10;
        TH1 = (65536 - 50000)/256;                                        //重新设置T1计数初值高8位
        TL1 = (65536 - 50000)%256;                                        //重新设置T1计数初值低8位
        ET1 = 1;                                                                                                                //开放T1中断允许
        EX1 = 1;
        IT1 = 1;
        EA = 1;                                                                                                                        //开放总中断允许
        TR1 = 1;                                                                                                                //启动T1开始计数
        while(1)
        {
                key_scan();
                key_scan2();
                disp();
                disp2();
                beep();
        }
}

void key_mode()
{
        if(!keymode)
        {
                delay(1000);
                if(!keymode)
                {
                        b++;
                        if(b > 3)
                                b = 0;
                }
                while(!keymode);
        }
}

void key_clock()
{
        if(!keyclock)
        {
                delay(1000);
                if(!keyclock)
                {
                        c++;
                        if(c > 3)
                        c = 0;
                }
                d++;
                while(!keyclock);
        }
}        

void key_scan()
{
        P2=0x0f;
        key_mode();
        if(b == 1)
        {
                c = 0;
                disp(); set();
        }
        else if(b == 2)
        {
                c = 0;
                disp(); set();
        }
        else if(b == 3)
        {
                c = 0;
                disp(); set();
        }
}

void key_scan2()
{
        P2=0x0f;
        key_clock();
        if(c == 1)
        {
                b = 0;
                disp2(); set2();
        }
        else if(c == 2)
        {
                b = 0;
                disp2(); set2();
        }
        else if(c == 3)
        {
                b = 0;
                disp2(); set2();
        }
}


void set()
{
                if(keyup == 0)                                                                //时间增加按键
                {
                        if(b == 1) {hour++;        if(hour > 23)        hour = 0;}
                        else if(b == 2) {min++; if(min > 59) min = 0;}
                        else if(b == 3) {miao++; if(miao > 59) miao = 0;}
                }
                while(!keyup);
               
                if(keydown == 0)                                                        //时间减少按键
                {
                        if(b == 1) {if(hour != 0) hour--; else hour = 23;}
                        else if(b == 2) {if(min != 0) min--; else min = 59;}
                        else if(b == 3) {if(miao != 0) miao--; else miao = 59;}                        
                }
                while(!keydown);        
}

void set2()
{
                if(keyup == 0)                                                                //时间增加按键
                {
                        if(c == 1) {hour2++;        if(hour2 > 23)        hour2 = 0;}
                        else if(c == 2) {min2++; if(min2 > 59) min2 = 0;}
                        else if(c == 3) {miao2++; if(miao2 > 59) miao2 = 0;}
                }
                while(!keyup);
               
                if(keydown == 0)                                                        //时间减少按键
                {
                        if(c == 1) {if(hour2 != 0) hour2--; else hour2 = 23;}
                        else if(c == 2) {if(min2 != 0) min2--; else min2 = 59;}
                        else if(c == 3) {if(miao2 != 0) miao2--; else miao2 = 59;}                        
                }
                while(!keydown);        
}

int timer() interrupt 3
{
        TH1 = (65536 - 50000)/256;                                        //重新设置T1计数初值高8位
        TL1 = (65536 - 50000)%256;                                        //重新设置T1计数初值低8位
        count++;                                                                                                                //50ms计数器加1
        if(count == 20)                                                                                        //1s时间到
        {
                count = 0;
                if(bm)
                {btime ++;
                }
                miao++;
                if(miao == 60)
                {
                        miao = 0;
                        min++;
                        if(min == 60)
                        {
                                min = 0;
                                hour++;
                                if(hour == 24) hour = 0;
                        }
                }
        }
}

void disp()
{
        unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        if(b == 1)
        {
                P1 = 0x3e; P0 = led[hour/10]; delay(100);
                P1 = 0x3d; P0 = led[hour%10]; delay(100);
        }
        else if(b == 2)
        {
                P1 = 0x3b; P0 = led[min/10]; delay(100);        
                P1 = 0x37; P0 = led[min%10]; delay(100);
        }
        else if(b == 3)
        {        P1 = 0x2f; P0 = led[miao/10]; delay(100);        
                P1 = 0x1f; P0 = led[miao%10]; delay(100);        
        }
        else if((b == 0) && (c == 0))
        {
                dispall();
        }
}

void disp2()
{
        unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        if(c == 1)
        {
                P1 = 0x3e; P0 = led[hour2/10]; delay(100);
                P1 = 0x3d; P0 = led[hour2%10]; delay(100);
        }
        else if(c == 2)
        {
                P1 = 0x3b; P0 = led[min2/10]; delay(100);        
                P1 = 0x37; P0 = led[min2%10]; delay(100);
        }
        else if(c == 3)
        {        P1 = 0x2f; P0 = led[miao2/10]; delay(100);        
                P1 = 0x1f; P0 = led[miao2%10]; delay(100);        
        }
        else if((b == 0) && (c == 0))
        {
                dispall();
        }
}

void dispall()
{
        unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        P1 = 0x2f; P0 = led[miao/10]; delay(100);        
        P1 = 0x1f; P0 = led[miao%10]; delay(100);        
        P1 = 0x3b; P0 = led[min/10];        delay(100);        
  P1 = 0x37; P0 = 0x80; delay(100); P0 = led[min%10]; delay(100);
        P1 = 0x3e; P0 = led[hour/10];        delay(100);
  P1 = 0x3d; P0 = 0x80; delay(100); P0 = led[hour%10]; delay(100);
}

void beep()
{
        if((hour==hour2) && (min==min2) && (miao==miao2) && (d != 0))                                                                                //计数10秒后 P3^6 输出低电平,启动蜂鸣器
        {
                bm = 1;
                beep_b = 0;
        }
        if(btime == 10)
        {
                beep_b = 1;
                bm = 0;
                btime = 0;
                d = 0;
        }
}



24小时制可调闹钟.rar

29.28 KB, 下载次数: 55, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2019-5-9 18:19 | 只看该作者
好东东,能分享下仿真工程文件吗?
回复

使用道具 举报

板凳
ID:448556 发表于 2019-5-13 11:26 | 只看该作者
自己建立一个工程区仿真也可以 的啊
回复

使用道具 举报

地板
ID:537650 发表于 2019-5-14 09:55 | 只看该作者
我是学生能问一下六个数码管是怎么接的吗?
回复

使用道具 举报

5#
ID:564003 发表于 2019-6-16 23:47 | 只看该作者
数码管显示一部分是怎么回事吖
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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