ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单片机电子时钟的设计(期末课程设计)

2020-07-11 13:04:14  阅读:279  来源: 互联网

标签:10 课程设计 min int delayms P0 单片机 DU 时钟


题目一、单片机电子时钟的设计

设计一个时钟,可以正常显示时分秒,也可以通过按键改变分钟和小时,且有整点提醒功能

1、能够正常计时并且能够显示小时、分钟、秒,10

(1)正常显示秒,2分

(2)正常显示分,2分

(3)正常显示时,2分

(4)秒进位至分正常,2分

(5)分进位至小时正常,1分

2、可以通过按键正常更改小时和分钟(4个按键都要用到),以及蜂鸣器在整点要发出响声,5

(1)实现分钟正常(更改过程中显示数字在0-59范围以内)加减,2分

(2)实现小时正常(更改过程中显示数字在0-23范围以内)加减,2分

(3)蜂鸣器在整点会响(提示:单片机P2.3管脚为0时,蜂鸣器会响。为1时则不响),2分 

提问环节:教师提问有关电子时钟的3个问题,根据学生回答情况给分,每个问题5分,满分15

使用的单片机:

参考代码:

// hill20200709
#include<reg52.h>
#include<intrins.h> //左右移函数头文件
#define uchar unsigned char //变量声明
#define uint unsigned int
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;

sbit buzzer=P2^3; 

sbit DU =P2^6;     //位声明DU
sbit WE =P2^7;  //位声明WE
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

int s=0; 
int min=0;
int h=0;

void delayms(uint xms)
{
    uint i,j;
    for(i=xms;i>0;i--)    
        for(j=110;j>0;j--);
}

void dispNum(int h, int min, int s){
    int m2 = min/10; //十位
    int m1 = min%10; //个位
    
    int s2 = s/10;
    int s1 = s%10;

    int h2 = h/10;
    int h1 = h%10;
    
    DU=1;
    P0=table[h1];
    DU=0;
    WE=1;
    P0=0xfd;  //1111 1101 第2
    WE=0;
    delayms(2);

    DU=1;
    P0=table[h2];
    DU=0;
    WE=1;
    P0=0xfe;  //1111 1110 第1
    WE=0;
    delayms(2);

    DU=1;
    P0=table[m1];
    DU=0;
    WE=1;
    P0=0xf7;  //1111 0111 第4
    WE=0;
    delayms(2);
    
    DU=1;
    P0=table[m2];
    DU=0;
    WE=1;
    P0=0xfb;//1111 1011 第3
    WE=0;
    delayms(2);
    
    
    DU=1;
    P0=table[s1];
    DU=0;
    WE=1;
    P0=0xdf;  //1101 1111 第6
    WE=0;
    delayms(2);
    
    DU=1;
    P0=table[s2];  
    DU=0;
    WE=1;
    P0=0xef;//1110 1111 第5
    WE=0;
    delayms(2);

    //P0=0xff; //解决调用其他函数时5号数码管常亮
}

//key函数
void key(){
    if (key1==0){  //adjust hour -plus
        delayms(10); //10ms
        if (key1==0){
            h++;
            if(h==24){
            h=0;
            }
        while(!key1); //没弹起就在空循环里面,所以按下数字显示不全
        }
    }
    
    if (key2==0){ //adjust hour -minus
        delayms(10); //10ms
        if (key2==0){
            h--;
            if(h==-1){
            h=23;
            }
        while(!key2); //没弹起就在空循环里面,所以按下数字显示不全
        }
    }
        if (key3==0){ //adjust min -plus
        delayms(10); //10ms
        if (key3==0){
            min++;
            if(min==60){
            min=0;
            }
        while(!key3); //没弹起就在空循环里面,所以按下数字显示不全
        }
    }


        if (key4==0){ //adjust min -minus
        delayms(10); //10ms
        if (key4==0){
            min--;
            if(min==-1){
            min=59;
            }
        while(!key4); //没弹起就在空循环里面,所以按下数字显示不全
        }
    }
}
void soundTime(int time){
    buzzer=0;
    delayms(time);
    buzzer=1;
}

void main()
{

    TMOD=0x01;  //TMOD的值表示定时器工作方式选择
    TH0=(65536-45872)/256; //数装入TH0寄存器
    TL0=(65536-45872)%256; //数装入TL0寄存器
    EA=1;  //开总中断
    ET0=1; //允许定时器0中断
    TR0=1; //开始计数

    while(1) //下面是个死循环,程序里每运行一步TH0和TL0都会增加
    {
        dispNum(h,min,s);
        key();
        if(num==20)
        {
            num=0;
            s++;
            //soundTime(10);  //检查函数 check function
            if(s==60){
                s=0;
                min++;
                if(min==60){
                    min=0;
                    h++;
                    soundTime(500); //buzzer
                    if(h==24){
                        h=0;
                    }
                }
            }    
        }
    }



}

void T0_time() interrupt 1
{
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    num++;
}

 

本人单片机初学者,多多关照!文章内容肯定有不当之处,敬请指出改正。

标签:10,课程设计,min,int,delayms,P0,单片机,DU,时钟
来源: https://www.cnblogs.com/hillxu/p/13283205.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有