单片机电子表

@单片机电子表

先介绍下所要实现的功能

一、按键实现功能

常用的电子表可以利用4个按键实现调整,这四个按键分别为KEY1、KEY2、KEY3、KEY4,其中 1.1KEY1作为调整设定键,按下后进入调整状态,第一次按下在当前时间基础上调小时,第二次按下调分钟,第三次按下调秒,第四次按下在原定闹时间基础上调整定闹的小时,第五次按下调定闹的分钟。再按循环。
1.2 KEY2、KEY3分别对将要调整的对象进行加、减调整,如在调整小时状态下,按下KEY2后,小时加1,按下KEY3后,小时减一。在调整状态下,按下KEY4退出调整。

二、时间显示

小时、分钟和秒的每个数据对象需显示出个位和十位,因此每个时间对象要占用两个数码管显示。在正常走时状态进入调整时间状态后,要求对应的调整对象以周期为1/2s的速率闪烁,以区别正常走时状态。在调时状态下,小时、分钟和秒所在位置不变,但在定闹时间调整时,6个数码管的后四位显示定闹时、分,前两和数码管显示一个特定字符,如“L1”,用来区分调时状态。

三、定闹输出问题

当电子表走时状态下的时间与定闹时间相同时,可以通过控制继电器吸合接通负载动作达到定闹输出目的,也可以驱动蜂鸣器发出声响提示。如果采用有源蜂鸣器时,只需在蜂鸣器上加上高电平即可产生1kHz声响。在本项目中使用的是无源蜂鸣器,其内部只是一个电磁铁和一个铁质共振模,需加上1kHz方波信号时才发出声响,因此需在程序中设计一个产生1kHz左右方波程序,以驱动蜂鸣器发声。

四、介绍一下我的思路

1、电子表的核心是中断服务函数和按键
2、大的思路是:利用按键一的次数来调整模式,第二三 按键来加减,最后一个来退出,封装为key函数。
3、关于调整时间的问题 我们f封装为函数display,调时、调分、调秒,调闹钟的时和分总共五个

五、代码

main函数 主要思路有利用中断服务函数来记录半秒,一秒和一分钟,一小时,第一个调整模式按键记录了六种模式分别为 正常,调时,调分,调秒,调闹钟的时和分

 #include<reg51.h>
   sbit P1_0=P1^0;
    sbit P3_2=P3^2;
 unsigned char key_mode  ;
 unsigned int code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};	   //	 声明数组
 char sec=55,min=30,hour=12,hour_n,min_n;
 unsigned char cp1,cp2,flash;
 unsigned int cp;
 
  #include<key.c>
  #include<diaplay.c>
 
void timer0_isr(void) interrupt 1
{
  TH0=(65535-2000)/255;					 //	  2ms
 TL0=(65535-2000)%255;
 cp++;
  if(cp>=250)		//半秒
  {
   cp=0;
   flash=~flash;		  //   小数点闪烁
  if(key_mode==0) cp2++;  //判断模式

  }
  if(cp2>=2)			  //   1m
  {
  	 cp2=0;
	 sec++;
	 if(sec>=60){sec=0;min++;}
	 if(min>=60){min=0;hour++;}
	 if(hour>=24)hour=0;

  }

  P0=0xff;//消隐
  	 //锁存器所存
	 //key();
	 if(key_mode==0)diaplay0();
	 if(key_mode==1)diaplay1();
	 if(key_mode==2)diaplay2();
	 if(key_mode==3)diaplay3();
	 if(key_mode==4)diaplay4();
	 if(key_mode==5)diaplay5();

 cp1++;
 if(cp1>=8)
 cp1=0;

  }

 void timer0_init(void)
  {
  TMOD=0x01;
  TH0=(65536-2000)/256;
  TH0=(65536-2000)%256;

  EA=1;
  ET0=1;
  TR0=1;
  
  
  }


   void main(void)
   {
   timer0_init() ;	 //初始化
	 while(1)
	 {
	  key();

   if(hour==hour_n&&min==min_n)
     P3_2=0;
   else
	  P3_2=1;

	 }
  
   
   }



下面时key函数

sbit key_set=P2^0;
  sbit key_up=P2^1;
  sbit key_down=P2^2;
  sbit key_rst=P2^3;

  void delay(unsigned int x)
   {while(x--);}
  
  void key(void)
  {
  if(key_set==0)
  {  
    delay(300);
    if(key_set==0)
     {
      key_mode++;
     if(key_mode>=6)
      key_mode=1;
      }								
   while(key_set==0);

  }

 if(key_rst==0)
  {   delay(500);
   if(key_rst==0)
   {
     key_mode=0;
   }
   while(key_rst==0);
  }

 if(key_up==0)
  {   
    delay(500);
   if(key_up==0)
   {
      if(key_mode==1) sec++;if(sec>=60)sec=59;
	   if(key_mode==2) min++;if(sec>=60)min=59;
	    if(key_mode==3) hour++;if(hour>=24)hour=23;
		 if(key_mode==4) hour_n++;if(hour_n>=24)hour_n=59;
		  if(key_mode==5) min_n++;if(min_n>=60)min_n=59;

   }
   while(key_up==0);
  }

if(key_down==0)
  {   
     delay(500);
   if(key_down==0)
   {
      if(key_mode==1) sec--;if(sec<=0)sec=0;
	   if(key_mode==2) min--;if(min<=0)min=0;
	    if(key_mode==3) hour--;if(hour<=0)hour=0;
		 if(key_mode==4) hour_n--;if(hour_n<=0)hour_n=0;
		  if(key_mode==5) min_n--;if(min_n<=0)min_n=0;

   }
   while(key_down==0);
  }



  }

diapllay函数

void diaplay0(void)
 {
switch(cp1)
 {

   case 0:P1_0=0;  P0=0x01;  P1_0=1; P1_0=0;  P0=seven_seg[sec% 10]; break;

   case 1:P1_0=0;  P0=0x02;  P1_0=1; P1_0=0;  P0=seven_seg[sec/10];	break;

   case 2:P1_0=0;  P0=0x04;  P1_0=1; P1_0=0;  P0=0xbf |flash; break;

   case 3:P1_0=0;  P0=0x08;  P1_0=1; P1_0=0;  P0=seven_seg[min% 10];	break;

   case 4:P1_0=0;  P0=0x10;  P1_0=1; P1_0=0;  P0=seven_seg[min /10]; break;

   case 5:P1_0=0;  P0=0x20;  P1_0=1; P1_0=0;   P0=0xbf|flash;	break;

   case 6:P1_0=0;  P0=0x40;  P1_0=1; P1_0=0;  P0=seven_seg[hour% 10]; break;

   case 7:P1_0=0;  P0=0x80;  P1_0=1; P1_0=0;  P0=seven_seg[hour/10];	break;

	   }
 }

 void diaplay1(void)
 {
switch(cp1)
 {

   case 0:P1_0=0;  P0=0x01;  P1_0=1; P1_0=0;  P0=seven_seg[sec% 10]|flash; break;

   case 1:P1_0=0;  P0=0x02;  P1_0=1; P1_0=0;  P0=seven_seg[sec/10]|flash;	break;

   case 2:P1_0=0;  P0=0x04;  P1_0=1; P1_0=0;  P0=0xbf ; break;

   case 3:P1_0=0;  P0=0x08;  P1_0=1; P1_0=0;  P0=seven_seg[min% 10];	break;

   case 4:P1_0=0;  P0=0x10;  P1_0=1; P1_0=0;  P0=seven_seg[min /10]; break;

   case 5:P1_0=0;  P0=0x20;  P1_0=1; P1_0=0;   P0=0xbf;	break;

   case 6:P1_0=0;  P0=0x40;  P1_0=1; P1_0=0;  P0=seven_seg[hour% 10]; break;

   case 7:P1_0=0;  P0=0x80;  P1_0=1; P1_0=0;  P0=seven_seg[hour/10];	break;

	   }
 }
 void diaplay2(void)
 {
switch(cp1)
 {

   case 0:P1_0=0;  P0=0x01;  P1_0=1; P1_0=0;  P0=seven_seg[sec% 10]; break;

   case 1:P1_0=0;  P0=0x02;  P1_0=1; P1_0=0;  P0=seven_seg[sec/10];	break;

   case 2:P1_0=0;  P0=0x04;  P1_0=1; P1_0=0;  P0=0xbf ; break;

   case 3:P1_0=0;  P0=0x08;  P1_0=1; P1_0=0;  P0=seven_seg[min% 10]|flash;	break;

   case 4:P1_0=0;  P0=0x10;  P1_0=1; P1_0=0;  P0=seven_seg[min /10]|flash; break;

   case 5:P1_0=0;  P0=0x20;  P1_0=1; P1_0=0;   P0=0xbf;	break;

   case 6:P1_0=0;  P0=0x40;  P1_0=1; P1_0=0;  P0=seven_seg[hour% 10]; break;

   case 7:P1_0=0;  P0=0x80;  P1_0=1; P1_0=0;  P0=seven_seg[hour/10];	break;

	   }
 }
 
void diaplay3(void)
 {
switch(cp1)
 {

   case 0:P1_0=0;  P0=0x01;  P1_0=1; P1_0=0;  P0=seven_seg[sec% 10]; break;

   case 1:P1_0=0;  P0=0x02;  P1_0=1; P1_0=0;  P0=seven_seg[sec/10];	break;

   case 2:P1_0=0;  P0=0x04;  P1_0=1; P1_0=0;  P0=0xbf ; break;

   case 3:P1_0=0;  P0=0x08;  P1_0=1; P1_0=0;  P0=seven_seg[min% 10];	break;

   case 4:P1_0=0;  P0=0x10;  P1_0=1; P1_0=0;  P0=seven_seg[min /10]; break;

   case 5:P1_0=0;  P0=0x20;  P1_0=1; P1_0=0;   P0=0xbf;	break;

   case 6:P1_0=0;  P0=0x40;  P1_0=1; P1_0=0;  P0=seven_seg[hour% 10]|flash; break;

   case 7:P1_0=0;  P0=0x80;  P1_0=1; P1_0=0;  P0=seven_seg[hour/10]|flash;	break;

	   }
 }
 void diaplay4(void)
 {
 switch(cp1)
 {

   case 0:P1_0=0;  P0=0x01;  P1_0=1; P1_0=0;  P0=seven_seg[min_n% 10]; break;

   case 1:P1_0=0;  P0=0x02;  P1_0=1; P1_0=0;  P0=seven_seg[min_n/10];	break;

   case 2:P1_0=0;  P0=0x04;  P1_0=1; P1_0=0;  P0=0xbf ; break;

   case 3:P1_0=0;  P0=0x08;  P1_0=1; P1_0=0;  P0=seven_seg[hour_n% 10]|flash;	break;

   case 4:P1_0=0;  P0=0x10;  P1_0=1; P1_0=0;  P0=seven_seg[hour_n/10]|flash; break;

   case 5:P1_0=0;  P0=0x20;  P1_0=1; P1_0=0;   P0=0xbf;	break;

   case 6:P1_0=0;  P0=0x40;  P1_0=1; P1_0=0;  P0=0xc0; break;

   case 7:P1_0=0;  P0=0x80;  P1_0=1; P1_0=0;  P0=0xc8;	break;

	   }
 }
 			
void diaplay5(void)
 {
 switch(cp1)
 {

   case 0:P1_0=0;  P0=0x01;  P1_0=1; P1_0=0;  P0=seven_seg[min_n% 10]|flash; break;

   case 1:P1_0=0;  P0=0x02;  P1_0=1; P1_0=0;  P0=seven_seg[min_n/10]|flash;	break;

   case 2:P1_0=0;  P0=0x04;  P1_0=1; P1_0=0;  P0=0xbf ; break;

   case 3:P1_0=0;  P0=0x08;  P1_0=1; P1_0=0;  P0=seven_seg[hour_n% 10];	break;

   case 4:P1_0=0;  P0=0x10;  P1_0=1; P1_0=0;  P0=seven_seg[hour_n/10]; break;

   case 5:P1_0=0;  P0=0x20;  P1_0=1; P1_0=0;   P0=0xbf;	break;

   case 6:P1_0=0;  P0=0x40;  P1_0=1; P1_0=0;  P0=0xc0; break;

   case 7:P1_0=0;  P0=0x80;  P1_0=1; P1_0=0;  P0=0xc8;	break;

	   }
 }
 			

六、仿真电路


欢迎指教,这是为了期末考试复习一遍才写的 ~~hahaha

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值