⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 ds18b20程序
💻 C
字号:
#include"at89x52.h"
#include<intrins.h>
#include<absacc.h>
#define  uchar unsigned char 	
#define  nop  _nop_()       /* 定义空操作指令 */

#define port_led XBYTE[0x7FFF]
#define display_disappear 0x00;
#define DSA XBYTE[0x800A]
#define DSB XBYTE[0x800B]
#define DSC XBYTE[0x800C]
#define DSD XBYTE[0x800D]

#define sec XBYTE[0x8000]
#define min XBYTE[0x8002]
#define hour XBYTE[0x8004]
#define sec_alarm XBYTE[0x8001]
#define min_alarm XBYTE[0x8003]
#define hour_alarm XBYTE[0x8005]

uchar code tab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  /*共阴极LED数码显示器的段码*/
uchar code tab_dp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};

sbit com0=P1^0;
sbit com1=P1^1;
sbit com2=P1^2;
sbit com3=P1^3;
sbit light0=P1^4;
sbit light1=P1^6;
sbit light_combo=P1^5;
sbit alarm=P3^0;
sbit bee=P1^7;
sbit key0=P3^2;
sbit key1=P3^3;

char sec_buffer=0,min_buffer=0,hour_buffer=0;
char min_buffer_alarm,hour_buffer_alarm;
char sec_temp,min_temp,hour_temp;
char light_count=0,count_timer0=0,flag_set,flag_display;
char count_bee=0,count_rect=0;
bit  bee_flag=0;
uchar ptr_key=0,flag_key=0;

void delay (unsigned int value)		/*延时副程式*/
 {
      while (value!=0) value--;		/*10US延时*/
 }

void initialize_DS(void)
{
  DSA=0x0F;
  DSB=0x82;
  ACC=DSC;
  ACC=DSD;
  DSA=0x2F;
  DSB=0x22;
}

void start_DS(void)
{
  DSA=0x0F;
  DSB=0x82;
  sec=sec_buffer;
  min=min_buffer;
  hour=hour_buffer;
  sec_alarm=0x00;
  min_alarm=0x00;
  hour_alarm=0x00;
  DSA=0x2F;
  DSB=0x22;
}

char disassemble_BCD(char BCD_DS,bit flag_DS)
{
   if(flag_DS==0) return BCD_DS&0x0f;
   else return BCD_DS>>4;
}

void scan(void)
{
  if(flag_display==0)
  {
  com3=0;
  port_led=tab[disassemble_BCD(min_temp,0)];
  delay(300);
  com3=1;

  com2=0;
  port_led=tab[disassemble_BCD(min_temp,1)];
  delay(300);
  com2=1;

  com1=0;
  port_led=tab_dp[disassemble_BCD(hour_temp,0)];
  delay(300);
  com1=1;

  com0=0;
  port_led=tab[disassemble_BCD(hour_temp,1)];
  delay(300);
  com0=1;
  }
  if(flag_display==1)
  {
  com3=0;
  port_led=display_disappear;
  delay(300);
  com3=1;

  com2=0;
  port_led=display_disappear;
  delay(300);
  com2=1;

  com1=0;
  port_led=tab_dp[disassemble_BCD(hour_temp,0)];
  delay(300);
  com1=1;

  com0=0;
  port_led=tab[disassemble_BCD(hour_temp,1)];
  delay(300);
  com0=1;
  }
  if(flag_display==2)
  {
  com3=0;
  port_led=tab[disassemble_BCD(min_temp,0)];
  delay(300);
  com3=1;

  com2=0;
  port_led=tab[disassemble_BCD(min_temp,1)];
  delay(300);
  com2=1;

  com1=0;
  port_led=display_disappear;
  delay(300);
  com1=1;

  com0=0;
  port_led=display_disappear;
  delay(300);
  com0=1;
  }

  if(flag_display==3)
  {
  com3=0;
  port_led=tab[disassemble_BCD(min_alarm,0)];
  delay(300);
  com3=1;

  com2=0;
  port_led=tab[disassemble_BCD(min_alarm,1)];
  delay(300);
  com2=1;

  com1=0;
  port_led=tab_dp[disassemble_BCD(hour_alarm,0)];
  delay(300);
  com1=1;

  com0=0;
  port_led=tab[disassemble_BCD(hour_alarm,1)];
  delay(300);
  com0=1;
  }
  if(flag_display==4)
  {
  com3=0;
  port_led=display_disappear;
  delay(300);
  com3=1;

  com2=0;
  port_led=display_disappear;
  delay(300);
  com2=1;

  com1=0;
  port_led=tab_dp[disassemble_BCD(hour_alarm,0)];
  delay(300);
  com1=1;

  com0=0;
  port_led=tab[disassemble_BCD(hour_alarm,1)];
  delay(300);
  com0=1;
  }
  if(flag_display==5)
  {
  com3=0;
  port_led=tab[disassemble_BCD(min_alarm,0)];
  delay(300);
  com3=1;

  com2=0;
  port_led=tab[disassemble_BCD(min_alarm,1)];
  delay(300);
  com2=1;

  com1=0;
  port_led=display_disappear;
  delay(300);
  com1=1;

  com0=0;
  port_led=display_disappear;
  delay(300);
  com0=1;
  }

  if(sec_temp!=sec)
     {
         switch(light_count)
            {case 0:light1=0;light0=1;break;
             case 1:light0=0;light1=1;break;
             default:break;
             }
         light_count++;
         light_count=light_count%2;
		 sec_temp=sec;
         min_temp=min;
         hour_temp=hour;
		 if((hour_temp==hour_alarm)&&(min_temp==min_alarm)&&(sec_temp==sec_alarm))
		 {TR1=1;}
     }
}

void timer_0() interrupt 1 using 2
{
  EA=0;
  count_timer0++;
  if(count_timer0>=10)
  {
    TH0=15536/256;
    TL0=15536%256;
    count_timer0=0;
	if(flag_set==1)
	  switch(flag_display)
	  {
	    case 0:flag_display=1;break;
		case 1:flag_display=0;break;
		default:break;
	  }
	if(flag_set==2)
	  switch(flag_display)
	  {
	  case 0:flag_display=2;break;
	  case 2:flag_display=0;break;
	  default:break;
	  }
	if(flag_set==4)
	  switch(flag_display)
	  {
	  case 3:flag_display=4;break;
	  case 4:flag_display=3;break;
	  default:break;
	  }
	if(flag_set==5)
	  switch(flag_display)
	  {
	  case 3:flag_display=5;break;
	  case 5:flag_display=3;break;
	  default:break;
	  }
  }
  EA=1;
}

void timer_1() interrupt 3 using 2
{
  EA=0;
  TH1=15536/256;
  TL1=15536%256;
  count_rect++;
  if(bee_flag==1)
  { 
    alarm=1;
	bee=1;
    if(count_rect>=3)
	  {
	    bee_flag=0;
	    bee=0; 
	    alarm=0;
		TR1=0;
		count_rect=0;
	  }
   }
   else
   {
     if(count_rect>=8)
     {
      alarm=!alarm;
      bee=!bee;
	  count_rect=0;
	  count_bee++;
      if(count_bee>=64)
      {TR1=0;bee=0;alarm=0;count_bee=0;light_combo=0;}
      }
	}
  EA=1;
}

void key_scan(void)
{
  ptr_key=0;
  flag_key=0;
  key0=1;
  key1=1;
  if(key0==0){flag_key=1;ptr_key=0;}
  if(key1==0){flag_key=1;ptr_key=1;}
}

void key_check(void)
{
  if(flag_key==1)
  {  
     TR1=0;
     bee_flag=1;
     TR1=1;
     if(ptr_key==0)
     {
             flag_set++;
             flag_set=flag_set%6;
             switch(flag_set)
               {
               case 0: flag_display=0;TR0=0;light_combo=0;break;
               case 1: flag_display=0;TR0=1;break;
	           case 2: flag_display=0;TR0=1;break;
	           case 3: flag_display=3;TR0=0;light_combo=1;break;
	           case 4: flag_display=3;TR0=1;break;
	           case 5: flag_display=3;TR0=1;break;
	           default:break;
               } 
               delay(100);
               while(key0==0);
      }
      else
	  {
              DSA=0x0f;
              DSB=0x82;
              sec_alarm=0;
              switch(flag_set)
              {
                 case 0:break;
                 case 1:{
                 min_buffer=min;
                 min_buffer++;
                 if((min_buffer&0x0f)>=10)
                 min_buffer=min_buffer+0x06;
                 if(min_buffer>=96)
                 min_buffer=0;
                 min=min_buffer;
		         break;
	                    }
              	 case 2:{
                 hour_buffer=hour;
                 hour_buffer++;
                 if((hour_buffer&0x0f)>=10)
                 hour_buffer=hour_buffer+0x06;
                 if(hour_buffer>=36)
                 hour_buffer=0;
                 hour=hour_buffer;
		         break;
	                     }
	             case 3:break;
	             case 4:{
                 min_buffer_alarm=min_alarm;
                 min_buffer_alarm++;
                 if((min_buffer_alarm&0x0f)>=10)
                 min_buffer_alarm=min_buffer_alarm+0x06;
                 if(min_buffer_alarm>=96)
                 min_buffer_alarm=0;
                 min_alarm=min_buffer_alarm;
		         break;
	                       }
	             case 5:{
                 hour_buffer_alarm=hour_alarm;
                 hour_buffer_alarm++;
                 if((hour_buffer_alarm&0x0f)>=10)
                 hour_buffer_alarm=hour_buffer_alarm+0x06;
                 if(hour_buffer_alarm>=36)
                 hour_buffer_alarm=0;
                 hour_alarm=hour_buffer_alarm;
		         break;
	                      }       
	             default:break;
                }
            DSB=0x22;
            DSA=0x2f; 
            delay(100);
            while(key1==0);   
        }
   }
}





void main(void)
{
  com0=0;
  com1=0;
  com2=0;
  com3=0;

  key0=1;
  key1=1;

  light0=0;
  light1=0;
  light_combo=0;
  bee=0;
  alarm=0;
  count_rect=0;
  count_bee=0;

  flag_display=0;
  count_timer0=0;
  flag_set=0;

  TH0=15536/256;
  TL0=15536%256;
  TH1=15536/256;
  TL1=15536%256;

  TMOD=0x11;
  ET0=1;
  ET1=1;
  EA=1;

  PT0=1;
  TR0=0;
  TR1=0;
  delay(50000);

  
  while(1)
     {
         scan();
         key_scan();
         key_check();
      }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -