找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5980|回复: 0
收起左侧

基于51单片机的升级时钟程序

[复制链接]
ID:373809 发表于 2018-7-18 09:25 | 显示全部楼层 |阅读模式
基于51单片机的升级时钟程序

单片机源程序如下:
  1. #include "reg52.h"                                  //单片机头文件
  2. #define uchar unsigned char           //定义uchar 代替 unsigned char
  3. #define uint unsigned int
  4. sbit duan=P2^6;                                           //位定义
  5. sbit wei=P2^7;
  6. sbit k1=P3^4;
  7. sbit k2=P3^5;
  8. sbit k3=P3^6;
  9. sbit k4=P3^7;
  10. void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5);                  //函数声明
  11. void delay(uchar mss);
  12. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};         //共阴数码管显示数字
  13. uchar ms=0,mg=0,fs=0,fg=0,ss=0,sg=0,m=0,f=0,s=0;                           //定义变量
  14.                                                                                                                            //主函数
  15. main()
  16. {        P0=0x00;
  17.     duan=1;
  18.         duan=0;
  19.         P0=0xc0;
  20.         wei=1;
  21.         wei=0;
  22.         TH0=(65536-50000)/256;
  23.         TL0=(65536-50000)%256;
  24.         TMOD=0x01;                                                                 //设置定时器工作方式---定时器0在工作模式1下工作,即一个16位的计时器
  25.         TR0=1;                                                                        //开定时器0
  26.         ET0=1;                                                                  //开中断1即定时器中断0
  27.         EA=1;                                                                  //开总中断
  28.         while(1)

  29.         {
  30.            if(k1==0)                                                                //按键k1为低电频
  31.           {         
  32.           delay(40);                                                                //延时去抖
  33.              if(k1==0)                                                                 //判断k1是否按下
  34.                   {                                                                                  //等待按键释放
  35.                           while(k1!=1);
  36.                    f++;                                                                        //分钟自加
  37.                    m=0;                                                                        //秒置0
  38.                    if(f==60)                                                         //分钟为60,自动置0,小时自加1
  39.                    {
  40.                                    f=0;
  41.                                 s++;
  42.                                 if(s==24)
  43.                                 {s=0;}
  44.                    }
  45.                   }
  46.                  
  47.           }
  48.           if(k2==0)
  49.           {
  50.                   delay(40);
  51.          if(k2==0)
  52.                  {
  53.                    while(k2!=1);
  54.                    f--;
  55.                    m=0;
  56.                    if(f==-1)
  57.                    {
  58.                                    f=59;
  59.                                 s--;
  60.                                 if(s==-1)
  61.                                 {s=0;}
  62.                    }
  63.                   }
  64.                  
  65.           }
  66.       if(k3==0)
  67.            {
  68.                    delay(40);
  69.              if(k3==0)
  70.                   {
  71.                     while(k3!=1);
  72.                     s++;
  73.                     m=0;
  74.                 if(s==24)
  75.                    {
  76.                                 {
  77.                                         s=0;
  78.                                 }
  79.                    }
  80.                   }
  81.         }
  82.            if(k4==0)
  83.            {
  84.                    delay(40);
  85.              if(k4==0)
  86.                   {
  87.                           while(k4!=1);
  88.                     s--;
  89.                     m=0;
  90.                    if(s==-1)
  91.                    {
  92.                                 {s=23;}
  93.                    }
  94.                   }
  95.                  
  96.           }
  97. mg=m%10;                                                        //秒个位是秒数除以10的余数
  98.           ms=m/10;                                                   //秒十位是秒数除以十的商
  99.           fg=f%10;
  100.           fs=f/10;
  101.           sg=s%10;
  102.           ss=s/10;
  103.          
  104.           display(mg,ms,fg,fs,sg,ss);                //调用显示函数,实参为秒的十位个位...
  105.         }
  106.        
  107. }

  108. void timer0() interrupt 1                                           //中断函数
  109. {  
  110.     int num;                                                                  //num是个标志
  111.         TH0=(65536-50000)/256;                                         //计时器赋初值
  112.         TL0=(65536-50000)%256;
  113.         num++;                                                                          //当num==20即1s 进入秒自加,num清0
  114.         if(num==20)
  115.         {
  116.                  m++;
  117.                 num=0;
  118.                 if(m==60)                                                                 //秒自加到60自动清0,分自加
  119.                 {
  120.                         m=0;
  121.                 f++;
  122.                         if(f==60)
  123.                         {
  124.                                 f=0;
  125.                                 s++;
  126.                                 if(s==24)
  127.                                 {
  128.                                         s=0;
  129.                                 }
  130.                         }
  131.                 }
  132.         }

  133. }
  134. void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5)                   //显示函数
  135. {
  136.        
  137.         P0=tab[a0];                 //P0口赋值tab[a0]即对应实参tab[mg]秒个位显示
  138.         duan=1;                         //开段选即读到tab[mg]到数码管上
  139.         duan=0;                         //关段选
  140.         P0=0xdf;                 //P0赋0xdf即1101 1111
  141.         wei=1;                        //开位选,即第六个数码管被选通
  142.         wei=0;                        //关位选
  143. //        delay(10);
  144.         delay(5);                //延时
  145. P0=tab[a1];
  146.         duan=1;
  147.         duan=0;
  148.     P0=0xef;
  149.         wei=1;
  150.         wei=0;

  151.         delay(5);
  152.         P0=0xf7;
  153.         wei=1;
  154.         wei=0;
  155.         P0=tab[a2];
  156.         duan=1;
  157.         duan=0;
  158. delay(5);
  159.         P0=0xfb;
  160.         wei=1;
  161.         wei=0;
  162.         P0=tab[a3];
  163.         duan=1;
  164.         duan=0;
  165.         delay(15);
  166.         P0=0xfd;
  167.         wei=1;
  168.         wei=0;
  169.         P0=tab[a4];
  170.         duan=1;
  171.         duan=0;
  172.         delay(5);
  173.         P0=0xfe;
  174.         wei=1;
  175.         wei=0;
  176.         P0=tab[a5];
  177.         duan=1;
  178.         duan=0;
  179.         delay(5);
  180.        
  181. }

  182. void delay(uchar mss)                 //延时函数
  183. {
  184.         int i,j;
  185.         for(i=mss;i>0;i--)
  186.         {
  187.                 for(j=30;j>0;j--);
  188.         }
  189. }
复制代码

所有资料51hei提供下载:
时钟.zip (28.81 KB, 下载次数: 20)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表