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

📄 clock.c

📁 单片机数字钟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****Written by yians*****/
 
#include <absacc.h>
#include <reg51.h>
#include<intrins.h>

#define uchar unsigned char


#define LED5 XBYTE [0xA000]   //数码管地址
#define LED6 XBYTE [0xA001]
#define LED7 XBYTE [0xA002]
#define LED8 XBYTE [0xA003]
#define LED1 XBYTE [0xA004]
#define LED2 XBYTE [0xA005]
#define LED3 XBYTE [0xA006]
#define LED4 XBYTE [0xA007]

#define KEY XBYTE [0xA100]  //键盘地址




/*扫描键盘使用的变量 */
sbit first_row = P1^4;      //键盘第一行控制
sbit second_row = P1^3;     //键盘第二行控制
bit first_getkey = 0,control_readkey = 0;  //读键盘过程中的标志位
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0;  //防止按键冲突标志位
uchar keynum = 0;  //获得的有效按键值寄存器 

uchar hour,minute,second,aorp,bell,bell_count2,aorc,mode,ahour,aminute,aaorp;//
unsigned int count,bell_count1,count1,count2,alarm_count1,alarm_count2;
bit bell_on = 0;//响铃标志位
bit alarm_on = 0;//闹铃标志位

/*数码管显示使用的变量和常量*/
uchar lednum = 0;  //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0};  //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表
                      // "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black" 


void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
void flash1(void);//时钟设置闪烁
void flash2(void);//闹钟设置闪烁
void alarm(void);//闹铃


void intT0() interrupt 1 //T0 定时中断处理函数
{
	TH0 = -2300/256;//1ms
 	TL0 = -2300%256;

	count++;
    if (count==1000)
    {
        count=0;
        second++;
        if(second>=60)
        {
            second=0;
            minute++;
            if (minute>=60)
            {
                minute=0;
                bell_on = 1;
                hour++;
                if (hour>=12)
                {
                    if(aorp==0x0a)//上午
                    {
                        aorp = 0x10;
                    }
                    else//下午
                    {
                        aorp = 0x0a;
                    }
                    second=0;
                    minute=0;
                    hour=0;
                 }
             }    
        }
        if (aorc==0)
		{    
		    if (mode==0)
		    {
			    led[2]=aorp;
                led[4]=second%10;
                led[5]=second/10;
                led[6]=minute%10;
                led[7]=minute/10;
                led[0]=hour%10;
                led[1]=hour/10;
		    }
		}
    }
    if (aorc==1)
	{    
		if (mode==0)
		{
			led[0]=aaorp;
            led[4]=aminute%10;
            led[5]=aminute/10;
            led[6]=ahour%10;
            led[7]=ahour/10;
            led[1]=0x11;
            led[2]=0x11;
		}
    }
	flash1();
	flash2();
        alarm();
    
    if (bell_on == 1)
    {
        if (bell_count2!=0)
        {
            bell_count1++;
            if (bell_count1<250)//0。5秒亮一次,一次0.25秒
            {bell = 0x11;}
            else if (bell_count1<500)
            {bell = 0x08;}
            else 
            {
                 bell_count1 = 0;
                 bell_count2--;     
            }
            led[3] = bell;    
        }
        else 
        {
            bell_on = 0;
            bell_count2 = 10;
			led[3] = 0x11;
        }
             
    }

    leddisp();  //每次定时中断显示更新一次

 	if(control_readkey == 1)  //每两次定时中断扫描一次键盘
   	{
    	readkey();
   	}
 	control_readkey = !control_readkey;
}


void main(void)
{

	TMOD = 0x01;    //
 	TH0 = -2300/256;  //定时器中断时间间隔 1ms
 	TL0 = -2300%256;
	TCON = 0x10;
 	ET0 = 1;
 	EA = 1;
    count = 0;
	count1 = 0;
	count2 = 0;
    second = 0;
    minute = 0;
    hour = 0;
    aorp = 0x0a;
    bell = 0x11;
    bell_count1 = 0;//count1用来设定2hz的频率
    bell_count2 = 10;//count2用来设定显示的次数
    alarm_count1 = 0;//count1用来设定1hz的频率
    alarm_count2 =10;//count2用来设定显示的次数
    led[3] = bell;
    aorc=0;
    mode=0;
    aaorp= 0x10;
    ahour = 0;
    aminute =0;
	while(1)
	{
 		if(getkey == 1)  //判断是否获得有效按键
  	    {
     		  getkey = 0;
              if(keynum == 0)
              {
                  if (aorc==0)
                  {
                      aorc=1;
                      mode=0; 
                  }
                  else {aorc=0;mode=0;}
              }
               
              if(keynum == 1)
              {
                   if (aorc==0)
                   {
                      if (mode==3)
                      {
                         mode=0;  
                      }
                      else {mode++;}
                   }
                   else
                   {
                      if (mode==2)
                      {
                         mode=0;  
                      }
                      else {mode++;}
                   }
              }
     
              if(keynum==2)
              {
                  if (aorc==0)
                  {
                      switch (mode)
                      {
                          case 0x00:break;
                          case 0x01:
                              second++;
                              if(second==60)
                              {second=0;}
                              break;
                          case 0x02:
                              minute++;
                              if(minute==60)
                              {minute=0;}
                              break;
                          case 0x03:
                              hour++;
                              if(hour>=12)
                              {
                                  if(aorp == 0x0a)
                                  {
                                      hour = 0;
                                      aorp = 0x10;
                                  }
                                  else 
                                  {
                                      hour = 0;
                                      aorp = 0x0a;
                                  }
                              }
                              break;
                          default: break;     
                      }
                  }
                  if (aorc==1)
                  {
                      switch (mode)
                      {
                          case 0x00:break;
                          case 0x01:
                              aminute++;
                              if(aminute==60)
                              {aminute=0;}
                              break;
                          case 0x02:
                              ahour++;
                              if(ahour>=12)
                              {
                                  if(aaorp == 0x0a)
                                  {
                                      ahour = 0;
                                      aaorp = 0x10;
                                  }
                                  else 
                                  {
                                      ahour = 0;
                                      aaorp = 0x0a;
                                  }
                              }
                              break;
                          default: break;     
                      }
                  } 
              }
			  if(keynum==3)
              {
                  if (aorc==0)//当前显示是时钟吗?
                  {
                      switch (mode)
                      {
                          case 0x00:break;
                          case 0x01:
                              second--;
                              if(second==0xff)
                              {second=59;}
                              break;
                          case 0x02:
                              minute--;
                              if(minute==0xff)
                              {minute=59;}
                              break;
                          case 0x03:
                              hour--;
                              if(hour==0xff)
                              {
                                  if(aorp == 0x0a)
                                  {
                                      hour = 11;
                                      aorp = 0x10;
                                  }
                                  else 
                                  {
                                      hour = 11;
                                      aorp = 0x0a;
                                  }
                              }
                              break;
                          default: break;     
                       }
                  }
                  if (aorc==1)//当前显示是闹钟吗?
                  {
                      switch (mode)
                      {
                          case 0x00:break;
                          case 0x01:
                              aminute--;
                              if(aminute==0xff)
                              {aminute=59;}
                              break;
                          case 0x02:
                              ahour--;
                              if(ahour==0xff)
                              {
                                  if(aaorp == 0x0a)
                                  {
                                      ahour = 11;
                                      aaorp = 0x10;
                                  }
                                  else 
                                  {
                                      ahour = 11;
                                      aaorp = 0x0a;
                                  }

⌨️ 快捷键说明

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