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

📄 fff.c

📁 汽车专用电子钟程序
💻 C
字号:
                   
/***************************lns主程序snl***************************/
#include <absacc.h>      //包含头文件
#include <reg52.h>        //包含头文件
/***************************数据类型定义***************************/
#define uchar unsigned char      //数据类型定义
/*************************定义变量并初始化*************************/
uchar n=31;                         //定义月份天数变量并初始化
uchar ms=0;                         //定义毫秒变量并初始化
uchar h1=0,m1=0,s1=0;               //定义计时时、分、秒变量并初始化
uchar h2=0,m2=1,s2=1;               //定义定时时、分、秒变量并初始化 
uchar year=7,month=9,day=8;         //定义年、月、日变量并初始化
uchar wday=6;                       //定义星期变量并初始化
uchar *h=&h1,*m=&m1,*s=&s1;         //定义显视位变量并初始化
uchar *p;                           //定义调节指针
uchar k1=0,k2=0,k3=0,k4=0,k5=0;     //定义控制变量并初始化
uchar counter=0;                    //定义铃声节拍变量并初始化
uchar count=0;                      //定义铃声音符变量并初始化
sbit sound=P1^0;                   //定义铃声输出位
uchar a[8]={1,2,3,4,5,6,7};      //定义显视输出位数组并初始化
uchar code tt[12]={
                   0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                   0x7d,0x07,0x7f,0x6f,0x40,0x00
      };                //数码管显视代码
uchar code array[]={
                 0x18, 0x30, 0x1C, 0x10, 0x20, 0x40, 0x1C, 0x10, 
                 0x18, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x18, 0x40, 
                 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x20, 0x18, 0x20,
                 0x20, 0x80, 0xFF, 0x00, 0x20, 0x30, 0x1C, 0x10, 
     0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 
     0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 
     0x20, 0x20, 0x30, 0x80, 0xFF, 0x00, 0x20, 0x20,
     0x1C, 0x10, 0x18, 0x10, 0x20, 0x20, 0x26, 0x20,
     0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x20,
     0x1C, 0x10, 0x18, 0x10, 0x20, 0x20, 0x26, 0x20,
     0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x30,
     0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20,
     0x20, 0x20, 0x26, 0x40, 0x20, 0x20, 0x2B, 0x20,
     0x26, 0x20, 0x20, 0x20, 0x30, 0x80, 0x20, 0x30,
     0x1C, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x20, 0x20,
     0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 
     0x20, 0x15, 0x1F, 0x05, 0x20, 0x10, 0x1C, 0x10, 
     0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20,
     0x2B, 0x40, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20,
     0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40,
     0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20, 0x20,
     0x30, 0x30, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x40,
     0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x13, 0x60, 
     0x18, 0x20, 0x15, 0x40, 0x13, 0x40, 0x18, 0x80,
     0x00, 0x00
                };                  //array[i]=0x00 代表歌曲演唱完毕
                        //array[i]=0xff 代表是休止符
/*******************************************************************
* 函数名称:leap()
* 功    能:计算二月份天数
* 入口参数:year
* 出口参数:无
*******************************************************************/ 
uchar leap(uchar year)     //判断是否闰年并返回二月份的天数
          {          //闰年返回29,平年返回28
     year+=2000;
           if(year%4==0)
             {if(year%100==0)
                {if(year%400==0)
                      return 29;
                 else return 28;
                }
              else return 29;
             }
           else return 28;
          }
/*******************************************************************
* 函数名称:mon()
* 功    能:计算并返回每个月的天数
* 入口参数:month
* 出口参数:无
*******************************************************************/ 
uchar mon(uchar month)           //计算并返回每个月的天数
         {
          switch(month)
                {
        case 1:
                 case 3:
                 case 5:
                 case 7:
                 case 8:
                 case 10:
                 case 12:return 31;break;      //1,3,5,7,8,10,12月每月31天
                 case 4:
                 case 6:
                 case 9:
                 case 11:return 30;break;   //4,6,9,11月每月30天
                 case 2: return leap(year);break;//返回二月份的天数
                 default:break;
                }
         }
/*******************************************************************
* 函数名称:music()
* 功    能:音乐节拍控制
* 入口参数:无
* 出口参数:无
*******************************************************************/           
void music(void)          //铃声音乐
          {
      counter++;                //节拍次数计数 
      if(counter>=array[count+1])     //节拍次数判断
     {
      count+=2;        //音符变换
      counter=0;        //清0节拍数
         if(count>=192)       //判断是否唱完一曲
         count=0;        //返回第一个音符
     } 
    }
/*******************************************************************
* 函数名称:timer1()
* 功    能:音乐频率设置
* 入口参数:无
* 出口参数:无
*******************************************************************/ 
void timer1(void)interrupt 1 using 1     //音调设置
           {
      sound=~sound;        //铃声输出
      TH0=(0xffff-30*array[count])>>8;   //音频设置
    TL0=(0xffff-30*array[count])&0xff; 
    }
/*******************************************************************
* 函数名称:timer3()
* 功    能:中断计时
* 入口参数:无
* 出口参数:无
*******************************************************************/              
void timer3(void) interrupt 3 using 3      //计时中断
           {
      TH1=0xd8;                          //计数器初值重载
            TL1=0xef;          //定义单位节拍的延时大小为10ms
               
    if(k5)music();        //调用闹铃音乐lns
    else TR0=0;         //达到所设闹铃时间长度关铃声
    
   if(++ms==100)        //计时一秒钟
              {ms=0;    
               if(++s1==60)        //计时一分钟
                 {s1=0;
      if(++m1==60)       //计时一小时
                    {m1=0;
                     if(++h1==24)      //计时一天
                       {h1=0;

                        n=mon(month);     //取每月的天数

                        if(++day>n)      //计时一个月
                          {day=1;
                           if(++month>12)    //计时一年
                             {month=1;
                              year++;
                             }
                          }
                        if(++wday>6)     //星期计数
                           wday=0;
                       }
                    }
      k5--;            //闹铃时间长度倒记时
         if(h1==h2&&m1==m2)           //判断是否到定时时刻 
                    {
         TR0=1;              //开铃声中断lns
         k5=s2;              //设置闹铃时间长度
           } 

                 }
              }
           
           }
/*******************************************************************
* 函数名称:d3()
* 功    能:数码管输出显示
* 入口参数:无
* 出口参数:无
*******************************************************************/ 
void d3(void)             //显示输出
       {
        uchar sel=0x80,i ;          //定义sel为位选通变量并初使化
   if(k2)             //判断是否处于调时状态
    {
     if(k2==4)a[0]=a[1]=a[4]=a[6]=a[7]=10;    //星期显示设置
     if(k1&&(k3--==0)) k3=255;       //设置位调节闪烁初值
    }
        for(i=0;i<=8;i++)          //循环显示八个数码管
           {
      P2=0xff;           //清屏
            P0=tt[a[i]];          //输出显示数值
            if(k1&&(k3>200))         //判断是否闪烁
               if     (k1==1&&(i==6||i==7))P2=0xff; //时位闪烁
            else if(k1==2&&(i==3||i==4))P2=0xff; //分位闪烁
            else if(k1==3&&(i==0||i==1))P2=0xff; //秒位闪烁
             else P2=~sel;          //非闪烁状态
            else P2=~sel;          //非闪烁状态
            sel=sel>>1;           //显示位移位
           }
       }
/*******************************************************************
* 函数名称:d2()
* 功    能:循环调用
* 入口参数:无
* 出口参数:无
*******************************************************************/        
void d2(void)
       {
     while(1)
             { 
              a[0]=*s%10;   //给显示数组赋值
              a[1]=*s/10;
              a[2]=10;
              a[3]=*m%10;
              a[4]=*m/10;
              a[5]=10;
              a[6]=*h%10;
              a[7]=*h/10;

              d3();     //调用显示输出函数 
    }
    }
/*******************************************************************
* 函数名称:d1()
* 功    能:中断设置
* 入口参数:无
* 出口参数:无
*******************************************************************/ 
void d1(void)      
       {
     TMOD=0x11;
        TH1=0xff; TH0=0xff;
        TL1=0xff; TL0=0xff;
       IE=0x8f;
     TR1=1;      
   IT0=1;   IT1=1;
        IP=0x02;
       }
/*******************************************************************
* 函数名称:main()
* 功    能:程序入口,调用功能子函数
* 入口参数:无
* 出口参数:无
*******************************************************************/            
void main(void)
         { 
          d1();      //调用中断位设置函数
       d2();                 
         }
/*******************************************************************
* 函数名称:d5()
* 功    能:切换显示菜单
* 入口参数:无
* 出口参数:无
*******************************************************************/
void d5(void)             //显示菜单调节函数
       {
     switch(k2)
        {
      case 1:{h=&h1; m=&m1;   s=&s1; }break;//菜单1:显示时钟时间
      case 2:{h=&h2; m=&m2;   s=&s2; }break;//菜单2:显示定时时刻 
      case 3:{h=&year;m=&month;s=&day; }break;//菜单3:显示日历年月日
      case 4:{h=&wday;m=&wday; s=&wday;}break;//菜单4:显示星期0--6
      default:{k2=0;h=&h1;m=&m1;s=&s1; }break;//复位显示
     }
    }
/*******************************************************************
* 函数名称:d7()
* 功    能:调节限制,防止数值调节超出值域
* 入口参数:无
* 出口参数:无
*******************************************************************/          
void d7(void)             //调节限制函数
       {
        if(k2==1||k2==2)          //计时与定时限制
           if     (k1==1&&*p>=24) *p=0;       //小时限制
           else if(*p>=60) *p=0;        //分、秒限制
        if(k2==3)            //日历限制
           if     (k1==1&&*p>=100)*p=0;       //年限制
           else if(k1==2&&*p>12) *p=1;       //月限制
           else if(k1==3&&*p>n)   *p=1;       //日限制
        if(k2==4)            
           if     (k1==2&&*p>6)   *p=0;       //星期限制
                   
       }
/*******************************************************************
* 函数名称:timer0()
* 功    能:菜单切换及位加数调节
* 入口参数:无
* 出口参数:无
*******************************************************************/          
/**外部中断1调节函数**/            
void timer0(void)interrupt 0 using 0 //外部中断0调节
           {        
            if(k1)       //判断是位调节还是菜单调节
     {          
      (*p)++;     //位加数调节
       d7();     //调用调节限制函数
     }          
            else         
     {         
      k2++;     //菜单加数调节
      d5();     //调用调节菜单
     }         
           }
/*******************************************************************
* 函数名称:timer2()
* 功    能:调节位选择及关铃声
* 入口参数:无
* 出口参数:无
*******************************************************************/                        
void timer2(void)interrupt 2 using 2 //外部中断1调节
           {        
      TR0=0;k5=0;     //手动关铃声
            if(k2)      //断是否处于调节状态
           {       
         if   (k2==4){k1++;} //期调节位选择
            if   (++k1==1) p=h; //选择时位
               else if(k1==2) p=m; //选择分位
               else if(k1==3) p=s; //选择秒位
               else    k1=0;      //复位
        }       
           }
/***************************lns主程序snl***************************/
 

⌨️ 快捷键说明

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