【蓝桥杯单片机设计与开发】(9)定时器中断实现实时时钟程序

-回复 -浏览
楼主 2022-08-16 07:55:43
举报 只看此人 收藏本贴 楼主

本章的内容就是上一章结束后留给大家的思考题,使用单片机定时器制作一个以00-00-00模式显示,可以通过四个独立按键进行时间修改的24小时制时钟。


在前面几张已经为大家介绍了定时器、中断、数码管、按键等功能的使用方法,本章我们就将使用这些工能制作一个简易的可调实时时钟,自己写不出可以抄代码,但是不要用复制粘贴的方式去完成程序,这是在为自己学习,在位比赛做准备,比赛的时候没有例程让你复制。


示例程序:

#include "stc15f2k60s2.h"
 
#define uchar unsigned char
#define uint unsigned
 
sbit key1=P3^0;//定义端口参数
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
/*
 key1用于小时 +1
 key2用于小时 -1
 key3用于分钟 +1
 key4用于分钟 -1
*/
 
int uchar code tab[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f};
uchar strtab[8];//定义缓冲区域
uchar hour = 10, minute = 25, second = 12;
//初始化起始时间10-25-12
 
void display(void);
void delayms(int ms);
void Timer0Init(void);
void Timer1Init(void);
 
void main()
{
   P2 = ((P2&0x1f)|0xa0);
   P0 = 0x00;
 
   Timer0Init();
   Timer1Init();
   ET0 = 1;//开启定时器0
   ET1 = 1;//同上
   EA = 1;//定时器使能
 
   display();
   while(1)
   {
      if (!key1)
      {
         delayms(5);//按键消抖
         if (!key1)
         {
            hour++;
            if (hour == 24)
               hour = 0;
            display();
            while(!key1);//松手检测
         }
      }
      //其余三个按键功能请自行编写,如遇问题请下载参考源程序
   }
}
 
void display(void)
{
   strtab[0] = tab[hour / 10];
   strtab[1] = tab[hour % 10];
   strtab[2] = tab[10];
   strtab[3] = tab[minute % 10];
   strtab[4] = tab[minute % 10];
   strtab[5] = tab[10];
   strtab[6] = tab[second / 10];
   strtab[7] = tab[second % 10];
}
 
void delayms(int ms)
{
   int i,j;
   for(i=ms;i > 0;i--)
      for(j=845;j > 0;j--);
}
 
void Timer0Init(void) //5毫秒@11.0592MHz
//内容请自行计算
 
void Timer1Init(void) //1毫秒@11.0592MHz
//内容请自行计算
 
void Timer1_int() interrupt 3 using 0
{
   static uchar num;
   TH1 = 0xcd;
   TL1 = 0xd4;
 
   switch(num)//分别调用缓冲区的值进行扫描
   {
      case 0: P2 = ((P2&0x1f)|0xc0); P0 = 0x01;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 1: P2 = ((P2&0x1f)|0xc0); P0 = 0x02;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 2: P2 = ((P2&0x1f)|0xc0); P0 = 0x04;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 3: P2 = ((P2&0x1f)|0xc0); P0 = 0x08;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 4: P2 = ((P2&0x1f)|0xc0); P0 = 0x10;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 5: P2 = ((P2&0x1f)|0xc0); P0 = 0x20;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 6: P2 = ((P2&0x1f)|0xc0); P0 = 0x40;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      case 7: P2 = ((P2&0x1f)|0xc0); P0 = 0x80;
              P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
      default:break;
   }
   num++;
   if (num == 8)
      num = 0;
}
void Timer0_int() interrupt 1 using 1
{
   static uchar count;//定义内部静态变量
   TL0 = 0x00; //初始化初值
   TH0 = 0x28;<
   count++;
 
   switch (count);
   {
      case 0:
      case 40:
      case 80:
      case 120:
      case 160:display();break;
   }
   if (count == 200)
   {
      count = 0;
      second++;//加一秒
      if (second == 60)
      {
         second = 0;
         minute++;//加一分
         if (minute == 60)
         {
            minute = 0;
            hour++;//加一小时
            if (hour == 24)
               hour = 0;
         }
      }
   }

}


本章的内容到这里就结束了,最后给大家留一个题目,可以回去思考,后面有时间也会更新讲解,使用单片机定时器制作一个以00-00-00为初始可以通过四个独立按键进行时间修改的24小时制时钟。


本章资料下载地址:

Bkoak’s blog http://www.bkoak.com


联系博主
邮箱:wjf418224424@aliyun.com

QQ交流群:693211073


我要推荐
转发到