精华内容
下载资源
问答
  • 本文主要对51单片机时钟电路原理图进行了解析,下面一起来学习一下
  • 01在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部...
  • 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部...
  • 在 MCS-51 单片机片内有一个高增益的反相放大器,反相放大器的输入端为 XTAL1,输出端为 XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为...
  • 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部...
  • 本文主要讲了51单片机复位电路原理,下面一起来学习一下
  • 基于51单片机电子时钟
  • 自己上课做的实验,用51单片机实现时钟,用Proteus进行仿真。
  • 这是基于51单片机时钟电路的原理图 对于喜欢单片机的朋友很有帮助
  • 51单片机 时钟、闹钟 源代码及proteus电路图 实验课自写代码,代码文件名称未改,内容没问题
  • 51单片机时钟电路(LCD1602显示)完整源码与仿真,适用于51单片机初学者
  • 本文主要为51单片机数码管动态时钟电路图,下面一起来学习一下
  • 基于51单片机的简单时钟电路

    千次阅读 2019-12-08 11:53:02
    /*时钟调位和数值加一功能*/ if(Key2==0) { Delay(10); if(Key2==0) while(!Key2); j++; j=j%3; //让j在0,1,2之间循环 } if(j==0) //调节秒钟 { if(Key3==0) { Delay(10); if(Key3...

    1.实现功能:日期、时间显示功能,定时功能
    2.所用器件:89C52最小系统,按键,LED灯,八位七段数码管,74ls138,74ls245
    3.各部分功能:138:选择数码管的位置,245:驱动数码管显示字符,按键依次是:调整位数,暂停时间,调整个数,切换显示功能(时间,日期,定时)
    4.

    ``

    #include<reg52.h>

    #define uChar unsigned char

    #define uInt unsigned int

    uChar
    a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选表 共阴极

    uChar
    b[8]={0xff,0xfb,0xf7,0xf3,0xef,0xeb,0xe7,0xe3}; //为选表 共阴极

    uChar
    second=10,minute=25,hour=12,year=19,month=11,day=21,count,timinghour=12,timingminute=13;

    sbit Key1 = P3^1; //计时停止

    sbit Key2 = P3^0; //调位

    sbit Key3 = P3^2; //加一

    sbit Key4 = P3^3; //切换

    sbit Buzzer = P3^4; //报警器

    /*延迟函数/

    void Delay(uInt t)

    {

       while(t)
    
       {
    
              t--;
    
       }
    

    }

    /**时,分,秒显示函数/

    void Dispaly1(uChar second,uChar
    minute,uChar hour) //秒,分,时

    {

    /第一位数码管/

    P2=b[0]; //选择数码管

    P0=a[hour/10]; //显示小时的十位

    Delay(200); //延时

    /第二位数码管/

    P2=b[1];

    P0=a[hour%10]; //显示小时的个位

    Delay(200);

    /第三位数码管/

    P2=b[2];

    P0=0x40; //显示分隔符

    Delay(200);

    /第四位数码管/

    P2=b[3];

    P0=a[minute/10]; //显示分钟的十位

    Delay(200);

    /第五位数码管/

    P2=b[4];

    P0=a[minute%10]; //显示分钟的个位

    Delay(200);

    /第六位数码管/

    P2=b[5];

    P0=0x40; //显示分隔符

    Delay(200);

    /第七位数码管/

    P2=b[6];

    P0=a[second/10]; //显示秒钟的十位

    Delay(200);

    /第八位数码管/

    P2=b[7];

    P0=a[second%10]; //显示秒钟的个位

    Delay(200);

    }

    /*年,月,日显示函数/

    void Dispaly2(uChar day,uChar month,uChar
    year) //日,月,年

    {

    P2=b[0]; //选择数码管

    P0=a[day/10]; //显示日的十位

    Delay(200);
    //延时

    P2=b[1];

    P0=a[day%10]; // 显示日的个位

    Delay(200);

    P2=b[2];

    P0=0x40; //显示分隔符

    Delay(200);

    P2=b[3];

    P0=a[month/10]; //显示月的十位

    Delay(200);

    P2=b[4];

    P0=a[month%10]; //显示月的个位

    Delay(200);

    P2=b[5];

    P0=0x40; //显示分隔符

    Delay(200);

    P2=b[6];

    P0=a[year/10]; //显示年的十位

    Delay(200);

    P2=b[7];

    P0=a[year%10]; //显示年的个位

    Delay(200);

    }

    /时钟按键扫描函数/

    void Keyscan1()

    {

       static
    

    uChar i=0,j=0; //定义两个内部静态变量i和j

       if(Key1==0)
                                            //扫描按键k1按下一次i变量加一
    
       {
    
              Delay(10);
                                              //消抖 
    
              if(Key1==0)
    
    
              while(!Key1);                                     //等待按键弹开
    
              i++;
    
              i=i%2;                                                       //让i在0和1之间循环
    
       }
    
       /*时钟暂停功能*/
    
       if(i==1)
    
    
       {
    
              TR0=0;                                                    //如果是1按键自然关闭定时器0
    
       }
    
       if(i==0)
    
       {
    
              TR0=1;                                                    //如果是0按键则打开定时器0
    
       }
    
       /*时钟调位和数值加一功能*/
    
       if(Key2==0)
    
    
       {
    
              Delay(10);
    
    
              if(Key2==0)
    
              while(!Key2);
    
              j++;
    
              j=j%3;                                                       //让j在0,1,2之间循环 
    
       }
    
       if(j==0)                                                    //调节秒钟
    
       {
    
              if(Key3==0)
    
              {
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     second++;
    
                     if(second==60)
    
                     second=0;
    
              }
    
       }
    
       if(j==1)                                                    //调节分钟
    
       {
    
              if(Key3==0)
    
              {
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     minute++;
    
                     if(minute==60)
    
                     minute=0;
    
    
              }
    
       }
    
       if(j==2)                                                    //调节时钟
    
       {
    
              if(Key3==0)
    
              {
    
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     hour++;
    
                     if(hour==24)
    
                     hour=0;
    
    
              }
    
       }
    

    }

    /日期按键扫描函数/

    void Keyscan2()

    {

       static
    

    uChar m=0,n=0; //定义两个内部静态变量

       if(Key1==0)
    
    
       {
    
              Delay(10);
    
    
              if(Key1==0)
    
              while(!Key1);
    
              m++;
    
              m=m%2;                                       //让m在0和1之间循环
    
       }
    
       if(m==1)
    
    
       {
    
              TR0=0;                                      /*奇数次按键则关闭定时器0*/
    
       }
    
              if(m==0)
    
       {
    
              TR0=1;                                      /*偶数次按键则打开定时器0*/ 
    
       }
    
       if(Key2==0)
    
    
       {
    
              Delay(10);
    
    
              if(Key2==0)
    
              while(!Key2);
    
              n++;
    
              n=n%3;
                                //让n在0,1,2之间循环
    
       }
    
       /*日期调位和日期加一功能*/
    
       if(n==0)                                            //调节日期
    
       {
    
              if(Key3==0)
    
              {
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     day++;
    
                     if(day==30)
    
                     day=0;
    
              }
    
       }
    
       if(n==1)                                 //调节月份
    
       {
    
              if(Key3==0)
    
              {
    
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     month++;
    
                     if(month==12)
    
                     month=0;
    
    
              }
    
       }
    
       if(n==2)                               //调节年份
    
       {
    
              if(Key3==0)
    
              {
    
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     year++;
    
                     if(year==99)
    
                     year=0;
    
    
              }
    
       }
    

    }

    /定时按键扫描函数/

    void Keyscan3()

    {

       static
    

    uChar j=0; //定义两个内部静态变量i和j

       /*定时调位和数值加一功能*/
    
       if(Key2==0)
    
    
       {
    
              Delay(10);
    
    
              if(Key2==0)
    
              while(!Key2);
    
              j++;
    
              j=j%2;                                                       //让j在0,1之间循环 
    
       }
    
       if(j==0)                                                    //调节小时
    
       {
    
              if(Key3==0)
    
              {
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     timinghour++;
    
                     if(timinghour==24)
    
                     timinghour=0;
    
              }
    
       }
    
       if(j==1)                                                    //调节分钟
    
       {
    
              if(Key3==0)
    
              {
    
                     Delay(10);
    
    
                     if(Key3==0)
    
                     while(!Key3);
    
                     timingminute++;
    
                     if(timingminute==60)
    
                     timingminute=0;
    
    
              }
    
       }
    

    }

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

    /主函数************/

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

    void main()

    {

       TMOD=0x01;
                                        /*定时器以方式一工作*/
    
       TH0=(65536-10000)/256;
    
       TL0=(65536-10000)%256;                  /*10ms计时*/
    
       EA=1;                                               
    

    //允许打开中断

       ET0=1;                                              /*允许定时器0中断*/
    
       TR0=1;                                             /*打开定时器0*/
    
       while(1)
    
       {
    
              static
    

    uChar h=0; //定义内部静态变量

              /*时钟和日期切换功能*/ 
    
              if(Key4==0)
    
    
              {
    
                     Delay(10);
    
    
                     if(Key4==0)
    
                     while(!Key4);
    
                     h++;
    
                     h=h%3;
    
              }
    
              if(h==0)/*如果按键为0则显示时钟*/
    
              {
    
                     Dispaly1(second,minute,hour);
    
                     Keyscan1();
    
    
              }
    
              
    
              if(h==1)/*如果按键为1则显示日期*/ 
    
              {
    
                     Dispaly2(year,month,day);
    
                     Keyscan2();
    
              }
    
    
    
              if(h==2)
    

    /如果按键为2则显示闹钟时间/

              {
    
                     Dispaly1(00,timingminute,timinghour);
    
                     Keyscan3();
    
              }
    
       }
    

    }

    /中断函数****/

    void time0_int(void) interrupt 1

    {

       TH0=(65536-10000)/256;
    
       TL0=(65536-10000)%256;
    
       count++;
    
       if(count==100)/*每一秒计时一次*/
    
       {
    
              count=0;                              //每一秒将count清零一次
    
              second++;                                   //秒钟计时
    
              if(second==60)                            //满60秒产生分钟计时
    
              {
    
                     second=0;                           //秒钟清零
    
                     minute++;                           //分钟加一
    
                     if(minute==60)                     //满60分钟产生小时计时
    
                     {
    
                            minute=0;                   //分钟清零
    
                            hour++;                      //小时加一
    
                            if(hour==24)          //满24小时产生天数计时
    
                            {      
    
                                   hour=0;                //小时清零
    
                                   day++;                   //天数加一
    
                                   if(day==30)           
    

    //满30天产生月进位

                                   {
    
                                          day=0;            
    

    //天数清零

                                          month++;        //月数加一
    
                                          if(month==12)      //满12月产生年进位
    
                                          {
    
                                                 month=0;      //月数清零
    
                                                 year++;         //年数加一
    
                                                 if(year==99)  //满99直接清零
    
                                                 {
    
                                                        year=0;
    
                                                 }
    
                                          }
    
                                   }
    
                            }
    
                     }
    
              }
    
       }
    
       /*判断整点提醒*/
    
       if((hour==timinghour)&&(minute==timingminute))                                                    
    
       Buzzer=1;
    
       else
    
       Buzzer=0;
    

    }

    ``

    5仿真:在这里插入图片描述

    展开全文
  • 单片机时钟电路

    万次阅读 2019-08-15 08:08:00
    首先,单片机能正常工作的必要条件之一就是时钟电路,所以单片机就很需要晶振。  晶振,全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机...

     

    首先,单片机能正常工作的必要条件之一就是时钟电路,所以单片机就很需要晶振。

      晶振,全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。

    单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。—个机器周期包括12个时钟周期。如果一个单片机选择了12兆赫兹晶振,它的时钟周期是1/12us,它的一个机器周期是12×(1/12)us,也就是1us。

     MCS—51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较馒,得要2个机器周期,还有两条指令要4个机器周期才行。为了衡量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。例如,当需要计算DJNZ指令完成所需要的时间时,首先必须要知道晶振的频率,设所用晶振为12兆赫兹,则一个机器周期就是1us。而DJNZ指令是双周期指令,所以执行一次要2us。如果该指令需要执行500次,正好1000us,也就是1ms。

      机器周期不仅对于指令执打有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。例如一个单片机选择了12兆赫兹晶振,那么当定时器的数值加1时,实际经过的时间就是1us,这就是单片机的定时原理。

      晶振是给单片机提供工作信号脉冲的。这个脉冲就是单片机的工作速度。比如12兆晶振。单片机工作速度就是每秒12兆。单片机内部也有晶振。接外部晶振可以或得更稳定的频率.

    转载于:https://www.cnblogs.com/yuanqiangfei/p/11355758.html

    展开全文
  • 51单片机时钟电路详细资料说明
  • 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。电子学习资料大礼包​mp.weixin.qq.com在MCS-51单片机片...

    a4ef453dcdd48250ab1f7670ad14cb0e.png
    在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。
    电子学习资料大礼包​mp.weixin.qq.com

    在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如下图所示。

    ba7ba641245c9bc4174c99a039e7b740.png

    时钟电路:(a)内部方式时钟电路,(b)外接时钟电路

    在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。对于外接时钟电路,要求XTAL1接地,XTAL2脚接外部时钟,对于外部时钟信号并无特殊要求,只要保证一定的脉冲宽度,时钟频率低于12MHz即可。

    晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号P1和P2供单片机使用。时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。CPU就是以两相时钟P1和P2为基本节拍协调单片机各部分有效工作的。

    394339f7f1f11287183dbfe847630b4f.png

    MCS-51片内有一个高增益反相放大器,其输入端(XTAL1)和输出端(XTAL2)用于外接石英晶体和微调电容,构成振荡器,如图所示。电容C2和C3对频率有微调作用,电容容量的选择范围一般为30pF士10pF。振荡频率的选择范围为1.2~12MHz。

    在使用外部时钟时,8051的XTAL2用来输入外时钟信号,而XTAL1则接地。

    a4d8b5715bbfbfe195d66fce295bc907.png

    上图为时钟电路的原理图。分为最小单片机系统、单片机复位电路、按键电路、数码管位选电路、数码管段选电路、数码管显示电路、蜂鸣器电路、温度采集电路。

    使用单片机的P2口进行数模的输出,P1^4、P1^5、P1^6与74HC138连接实现数码管位选,按键电路接入P1^0、P1^1、P1^2、P1^3四个IO口,通过程序控制,扫描该四个引脚的信号实现时间的调节。

    蜂鸣器通过与三极管8550连接,最终接入P1^7,时间设定启动使其发声。温度传感器接入P3^7,将采集到的模拟信号转化为数字信号后传到单片机。

    ATmega16单片机的时钟电路和输出I/O电路

    326fe71b38bb2c0a4b3435c0669935d7.png

    按键处理设置为:当有没键按下时,时钟正常运行;当按一次K1,时钟停止走动,按K2对秒进行调整;当K1按2次时,按K2对分进行调整;当K1按下3次时,按K2对小时进行调整,当按下4次K1时,校时完毕,时钟按设定的时间进行正常走时。

    当按1次K3进入闹钟设置界面,时钟继续进行走时,按K2对秒进行设置;当按2次K3,按K2对分进行设置;当按3次K3,按K2对秒进行设置;当按下4次K3时,闹钟设置完毕进入时钟显示界面。电路图如下:

    1651ac04ced11564b053e20c6e82024d.png

    独立按键电路

    单片机利用外部12MHZ晶振构成振荡电路作为时钟源,时钟电路的原理如下图。

    dfac9a4959d4f415395d866f1d299511.png

    52070162b99dd1b9d4381261ba639487.png

    P10控制调时分秒的哪一位,P11调时分秒的加,P12按下显示时间,P13按下显示闹铃,P14按下显示秒表,并且P14还是秒表的暂停和复位开关。

    展开全文
  • 单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是...
  • 基于51单片机电子时钟

    万次阅读 多人点赞 2019-01-05 21:39:20
    1 基于51单片机用LCD1602实现时-分的显示 2. 按键控制时-分的调整 3. 能实现整时报时的功能(蜂鸣器响) 4. 闹钟模式 5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时) 一、设计思路: 主体: 通过外部中断...

    keil工程与protues仿真电路

    1 基于51单片机用LCD1602实现时-分的显示
    2. 按键控制时-分的调整
    3. 能实现整时报时的功能(蜂鸣器响)
    4. 闹钟模式
    5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时)

    一、设计思路:
    主体:
    通过外部中断0来控制mod值;mod=0,1.2,3分别对应时钟模式,调整模式,闹钟设置模式,一分钟倒计时模式。
    细节:
    mod0
    通过定时计数器,每一秒增加变量秒(s),每60秒,增加1分(min)并且s置0,每60min,增加1小时h,当h>23,h=0;进行一天循环
    mod1
    按键控制增加min,h和s制0
    mod2
    另外设置变量min1,h1,当min=min1,h=h1时蜂鸣器响
    mod3
    设置变量daojishi=60, 通过定时计数器,每一秒daojishi减1,当daojishi<0时,蜂鸣器响
    另外:
    1.设置外部中断2,关闭蜂鸣器
    2.时间发送一次只能发送一个位

    程序:

    #include<reg52.h>
    //K1后K3加分钟,K4加时间,K2加秒,K1进入闹钟设置,K2退出
    //K2关闭闹钟
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    #define data8b P1
    
    sbit K1=P3^2;               //外部中断0
    sbit K2=P3^3;               //外部中断1
    sbit K3=P3^0;
    sbit K4=P3^1;
    
    sbit BUZ=P2^4;       //蜂鸣器,0响
    sbit RW=P2^5;        //4脚,数据(1)or命令(0)
    sbit RS=P2^6;        //5脚,读(1)写(0)
    sbit E=P2^7;         //6脚,使能信号
    
    u8 code dat1[]={0X30,0X31,0X32,0X33,
    	                               0X34,0X35,0X36,0X37,
    	                               0X38,0X39};
    
    void delay(u16 i)      //延时函数
    {
    	while(i--);
    }
    
    void open012()   //打开中断0,1,定时器中断0
    {
    	TMOD|=0X01;   //选择为定时器0模式,工作方式1
      
    	
    	ET0=1;        //打开定时器0中断允许
    	
    	EA=1;        //打开总中断
    	
    	TR0=1;       //打开定时器			
    	
    	EX0=1;              //打开外部中断0
    	IT0=1;             //边沿触发方式
    	EX1=1;              //打开外部中断1
    	IT1=1;             //边沿触发
      
    }
    
    
    void wrm(u8 dat)              //写入命令
    {
    	delay(1000);
    	RS=0;
    	RW=0;
    	E=0;
    	data8b=dat;
    	E=1;
    	delay(1000);
    	E=0;
    }
    
    
    void wrd(u8 dat)             //写入数据
    {
    	delay(1000);
    	RS=1;
    	RW=0;
    	E=0;
    	data8b=dat;
    	E=1;
    	delay(1000);
    	E=0;
    }
    
    void zero()
    {
    	wrm(0X38);                 //八位数据,两行显示,5*7
    	wrm(0X0c);                  //无光标,打开显示
    	wrm(0X06);                  //光标右移,屏幕不移动
    	wrm(0X01);                  //清屏
    	wrm(0X80);                  //设置数据指针起点
    }
    
    u8 fg=0,sg=0,bfg=0,bsg=0;
    u16 i=0;
    u8 s=0;
    u8 mod=0;
    char dingshi;
    bit bell=0;
    bit zanting=1;
    
    void fangsong()
    {
      wrd(dat1[sg/10]);                 //时十位
    	wrd(dat1[sg%10]);                 //时个位
    	wrd(0x3A);                     //:
    	wrd(dat1[fg/10]);                 //分十位
    	wrd(dat1[fg%10]);                 //分个位
    	wrd(0x3A);                     //:
    	wrd(dat1[(s/10)]);                 //秒十
    	wrd(dat1[(s%10)]);                 //秒个
    }
    
    
    void fangsong1()
    {
    	wrm(0X80);   
      wrd(dat1[sg/10]);                 //时十位
    	wrd(dat1[sg%10]);                 //时个位
    	wrd(0x3A);                     //:
    	wrd(dat1[fg/10]);                 //分十位
    	wrd(dat1[fg%10]);                 //分个位
    	wrd(0x3A);                     //:
    	wrd(dat1[(s/10)]);                 //秒十
    	wrd(dat1[(s%10)]);                 //秒个
    }
    void chuli()
    {
    	if(fg==60)
    	{
    		sg++;
    		fg=0;
    	}
    
    	if(sg==24)
    	{
    	
    		sg=0;
    	}
    	
    }
    
    
    
    void main()
    {
    	u8 shijian;
    	open012();
    	zero();
    	chuli();
    	fangsong();
    	shijian=100;
    	
    	
    	while(1)
    	{
    		while(mod==0)
    	{
    		EX1=1;              //打开外部中断1
    		if(s==60)
    		 {
    			 fg++;       //60秒转化为1分钟
    			 s=0;
    		 }
    				chuli();
    				if((fg==0)&&(shijian!=sg))
    				 {
    				  BUZ=0;
    					shijian=sg;
    				 }
    				fangsong1();
    				if((BUZ==0)&&(bell==0))
    			  {
    				delay(1000);
    				BUZ=1;
    			  }
    			if((fg==bfg)&&(sg==bsg)&&(bell==1))
    				BUZ=0;
    			else BUZ=1;
    			}
    	
    	
    			
    			while(mod==1)
    		{
    			EX1=0;              //关闭外部中断1
    			zero();
    	    fangsong();
    			if(K3==0)
    			  {
    				  delay(1000);
    				  if(K3==0)
    					  fg++;
    			   }
    			if(K4==0)
    			   {
    				  delay(1000);
    				  if(K4==0)
    					 sg++;
    			   }
    				 if(K2==0)
    			   {
    				  delay(1000);
    				  if(K2==0)
    					 s=0;
    			   }
    				 if(fg>59)
    				 {
    					 fg=0;
    				 }
    				  if(sg>23)
    				 {
    					 sg=0;
    				 }
    				 if(s>=59)
    				 {
    					 s=0;
    				 }
    	     }
    		
    			 
    			 
    			 while(mod==2)   //设置闹钟
    		{
    	    if(bfg==60)
    	    {
    		    bsg++;
    		    bsg=0;
    	    }
    	
    	    if(bsg==24)
    	    {
    		     bsg=0;
    	     }
    	    zero();
    			wrd(0x20);
    			wrd(0x20);
    			wrd(0x20);
    		  wrd(dat1[(bsg/10)]);                 //时十位
    	    wrd(dat1[(bsg%10)]);                 //时个位
    	    wrd(0x3A);                     //:
    	    wrd(dat1[(bfg/10)]);                 //分十位
    	    wrd(dat1[(bfg%10)]);                 //分个位
    			 if(K3==0)
    			{
    				delay(1000);
    				if(K3==0)
    					bfg++;
    			}
    			if(K4==0)
    			{
    				delay(1000);
    				if(K4==0)
    					bsg++;
    			}
    			bell=1;
    			zero();
    }
    		
    while(mod==3)
    {
    	while(zanting)
    	{
    	dingshi=60;
    	EX1=1;              //打开外部中断1
    	wrm(0X80);   
    	 wrd(dat1[(dingshi/10)]);                 //时十位
    	 wrd(dat1[(dingshi%10)]);            	//时个位
       }
       wrm(0X80);   
    	 wrd(dat1[(dingshi/10)]);                 //时十位
    	 wrd(dat1[(dingshi%10)]);            	//时个位	
    	while(dingshi<0)
    	{
    		wrm(0X80);   
    		 wrd(dat1[0]);                 //时十位
    	   wrd(dat1[0]);            	//时个位
    		BUZ=0;
    	}
    }
    }
    }
    
    void time0() interrupt 1
    {
       TH0=0XFC;	     //给定时器赋初值,定时1ms
    	 TL0=0X18;
    	 i++;
    	 if(i==1000)     //ms转化为s
    	 {
    		i=0;
    		 s++;
    		 dingshi--;
    	 }	
    }
    
    void key1() interrupt 0     //外部中断0,调整时间
    {
    	delay(1000);
    	if(K1==0)
    	  { 
    		  mod++;
    			while(!K1);
    	  }
    
    if(mod>3)
    {
    	mod=0;
    }
    	 zero();
    }
    
    void naozhong()  interrupt 2                     //开关闹钟
    {
    	if(K2==0)
    		{
    			delay(1000);           //消抖
    				if(K2==0)
    					{
    						bell=0;
    						BUZ=1;
    						zanting=~zanting;
    					}                       //关闭蜂鸣器
    						while(!K2);          //确认按键松开
         }
    }
    
    
    
    

    在这里插入图片描述

    二、收获
    1.更熟练掌握了定时器中断和外部中断的使用
    在这里插入图片描述

    在这里插入图片描述

    可以通过打开和关闭外部中断使同一个按键实现不同的功能

    2.了解到了一点寄存器操作

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    3.中断配置小结
    外部中断
    在这里插入图片描述
    定时器中断
    在这里插入图片描述

    串口通信
    在这里插入图片描述
    4.更熟练使用proteus
    制作了一个小型软件开发版
    在这里插入图片描述

    5.学会了如何学习一个新元器件(LCD1602)
    1.看说明书,重点是看时序图,真值表等
    2.按照时序图写程序
    3.一二都不成立时,查找相关资料
    6.下载原理
    单片机的烧写原理:
    单片机烧写,又称为单片机程序下载、烧录等,本质上是单片机和PC机按照芯片厂家规定的编程协议,通过芯片厂家规定的接口,把已编译好的程序传输到单片机,单片机把数据存储到自身存储器中。
    理解这个原理需要知道几个知识点:
    单片机内部是有程序的,是出厂时固化在硬件中,用户无法修改的(这也会被认为它内部没有程序),这些程序可以调用各种通信接口、内部存储器等;
    可以下载的通信接口:JTAG,SPI,UART,usb等;(还有很多可以扩展485、以太网等)
    编程协议:一般大厂都会公开的,在芯片的专用技术手册中会有;
    存储器:有很多种,掩膜,EPROM,EEROM,flash等寿命不一样,掩膜只能一次,而且要工厂做,flash擦写次数10000+;
    可以这样比喻性的理解:单片机就是电脑的主板,我们写的程序就是操作系统,主板里面装入引导操作系统的基本程序,下载程序就是给电脑装系统!

    7.其他
    1.理解了现在电子表的操作原理
    2.学会了借助现成品(电子表)作参考,写程序
    3.懂得了与人交流的重要性(受王同学的启发,完善了原有程序)

    三.后期计划
    1、继续32的学习
    2、练习焊功
    3、继续51其他外设的学习
    4、按兴趣学习电路、模电、数电、DXP等相关知识

    展开全文
  • 全套集合:51单片机数码管时钟电路+代码+hex文件+报告+演示视频,全套齐活包满意
  • 本文介绍了时钟电路单片机系统影响的原理,同时提出了低功耗系统设计中的建议。
  • 2.可单独调整时钟的分十秒 3.闹钟功能 4,键功能说明 second--正常显示和闹钟状态时调整秒位 minute--正常显示和闹钟状态时调整分位 hour--正常显示和闹钟状态时调整分位 alarm--开启和关闭闹钟功能(变量alarm_is_...
  • 51单片机八位数码管时钟电路仿真

    千次阅读 多人点赞 2020-07-03 10:43:38
    器件选型有:AT89C51模块,八位阳极数码管显示模块,两个独立按键模块,还有P1口作为I/O口需要外加上拉电阻的电阻排,由于仿真的单片机模块内有时钟电路以及复位电路,这里省略了。 2、硬件设计与分析 电路原理图如...
  • 单片机技术
  • 基于51单片机时钟和仿真图,lcd显示年月日时分秒,并都可调,可以烧写到板子上,也可以在仿真软件上运行
  • 01在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部...
  • 仿了个12864大数字时钟12c887,板子和12864一样大,4个固定孔。 该数字时钟以STC89C52RC为主控芯片,通过DS12CR887时钟芯片和DS18B20温度传感器在12864上实现日期、星期、时间、农历、温度等的显示。 说明:附件内容...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,930
精华内容 2,772
关键字:

51单片机时钟电路作用