zoukankan      html  css  js  c++  java
  • 单片机电子时钟的设计(期末课程设计)

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

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

    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

    使用的单片机:

    参考代码:

      1 // hill20200709
      2 #include<reg52.h> //引入头文件
      3 #include<intrins.h> //左右移函数头文件
      4 #define uchar unsigned char //变量声明
      5 #define uint unsigned int //变量声明
      6 
      7 sbit key1=P3^4; //按键key1声明
      8 sbit key2=P3^5; //按键key2声明
      9 sbit key3=P3^6; //按键key3声明
     10 sbit key4=P3^7; //按键key4声明
     11 
     12 sbit buzzer=P2^3;  //蜂鸣器声明
     13 
     14 sbit DU =P2^6;     //位声明DU
     15 sbit WE =P2^7;  //位声明WE
     16 uchar num;
     17 uchar code table[]={ //数码管显示用的数组
     18 0x3f,0x06,0x5b,0x4f,
     19 0x66,0x6d,0x7d,0x07,
     20 0x7f,0x6f,0x77,0x7c,
     21 0x39,0x5e,0x79,0x71};
     22 
     23 int s=0;  //声明并初始化 秒 变量
     24 int min=0; //声明并初始化 分钟 变量
     25 int h=0; //声明并初始化 小时 变量
     26 
     27 void delayms(uint xms) // 延时函数  用于数码管显示
     28 {
     29     uint i,j;
     30     for(i=xms;i>0;i--)    
     31         for(j=110;j>0;j--);
     32 }
     33 
     34 void dispNum(int h, int min, int s){ //数码管显示函数 实现小时、分钟、秒数的显示
     35     int m2 = min/10; //十位
     36     int m1 = min%10; //个位
     37     
     38     int s2 = s/10;
     39     int s1 = s%10;
     40 
     41     int h2 = h/10;
     42     int h1 = h%10;
     43     
     44     DU=1;
     45     P0=table[h1];
     46     DU=0;
     47     WE=1;
     48     P0=0xfd;  //1111 1101 第2个数码管 小时个位
     49     WE=0;
     50     delayms(2);
     51 
     52     DU=1;
     53     P0=table[h2];
     54     DU=0;
     55     WE=1;
     56     P0=0xfe;  //1111 1110 第1个数码管 小时十位
     57     WE=0;
     58     delayms(2);
     59 
     60     DU=1;
     61     P0=table[m1];
     62     DU=0;
     63     WE=1;
     64     P0=0xf7;  //1111 0111 第4个数码管 分钟个位
     65     WE=0;
     66     delayms(2);
     67     
     68     DU=1;
     69     P0=table[m2];
     70     DU=0;
     71     WE=1;
     72     P0=0xfb;//1111 1011 第3个数码管 分钟十位
     73     WE=0;
     74     delayms(2);
     75     
     76     
     77     DU=1;
     78     P0=table[s1];
     79     DU=0;
     80     WE=1;
     81     P0=0xdf;  //1101 1111 第6个数码管 秒个位
     82     WE=0;
     83     delayms(2);
     84     
     85     DU=1;
     86     P0=table[s2];  
     87     DU=0;
     88     WE=1;
     89     P0=0xef;//1110 1111 第5个数码管 秒十位
     90     WE=0;
     91     delayms(2);
     92 }
     93 
     94 //key函数 实现用按键对小时、分钟调整
     95 void key(){
     96     if (key1==0){  //adjust hour -plus 调整小时 加
     97         delayms(10); //10ms
     98         if (key1==0){
     99             h++;
    100             if(h==24){
    101             h=0; //注意是24小时清零
    102             }
    103         while(!key1); //没弹起就在空循环里面,所以按下数字显示不全
    104         }
    105     }
    106     
    107     if (key2==0){ //adjust hour -minus 调整小时 减
    108         delayms(10); //10ms
    109         if (key2==0){
    110             h--;
    111             if(h==-1){
    112             h=23;
    113             }
    114         while(!key2); //没弹起就在空循环里面,所以按下数字显示不全
    115         }
    116     }
    117         if (key3==0){ //adjust min -plus 调整分钟 加
    118         delayms(10); //10ms
    119         if (key3==0){
    120             min++;
    121             if(min==60){
    122             min=0;
    123             }
    124         while(!key3); //没弹起就在空循环里面,所以按下数字显示不全
    125         }
    126     }
    127 
    128 
    129         if (key4==0){ //adjust min -minus 调整分钟 减
    130         delayms(10); //10ms
    131         if (key4==0){
    132             min--;
    133             if(min==-1){
    134             min=59;
    135             }
    136         while(!key4); //没弹起就在空循环里面,所以按下数字显示不全
    137         }
    138     }
    139 }
    140 void soundTime(int time){ //蜂鸣器的实现函数 参数为蜂鸣器报警的时间
    141     buzzer=0; //蜂鸣器开
    142     delayms(time);
    143     buzzer=1; //蜂鸣器关
    144 }
    145 
    146 void main()
    147 {
    148 
    149     TMOD=0x01;  //TMOD的值表示定时器工作方式选择
    150     TH0=(65536-45872)/256; //数装入TH0寄存器
    151     TL0=(65536-45872)%256; //数装入TL0寄存器
    152     EA=1;  //开总中断
    153     ET0=1; //允许定时器0中断
    154     TR0=1; //开始计数
    155 
    156     while(1) //下面是个死循环,为了让程序不停地执行
    157     {
    158         dispNum(h,min,s); //显示函数
    159         key(); //
    160         if(num==20) //循环20次为一秒
    161         {
    162             num=0;
    163             s++;  //秒加一
    164             //soundTime(10);  
    165             //在此调用检查函数soundTime()  若蜂鸣器每一秒都响 则函数正常
    166             if(s==60){  //秒到60进位
    167                 s=0;
    168                 min++;  //秒清零 分钟加一
    169                 if(min==60){ //分钟到60进位
    170                     min=0;
    171                     h++;  //分钟清零 小时加一
    172                     soundTime(500); //buzzer 蜂鸣器在分钟从59到清零的时候 整点报时
    173                     if(h==24){ 
    174                         h=0;  //小时满24清零
    175                     }
    176                 }
    177             }    
    178         }
    179     }
    180 
    181 
    182 
    183 }
    184 
    185 void T0_time() interrupt 1 //中断函数
    186 {
    187     TH0=(65536-45872)/256;
    188     TL0=(65536-45872)%256;
    189     num++;
    190 }

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

  • 相关阅读:
    maven引入tomcat插件
    Maven更新jdk1.7
    ehcashe
    response的json
    ajax
    180411
    清空select标签中option选项
    jackson
    ajax
    mysql主从
  • 原文地址:https://www.cnblogs.com/hillxu/p/13283205.html
Copyright © 2011-2022 走看看