最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

51单片机电子时钟(C语言)

来源:动视网 责编:小OO 时间:2025-09-23 23:13:44
文档

51单片机电子时钟(C语言)

#include#include#defineucharunsignedchar//宏定义#defineuintunsignedintucharsec,min,hour,sec50,jishu,dtp2;//sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元ucharsec1,min1,hour1;//时间中介单元ucharnzmin,nzhour,nzjishu=0,dispjishu=0;//闹钟分、时定义uchardatanzbit=0;//
推荐度:
导读#include#include#defineucharunsignedchar//宏定义#defineuintunsignedintucharsec,min,hour,sec50,jishu,dtp2;//sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元ucharsec1,min1,hour1;//时间中介单元ucharnzmin,nzhour,nzjishu=0,dispjishu=0;//闹钟分、时定义uchardatanzbit=0;//


#include

#include

#define uchar unsigned char     //宏定义

#define uint unsigned int

uchar sec,min,hour,sec50,jishu,dtp2;  //sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元

uchar sec1,min1,hour1; //时间中介单元 

uchar nzmin,nzhour,nzjishu=0,dispjishu=0; //闹钟分、时定义

uchar data  nzbit=0;  //闹钟标志位,闹钟默认为开启

uchar data dispbit=0;    //显示标志位,默认显示当前时间

uchar data disp[8];  //秒、分、时个位与十位存放数组及‘—’

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //数字0-9

sbit KEYmin=P3^2; //分加1按钮

sbit KEYhour=P3^3; //时加1按钮

sbit LABA=P1^0;  //闹钟输出I/O口

sbit NZdisplay=P3^4; //闹钟显示按钮,按住不放显示闹钟时间,放开则显示当前时间

sbit KEYnzmin=P3^5; //闹钟分加1按钮

sbit KEYnzhour=P3^6; //闹钟时加1按钮

sbit KEYoff=P3^7; //关闭闹钟按钮,按第一次为关闭,第二次为开启

void display();    //显示函数声明

void keyscan();     //按键扫描函数声明

void naozhong(); //闹钟判别函数声明

void keynz();  //闹钟按键函数声明

void main()

{

 sec=0;    //时间初始化为00—00—00

 min=0;

 hour=0;

 sec1=0; //显示单元初始化为00—00—00

 min1=0;

 hour1=0;

 nzmin=01;  //闹钟初始时间为01:01

 nzhour=01;

 jishu=0;

 dtp2=0xfe;

 P0=0xff;

 TMOD=0x11; //设T0、T1为模式1

 IE=0x8a; 

 TH0=0xb8; //T0定时20ms

 TL0=0x0;

 TH1=0xfc; //T1定时1ms

 TL1=0x66;

 TR0=1;

 TR1=1;

 while(1)

 {

  display(); //调用显示子程序

  keyscan();  //调用按键子程序

  keynz();  //调用闹钟按键子程序

 }

}

void t0int() interrupt 1 //T0定时中断程序

{

 TH0=0xb8; 

 TL0=0x0;

 sec50++;

 if(sec50==50)  //对20ms计数50次即1s

 {

  sec50=0;  //清秒计数器,为下次做准备

  naozhong(); //调用闹钟判别子程序

  sec1++; //秒加1  

 }

 if(sec1==60)  //对秒计数60次即1min

 {

   sec1=0;

   min1++;  //分加1

 }

 if(min1==60)  //对分计数60次即1hour

 {

  min1=0;

  hour1++;  //时加1

 }

 if(hour1==24)

 {

  hour1=0;

 }

 if(dispbit==0) //判断显示标志位是否为0,为0显示当前时间

 {

   sec=sec1;

   min=min1; 

   hour=hour1;

  }

 else       //显示标志位为1,显示闹钟时间

 {

   min=nzmin;  //将闹钟时间给显示单元

   hour=nzhour;

 }

}

void t1int() interrupt 3  //T1中断程序

{

 TH1=0xfc; 

 TL1=0x66;

 P2=0xff; //关闭所有数码管

 P2=dtp2;

 dtp2=_crol_(dtp2,1);

 P0=disp[jishu];

 jishu++;

 if(jishu==8) //扫描完8位数码管清0,重新从第一位开始扫描

 {

  jishu=0;

 }

}

void delay(uint x)  //延时函数

{

 uchar i;

 while(x--)

 {

for(i=0;i<120;i++);

 }

}

void display()  //显示子程序

{

 disp[7]=table[sec%10];    //秒个位显示

 disp[6]=table[sec/10];    //秒十位显示

 disp[4]=table[min%10];    //分个位显示

 disp[3]=table[min/10];    //分十位显示

 disp[1]=table[hour%10]; //时个位显示

 disp[0]=table[hour/10]; //时十位显示

 disp[2]=0xbf;    //显示‘_’

 disp[5]=0xbf;

}

void keyscan()    //按键子程序

{

 delay(20);  //延时消抖

 if(KEYmin==0)//时间分加1按钮

 {

   min1++;     //时间分加1

   if(min1==60)

   {

       min1=0;

    hour1++; //分加到60对时加1

   }

   if(hour1==24)

   {

       hour1=0;

   }

   while(!KEYmin); //等待按键放开

  }

 delay(20);  //延时消抖

 if(KEYhour==0)    //时间时加1按钮

 {

   hour1++;       //时间时加1

  if(hour1==24)

  {

   hour1=0;

  }

  while(!KEYhour);  //等待按键放开

 }

}

void naozhong()  //闹钟判断

{

 if(nzbit==0) //判断闹钟标志位,0为开启闹钟判断,1为关闭闹钟

 { 

  if(min1==nzmin)  //闹钟与时间分的判别

   if(hour1==nzhour)  //闹钟与时间时的判别

       LABA=0;  //时间分、时与闹钟分、时相等就打开蜂鸣器

  }

 else  

 LABA=1;

}

void keynz() //闹钟加、减及闹钟关闭、开启按键处理子程序

{

 delay(20);  //延时消抖

 if(KEYnzmin==0) //判别闹钟分加1按键

 {

  nzmin++;     //闹钟分加1

  if(nzmin==60)

  {

   nzmin=0;

   nzhour++;  //闹钟分加到60对闹钟时加1

   if(nzhour==24)

   nzhour=0;

  }

  while(!KEYnzmin);    //等待按键放开

 }

 delay(20);     //延时消抖

 if(KEYnzhour==0)  //判别闹钟时加1按键

 {

  nzhour++;     //闹钟时加1

  if(nzhour==24)

  nzhour=0;

  while(!KEYnzhour); //等待按键放开

 }

 

 if(KEYoff==0)//判断关闭闹钟按键是否按下

 {

  delay(20);  // 延时消抖

  nzjishu++;

  if(nzjishu==1)  //判断是否为第一次按下

  {

   nzbit=1;      //第一次按下关闭闹钟

  }

  if(nzjishu==2) //判断是否为第二次按下

  {

   nzjishu=0; //第二次按下清计数单元

   nzbit=0;     //    第二次按下开启闹钟判别

  }

  while(!KEYoff);  //等待按键放开

 }

 if(NZdisplay==0)  //判别显示切换闹钟按键是否按下

 {

  dispjishu++;

  if(dispjishu==1)    //第一次按下显示闹钟时间

  {

   dispbit=1; //第一次按下,把标志位置1,显示切换为闹钟时间

  }

  if(dispjishu==2) //第二次按下显示为当前时间

  {

   dispjishu=0;     //清零,重新计数

   dispbit=0;    //第二次按下清零显示标志位,显示切换为当前时间

  }

  while(!NZdisplay); //等待按键放开

 }

}

文档

51单片机电子时钟(C语言)

#include#include#defineucharunsignedchar//宏定义#defineuintunsignedintucharsec,min,hour,sec50,jishu,dtp2;//sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元ucharsec1,min1,hour1;//时间中介单元ucharnzmin,nzhour,nzjishu=0,dispjishu=0;//闹钟分、时定义uchardatanzbit=0;//
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top