微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机可调电子时钟

51单片机可调电子时钟

时间:10-02 整理:3721RD 点击:

1.元件清单

1.STC89C52单片机一块、直插DIP-40插座

2.三位七段共阳数码管LG3631BH型号两块

3.12M晶振一枚

4.蜂鸣器一只

5.S85501PNP三极管一个

6.9脚排阻10K一个

7.1k电阻两个

8.6脚自锁式开关3个、4脚按钮开关3个

9.2个3V纽扣电池及其电池座两个

10.发光二极管1支

11.瓷片电容30pf两片

12.芯片74HC245两片

2.电路图

file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-3244.png

Proteus仿真图

3.实物图

file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-29706.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-32753.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-5034.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-31203.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-19450.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-19622.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-5693.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-1365.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-2150.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-12882.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-28323.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-20768.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-21068.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-18446.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-24933.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-12860.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-783.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-14528.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-2202.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-18933.png

file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-10267.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-18488.png

file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-5291.png

手工焊接实物图

4.操作说明

如上图实物图所示,按下电源开关后,电源指示灯亮,数码管从00.00.00开始走秒显示;按下单片机右边的上方自锁开关,时钟进入时间校准状态,通过第一个按钮开关切换秒、分、时部分的设置,中间按钮开关对相应部分进行加1调整,右边按钮开关对相应部分进行减1调整,设置完后将自锁式开关按起,回到正常的工作状态;同理,按下下方的自锁式开关,时钟进入时间校准状态。

5.基本原理

本次电子时钟项目设计对单片机定时器0装初值,使其初值对应50ms,定时器0的中断次数达到20次酒钢好为1s,当秒部分计数到60时置零,并向分部分进一;当分部分计数到60时置零,并向时部分进一,当时部分计数到24时置零,从而满足时钟的正常工作。        本次设计设置5个键依次对其进行时间校准设置、定时设置、秒分时切换、加1调整、减1调整。当时间校准设置键被按下,关闭T0定时器,时钟停止工作,此时数码管显示的即为当前时间校准设置的界面,设置好后,打开T0定时器,时钟在设置好的时刻上继续走秒工作;当定时设置键被按下,将当前的时刻赋给定时前的时分秒时刻变量,并将数码管显示切换到定时设置界面进行设置(此时的时钟仍在继续正常工作,只是在定时设置时没病显示出来罢了),当设置好后,记下要定时的时刻,数码管显示又还原到时钟正常工作的界面;当正常工作的时钟时刻到达了预置的定时时刻,蜂鸣器发声警报。

6.元器件介绍

相信你们对这上面的元器件都了解,我就不再赘述,主要讲一下就是74HC245芯片,

总线收发器(bus transceiver),典型的CMOS型三态缓冲门电路。   由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。另外,也可以使用74HC244等其他电路,74HC244比74HC245多了锁存器。

  file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-21407.png

  

74HC245实物图:

file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-27079.png

引脚定义:

第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。   

第2~9脚“A”信号输入输出端,A0=B0、、、、、、A7=B7,A0与B0是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。   

第11~18脚“B”信号输入输出端,功能与“A”端一样,不再描述。   第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。   

第10脚GND,电源地。   

第20脚VCC,电源正极。   

TRUTH TABLE真值表

file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-11896.png

H=高电平 L=低电平 ×=不定

Absolute Maximum Ratings绝对最大额定值

Supply Voltage电源电压(VCC)

-0.5 to -7.0V   

DC Input Voltage DIR and G pins (VIN) 直流输入电压方向和G引脚(输入电压)

-1.5 to VCC -1.5V   

DC Input/Output Voltage (VIN, VOUT)直流输入/输出电压

-0.5 to VCC -0.5V

Clamp Diode Current 钳位二极管电流(ICD)

±20 mA

DC Output Current直流输出电流,每个引脚(输出)   

±35 mA   

DC VCC or GND Current, per pin (ICC)   

±70 mA   

Storage Temperature Range 储存温度范围(TSTG)   

-65℃ to -150℃   

Power Dissipation (PD)功耗

(Note 3)   

600 mW   

S.O. Package only   

500 mW   

Lead Temperature (TL) (Soldering 10 seconds)   

260℃

74HC245的作用:信号功率放大。

   第1脚DIR,为输入输出端口转换用, DIR=“1”高电平时信号由“A”端输入“B”端输出, DIR=“0”低电平时信号由“B”端输入“A”端输出。第2~9脚“A”信号输入输出端,A1=B1﹑﹑﹑﹑﹑﹑A8=B8,A1与B1是一组,如果 DIR=“1”G=“0”则A1输入B1输出,其它类同。如果DIR=“0”G=“0”则B1输入A1输出,其它类同。 第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。第19脚G,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B 端才被启用,该脚也就是起到开关的作用 第10脚GND,电源地。第20脚VCC,电源正极。

7.程序代码

/***************************************************

东方智达科技www.east027.com

淘宝店铺:http://east027.taobao.com

        具有闹钟功能的电子时钟程序设计,晶振为11.0592M

***************************************************/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int          

sbit s1=P2^0;                  //数码管位选控制端

sbit s2=P2^1;

sbit s3=P2^2;

sbit s4=P2^3;

sbit s5=P2^4;

sbit s6=P2^5;

sbit s7=P2^6;

/*k1设置时间,k2定时。k1,k2使用不自动弹起按键。

k3时分秒选择,k4加数字,k5减数字。*/

sbit k1=P1^0;          

sbit k2=P1^1;

sbit k3=P1^2;

sbit k4=P1^3;

sbit k5=P1^4;

uchar count=0,sec,min,hour,ss=0;s=60,m=60,h=24;

uchar code mum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9编码

void delayms(uint k)           //延时函数

{

        uint i,j;

        for(i=k;i>0;i--)

                for(j=110;j>0;j--);

}

/*通过count获得hour,min,sec变量值        */

void timecontrol()       

{

        sec++;

        if(sec==60)

        {

                sec=0;

                min++;

                if(min==60)

                {

                        min=0;

                        hour++;

                        if(hour==24)

                        hour=0;

                }

        }

}

void display(uchar zs,uchar zm, uchar zh)                        //数码管显示函数

{         

  s1=1;

  P0=mum[zh/10];

  delayms(5);

  s1=0;

   

  s2=1;

  P0=mum[zh%10]&0x7f;           // 时的个位加上小数点

  delayms(5);

  s2=0;

   

  s3=1;

  P0=mum[zm/10];       

  delayms(5);

  s3=0;

  

  s4=1;

  P0=mum[zm%10]&0x7f;                //分的个位加上小数点

  delayms(5);

  s4=0;

   

  s5=1;

  P0=mum[zs/10];

  delayms(5);

  s5=0;

   

  s6=1;       

  P0=mum[zs%10];

  delayms(5);

  s6=0;

}

void keyscan_settime()                  //时间设置模块

{

        uchar st,mt,ht;

        if(k1==0)

        {

                delayms(10);

                if(k1==0)

                {

                st=sec,mt=min,ht=hour;

                TR0=0;                 //关闭定时器

                while(k1==0)         //等待用户按键

                {

                        display(st,mt,ht);                       

                        if(k3==0)

                        {

                                delayms(10);

                                if(k3==0)          

                                {

                                while(!k3);

                                ss++;

                                if(ss==3)        ss=0;

                                }

                        }

                        /*通过ss选择时分秒设置*/

                        if(k4==0)                //加数

                                {

                                         delayms(10);

                                        if(k4==0)

                                        {

                                        while(!k4);

                                        switch(ss)

                                        {

                                        case 0:st++;if(st==60)st=0;break;

                                        case 1:mt++;if(mt==60)mt=0;break;

                                        case 2:ht++;if(ht==24)ht=0;break;       

                                        default :;                                               

                                        }

                                        }       

                                }

                        if(k5==0)                //减数

                                {

                                         delayms(10);

                                        if(k5==0)

                                        {

                                        while(!k5);

                                        switch(ss)

                                        {

                                        case 0:if(st>0)st--;

                                                        else        st=0;break;

                                        case 1:if(mt>0)mt--;

                                                        else        mt=0;break;

                                        case 2:if(ht>0)ht--;

                                                        else        ht=0;break;       

                                        default : ;

                                        }                                                                                                                                       

                                        }       

                                }

                                }

                        TR0=1;

                        sec=st,min=mt,hour=ht;                                                       

                        }                                               

                }               

                display(sec,min,hour);

}

void keyscan_time()                //用户定时模块

{

        if(k2==0)

        {

                delayms(10);               

                if(k2==0)

                {

                s=sec;m=min;h=hour;

                while(k2==0)         //开始定时设置

                {

                        display(s,m,h);

                        if(k3==0)

                        {

                                delayms(10);

                                if(k3==0)          

                                {

                                while(!k3);

                                ss++;

                                if(ss==3)        ss=0;

                                }

                        }

                        /*通过ss选择时分秒设置*/

                        if(k4==0)                //加数

                                {

                                         delayms(10);

                                        if(k4==0)

                                        {

                                        while(!k4);

                                        switch(ss)

                                        {

                                        case 0:s++;if(s==60)s=0;break;

                                        case 1:m++;if(m==60)m=0;break;

                                        case 2:h++;if(h==24)h=0;break;       

                                        default :;                                               

                                        }

                                        }       

                                }

                        if(k5==0)                //减数

                                {

                                         delayms(10);

                                        if(k5==0)

                                        {

                                        while(!k5);

                                        switch(ss)

                                        {

                                        case 0:if(s>0)s--;

                                                        else        s=0;break;

                                        case 1:if(m>0)m--;

                                                        else        m=0;break;

                                        case 2:if(h>0)h--;

                                                        else        h=0;break;       

                                        default : ;

                                        }                                                                                                                                                }       

                                        }

                                }                                               

                        }

        }

}

void buz()

{

if((hour==h)&&(min==m)&&(sec==s))

        {

        s7=0;

        delayms(20);

        s7=1;

        }

}

void main()

{

        TMOD=0x01;                                //定时器0工作在方式1

        TH0=(65536-45872)/256;           //装初值,50ms

        TL0=(65536-45872)%256;

        EA=1;                  //总中断允许

        ET0=1;                 //T0中断允许

        TR0=1;                 //开定时器0

        while(1)

        {

                keyscan_settime();

                keyscan_time();       

                buz();       

        }

}

void T0_ms() interrupt 1          //中断入口程序

{

        TH0=(65536-45872)/256;                //重新装初值

        TL0=(65536-45872)%256;

        count++;

        if(count==20)                 //判定1s时间是否已到

        {

                count=0;

                timecontrol();

        }

}

武汉东方智达:www.east027.com

淘宝店网址:http://east027.taobao.com

联系电话:027-87660996

QQ:836730083


最近也在搞这个

ddddddddddd

实物图看不到

学习

顶一下

感觉程序有欠缺。不过还是顶一下。

1234567890

为什么没有图片?

顶你

怎么没有焊接实物图!

你可以的

程序不行啊

欲取先予

看卡巴

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top