基于单片机的数字电子钟简单

目录

一、 前言---------------------------------------2
二、 硬件原理分析--------------------------2
三、 程序设计--------------------------------4
四、 程序代码--------------------------------4
五、 仿真效果-------------------------------10
六、 参考文献-------------------------------10
七、 学习体会-------------------------------11

一、 前言
<1>利用所学知识设计一个单片机数字电子钟
<2>数字电子钟的功能要求:
(1)有自动计时功能;
(2)能显示计时时间,显示效果良好;
(3)有校时功能,能对时间进行校准
<3>设计要求:
(1)主电路由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校准电路等构成。
(2)秒信号发生器一般用石英晶体振荡器加分频器实现。
(3)译码电路将时、分、秒计数器的输出状态送七段译码器译码,经过六位LED七段显示器显示出来。
(4)校时电路用来对时、分、秒显示数字进行校对。

二、 硬件原理分析
1、时钟信号部分
单片机XTAL1,XTAL2端接外部时钟电路(时钟电路参考课本),EA端接5V电源,使得单片机读取片内程序。基于单片机的数字电子钟简单_第1张图片

2、按键开关部分
开始仿真,按下开关K1,时钟暂停,然后按下开关K2一次,切到调时位,再按K3,K4实现时位加减;按K1两次切到调分位,按K4,K4实现分位加减;按K1三次切到调秒位,按K4,K4实现秒位加减;按下K5,确定当前操作,然后再按K1,重新启动时钟。
基于单片机的数字电子钟简单_第2张图片

3、数码管显示器部分(共阴极)
所用的是一个六位七段共阴极数码管
基于单片机的数字电子钟简单_第3张图片

4、共阴极数码管编码

三、 程序设计

基于单片机的数字电子钟简单_第4张图片

四、 程序代码

#include 
#define uchar unsigned char
#define uint unsigned int
sbit set=P1^0;
sbit save=P1^5;
sbit rselect=P1^1;
sbit lselect=P1^2;
sbit add=P1^3;
sbit reduce=P1^4;

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar disp_buf[6];
uchar disp_bit=0;
uint hour,min,sec;
uint select_num=0;
uint hour_adj,min_adj,sec_adj; 
uchar count;
uchar key_num=0;        
void key_scan()
{                                                   
        if(!set)
        {
                hour_adj=hour;
                min_adj=min;
                sec_adj=sec;
                key_num++;
        }
        while(!set);
        if(key_num%2==1)                
        {
                if(rselect==0)
                {
                        select_num++;
                        if(select_num==4)
                        select_num=1;
                }
                while(!rselect);
                if(lselect==0)
                {
                        select_num--;
                        if(select_num<=0)
                        select_num=3;
                }
                while(!lselect);
        }
        if(!add&&(key_num%2))
        {
                switch(select_num)
                {
                        case 1 :
                        {
                                hour_adj++;
                                if(hour_adj==24)
                                hour_adj=0;
                                break;
                        }
                        case 2 :
                        {
                                min_adj++;
                                if(min_adj==60)
                                min_adj=0;
                                break;
                        }
                        case 3 :
                        {
                                sec_adj++;
                                if(sec_adj==60)
                                sec_adj=0;
                                break;
                        }
                        default:break;
                }
                while(!add);
        }
        if(!reduce&&(key_num%2))
        {
                switch(select_num)
                {
                        case 1 :
                        {
                                hour_adj--;
                                if(hour_adj<=0)
                                hour_adj=23;
                                break;
                        }
                        case 2 :
                        {
                                min_adj--;
                                if(min_adj<=0)
                                min_adj=59;
                                break;
                        }
                        case 3 :
                        {
                                sec_adj--;
                                if(sec_adj<=0)
                                sec_adj=59;
                                break;
                        }
                        default:break;
                }
                while(!reduce);
        }
        if(!save&&(key_num%2))
        {
                select_num=0;
                hour=hour_adj;
                min=min_adj;
                sec=sec_adj;
                while(!save);
        }          
}                
        
void main()
{
        TMOD=0x11;
        TH0=0xf7;
        TL0=0x00;
        TH1=0x4c;
        TH0=0x00;
        ET0=1;
        ET1=1;
        EA=1;
        TR0=1;
        TR1=1;
        PT1=1;
        hour=23;
        min=59;
        sec=59;
        count=0;
        while(1)
        {
                key_scan();
                if(key_num%2)
                {
                switch(select_num)
                {
                        case 1 :
                        {
                                 if(count<=10)
                                {
                                        disp_buf[0]=hour_adj/10;
                                        disp_buf[1]=hour_adj%10;
                                }
                                else
                                {
                                        disp_buf[0]=0x40;
                                        disp_buf[1]=0x40;
                                }
                                disp_buf[2]=min_adj/10;
                                disp_buf[3]=min_adj%10;
                                disp_buf[4]=sec_adj/10;
                                disp_buf[5]=sec_adj%10;
                                break;
                        }
                        case 2 :
                        {
                                 if(count<=10)
                                {
                                        disp_buf[2]=min_adj/10;
                                        disp_buf[3]=min_adj%10;
                                }
                                else
                                {
                                        disp_buf[2]=0x40;
                                        disp_buf[3]=0x40;
                                }
                                disp_buf[0]=hour_adj/10;
                                disp_buf[1]=hour_adj%10;
                                disp_buf[4]=sec_adj/10;
                                disp_buf[5]=sec_adj%10;
                                break;
                        }
                        case 3 :
                        {
                                 if(count<=10)
                                {
                                        disp_buf[4]=sec_adj/10;
                                        disp_buf[5]=sec_adj%10;
                                }
                                else
                                {
                                        disp_buf[4]=0x40;
                                        disp_buf[5]=0x40;
                                }
                                disp_buf[0]=hour_adj/10;
                                disp_buf[1]=hour_adj%10;
                                disp_buf[2]=min_adj/10;
                                disp_buf[3]=min_adj%10;
                                break;
                        }
                        default :         break;
                }
                }
                if(key_num%2==0)
                {
                        disp_buf[0]=hour/10;
                        disp_buf[1]=hour%10;
                        disp_buf[2]=min/10;
                        disp_buf[3]=min%10;
                        disp_buf[4]=sec/10;
                        disp_buf[5]=sec%10;        
                                
                }
        }
}

void timer0() interrupt 1
{
        TH0=0xf7;
        TL0=0x00;
        P2=~(0x01<

五、 仿真效果
基于单片机的数字电子钟简单_第5张图片

六、 参考文献
1. 网上搜索
2. 单片机教材
3. 网上论坛
七、学习体会
通过本次单片机课程设计,不仅加深了我对单片机理论课程知识的认识,而且通过将理论与实践相结合,使我真正地全面理解单片机的功能。 在刚开始编程时,没有一点思路,通过书上所提供的例程,慢慢理清了思路、基本了解了程序大致需要那几部分,基本确定编程思想。在课程设计的整个过程中也遇到了很多问题,但本着遇到问题解决问题的原则,通过查找资料和询问老师、同学的办法,基本解决了所遇到问题。整个课程设计过程学到了不少通过理论学习没法学到的东西,真正增强了自己的能力。
课程设计的这天时间,虽然辛苦但是收获巨大。

你可能感兴趣的:(学生,课设,单片机,电子钟)