欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機電子鬧鐘程序 [打印本頁]

作者: shipeng22022    時間: 2015-6-17 12:13
標題: 單片機電子鬧鐘程序
//****************頭文件及宏定義*******************************
#include <reg51.h>
#define   uchar  unsigned char
#define   uint   unsigned int
//****************軟件延時程序*********************************
void delay(uint ii)
        { while(--ii); }
//****************定義數碼管驅動碼******************************
uchar duan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0XBF,0XFF,0X7F}; //段選,0  1  2  3  4  5  6  7  8  9  -  滅 .
uchar  wei[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//位選,共陽,從右至左
//****************定義變量**************************************
uchar t=0,sec=0,min=0,hour=0;        //正常走時時間變量
uchar sec1=0,min1=0,hour1=0;     //時間設定值變量
uchar sec2=0,min2=0,hour2=0;     //鬧鐘設定值變量
uchar alarm_en=0;                //鬧鐘開關變量
uchar alarm_flag=0;              //鬧鐘定時到達標志變量
uchar p3=0,moshi=0,mov=0;        //P3口查詢,模式值,調整位
//顯示緩沖區,依次為正常、調時、鬧鐘設定、調整位帶點標記
uchar temp[8],temp1[8],temp2[8],temp3[8];
//****************函數聲明*************************************
void  initialize(void);          //初始化
void  show(void);                //正常走時顯示
void  show1(void);               //時間設定顯示
void  show2(void);               //鬧鐘設定顯示
void  show3(void);               //調整位標記
void  show4(void);               //鬧鐘開關標記
void  keyscan(void);             //鍵盤掃描
void  add(void);                 //調時調鬧鐘加數程序
void  confirm(void);             //調時確認,鬧鐘開關
void  alarm_judge(void);         //鬧鐘定時到達判定
void  beep(void);                //鬧鐘響鈴程序
//******************主函數***************************
void main()
{
   initialize();
   while(1)
       {
              keyscan();
                 alarm_judge();
                 switch(moshi)
                       {
                              case 0:show(); show4();break;         //顯示正常走時
                                 case 1:show1();show3();break;    //顯示設置時間
                                 case 2:show2();show3();break;    //顯示鬧鐘時間
                           }
                 if(alarm_flag==1 && alarm_en==1)                 //定時時間到達且鬧鐘打開
                       {  beep(); }
           }
}
//*****************定時器初始化**************************
void initialize(void)
{
   TMOD = 0x01;
    TH0 = 0X3C;
    TL0 = 0XB0;           //50ms
    ET0 = 1;
     EA = 1;
TR0 = 1;

        P1=0X7F;         //初始化時關掉蜂鳴器
    alarm_flag=alarm_en=0;
}
//*****************定時器T0中斷服務程序****************
void Timer0(void) interrupt 1
{   
   TL0 = 0XB0;
   TH0 = 0X3C;

   t++;
   if(t==20)                // (50ms*20=1s)
          { t=0;   sec++; }      
   if(sec==60)              // 秒為60,則清零,分加1
          { sec=0; min++; }
   if(min==60)              // 分為60,則清零,時加1
          { min=0; hour++;}
   if(hour==24)             // 時為24,則清零
          { hour=0;}

   if(sec1==60)  
          { sec1=0; min1++; }
   if(min1==60)  
          { min1=0; hour1++;}
   if(hour1==24)
          { hour1=0;}

   if(sec2==60)  
          { sec2=0; min2++; }
   if(min2==60)  
          { min2=0; hour2++;}
   if(hour2==24)
          { hour2=0;}
}
//******************正常時間顯示程序*******************
void show(void)
{
    uchar i=0;

     temp[0]=sec%10;
        temp[1]=sec/10;
        temp[2]=10;
     temp[3]=min%10;
     temp[4]=min/10;
        temp[5]=10;
        temp[6]=hour%10;
        temp[7]=hour/10;

    for(i=0;i<8;i++)
        {
              P2=wei[i];
              P0=duan[temp[i]];
              delay(100);
        }
}
//******************調時模式顯示程序*******************
void show1(void)
{
    uchar i=0;
         
     temp1[0]=sec1%10;
        temp1[1]=sec1/10;
        temp1[2]=10;
     temp1[3]=min1%10;
     temp1[4]=min1/10;
        temp1[5]=11;
        temp1[6]=hour1%10;
        temp1[7]=hour1/10;

    for(i=0;i<8;i++)
        {
              P2=wei[i];
              P0=duan[temp1[i]];
              delay(100);
        }
}

//******************鬧鐘設定模式顯示程序*******************
void show2(void)
{
    uchar i=0;

     temp2[0]=sec2%10;
        temp2[1]=sec2/10;
        temp2[2]=11;
     temp2[3]=min2%10;
     temp2[4]=min2/10;
        temp2[5]=10;
        temp2[6]=hour2%10;
        temp2[7]=hour2/10;

    for(i=0;i<8;i++)
        {
              P2=wei[i];
              P0=duan[temp2[i]];
              delay(100);
        }
}

//******************調整位標記顯示程序*******************
void show3(void)
{
     uchar movv=0;
     switch(mov)
               {
                     case 0:movv=0;        break;
                         case 1:movv=3;        break;
                         case 2:movv=6;        break;
                   }
     P2=wei[movv];
        P0=duan[12];
        delay(100);
}
//*********************鬧鐘開閉顯示程序*******************
void show4(void)
{
   if(alarm_en==1)
     {
        P2=wei[2]+wei[5];
           P0=duan[12];  
           delay(100);
         }   
}
//******************鍵盤掃描程序***********************
void keyscan(void)
{
          P3=0XFF;
       p3=P3;
   if(p3==0XFF) return;

   if(p3==0XFE)                //key_mode鍵
      {
            delay(10);
                if(p3==0XFE)
                  {
                    moshi++;
                        if(moshi>=3) moshi=0;                       
                  }
                while(p3==0XFE)   // key_mode鍵按下到彈起期間
                   {
                     p3=P3;
                         switch(moshi)
                       {
                             case 0:show(); break;           //顯示正常走時
                                 case 1:show1();break;    //顯示設置時間
                                 case 2:show2();break;    //顯示鬧鐘時間
                           }
                   }             
          }

   if(p3==0XFD)            //key_add鍵
      {
            delay(10);
                if(p3==0XFD)
                  {
                        add();
                  }

                while(p3==0XFD)    // key_add鍵按下到彈起期間
                   {
                         p3=P3;
                         switch(moshi)
                       {
                             case 0:show(); break;           //顯示正常走時
                                 case 1:show1();break;    //顯示設置時間
                                 case 2:show2();break;    //顯示鬧鐘時間
                           }
                   }            
          }

   if(p3==0XFB)                 //key_move鍵
      {
            delay(10);
                if(p3==0XFB)
                  {
                         mov++;
                         if(mov>=3) mov=0;                         
                  }
                while(p3==0XFB)   // key_move鍵按下到彈起期間
                    {
                          p3=P3;
                          switch(moshi)
                       {
                              case 0:show(); break;           //顯示正常走時
                                 case 1:show1();break;    //顯示設置時間
                                 case 2:show2();break;    //顯示鬧鐘時間
                           }
                    }            
          }

   if(p3==0XF7)            //key_confirm鍵
      {
            delay(10);
                if(p3==0XF7)
                  {
                        confirm();
                  }
                while(p3==0XF7)       // key_confirm鍵按下到彈起期間
                   {
                     p3=P3;
                         switch(moshi)
                       {
                             case 0:show(); break;           //顯示正常走時
                                 case 1:show1();break;    //顯示設置時間
                                 case 2:show2();break;    //顯示鬧鐘時間
                           }
                   }             
          }
}  

//******************調時調腦鐘增數程序***********************
void  add(void)
{
  //模式1,調時模式,調時增數
  if(moshi==1 && mov==0)
    {sec1++;}  
  if(moshi==1 && mov==1)
    {min1++;}
  if(moshi==1 && mov==2)
    {hour1++;}

  //模式2,鬧鐘設定模式,鬧鐘增數                
  if(moshi==2 && mov==0)
    {sec2++;}  
  if(moshi==2 && mov==1)
    {min2++;}
  if(moshi==2 && mov==2)
    {hour2++;}         
}



//******************確認鍵服務函數***************************
void  confirm(void)
{
  if(moshi==1)                 //模式1,調時環境下校正時間
    {
          t=TF0=0;
          sec=sec1;
      min=min1;
      hour=hour1;
      sec1=min1=hour1=0;
        }

  alarm_en++;         //開閉鬧鐘
  if(alarm_en>1) alarm_en=0;
}

//******************鬧鐘判斷函數******************************
void  alarm_judge(void)
{
   if(hour==hour2 && min==min2 && sec==sec2 )         //定時到達設定標志
          { alarm_flag=1; }
   if(hour==hour2 && min==min2+1)                  //常規響鈴一分鐘
          { alarm_flag=0; }          
}

//******************鬧鐘響鈴函數******************************
void  beep(void)
{
        P1=!P1;
}



作者: 想不到是我吧    時間: 2015-6-18 09:07
樓豬有沒有仿真圖
作者: denminshen    時間: 2015-6-20 11:52
不錯!學習學習,有仿真圖就更好了.
作者: 1677012963    時間: 2015-6-21 20:30
樓主這程序有點小問題!上電后,按下鬧鈴鍵后鬧鐘立馬就響了。我找了一下問題可能是初次掃描時 hour==hour2 && min==min2 && sec==sec2, 導致alarm_flag=1; 因為在定義和初始化時 t=0,sec=0,min=0,hour=0;        
uchar sec1=0,min1=0,hour1=0;     
uchar sec2=0,min2=0,hour2=0;
不知道對不對!求指教~~~
作者: 1677012963    時間: 2015-6-21 20:40
1677012963 發表于 2015-6-21 20:30
樓主這程序有點小問題啊!上電后,按下鬧鈴鍵后鬧鐘立馬就響了。我找了一下問題可能是初次掃描時 hour==hou ...

不好意思!新人沒多少黑幣~
作者: 謙虛請教    時間: 2015-6-22 12:01
你有更詳細的資料嗎》?
作者: fly月餅    時間: 2015-6-22 22:11
贊一個
作者: 1677012963    時間: 2015-6-24 00:19
謙虛請教 發表于 2015-6-22 12:01
你有更詳細的資料嗎》?

什么意思?程序不都在上面立嗎,注釋得很詳細~
作者: 532415834    時間: 2015-6-24 14:32
仿真圖有嗎
作者: 532415834    時間: 2015-6-24 14:32
需要一個 期末作品覺得你這個挺好的
作者: wangxiaomi    時間: 2015-11-1 20:02
為什么沒有原理圖呢
作者: hoanghajery    時間: 2017-5-1 16:29

 樓主能分享一下原理圖嗎?
作者: 看著我    時間: 2017-7-12 11:05
請問有原理圖嗎?
作者: adbac    時間: 2020-6-11 14:10
有沒有仿真圖?
作者: i8am    時間: 2024-11-24 23:02
1677012963 發表于 2015-6-21 20:40
**** 作者被禁止或刪除 內容自動屏蔽 ****

當時的新人如今已經是大佬了,感覺是這樣的
作者: STC莊偉    時間: 2024-11-25 09:18
最近好多同學都在跟郭老師學 神奇鬧鐘啊





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1