久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9381|回復: 16
收起左側

單片機電子鬧鐘程序

  [復制鏈接]
ID:83249 發表于 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;
}


評分

參與人數 2威望 +2 黑幣 +51 收起 理由
1677012963 + 2 + 1 贊一個!
admin + 50 共享資料的積分獎勵!

查看全部評分

回復

使用道具 舉報

ID:83328 發表于 2015-6-18 09:07 | 顯示全部樓層
樓豬有沒有仿真圖
回復

使用道具 舉報

ID:69408 發表于 2015-6-20 11:52 | 顯示全部樓層
不錯!學習學習,有仿真圖就更好了.
回復

使用道具 舉報

ID:83478 發表于 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;
不知道對不對!求指教~~~
回復

使用道具 舉報

ID:83478 發表于 2015-6-21 20:40 | 顯示全部樓層
1677012963 發表于 2015-6-21 20:30
樓主這程序有點小問題啊!上電后,按下鬧鈴鍵后鬧鐘立馬就響了。我找了一下問題可能是初次掃描時 hour==hou ...

不好意思!!新人沒多少黑幣~
回復

使用道具 舉報

ID:82937 發表于 2015-6-22 12:01 | 顯示全部樓層
你有更詳細的資料嗎》?
回復

使用道具 舉報

ID:83649 發表于 2015-6-22 22:11 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:83478 發表于 2015-6-24 00:19 | 顯示全部樓層
謙虛請教 發表于 2015-6-22 12:01
你有更詳細的資料嗎》?

什么意思啊?程序不都在上面立嗎,注釋得很詳細~
回復

使用道具 舉報

ID:83784 發表于 2015-6-24 14:32 | 顯示全部樓層
仿真圖有嗎
回復

使用道具 舉報

ID:83784 發表于 2015-6-24 14:32 | 顯示全部樓層
需要一個 期末作品覺得你這個挺好的
回復

使用道具 舉報

ID:94340 發表于 2015-11-1 20:02 | 顯示全部樓層
為什么沒有原理圖呢
回復

使用道具 舉報

ID:191450 發表于 2017-5-1 16:29 | 顯示全部樓層

 樓主能分享一下原理圖嗎?
回復

使用道具 舉報

ID:218694 發表于 2017-7-12 11:05 | 顯示全部樓層
請問有原理圖嗎?
回復

使用道具 舉報

ID:775574 發表于 2020-6-11 14:10 | 顯示全部樓層
有沒有仿真圖?
回復

使用道具 舉報

ID:1136663 發表于 2024-11-24 23:02 | 顯示全部樓層
1677012963 發表于 2015-6-21 20:40
**** 作者被禁止或刪除 內容自動屏蔽 ****

當時的新人如今已經是大佬了,感覺是這樣的
回復

使用道具 舉報

ID:961114 發表于 2024-11-25 09:18 | 顯示全部樓層
最近好多同學都在跟郭老師學 神奇鬧鐘啊
51hei20241125-091810.png
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕av一区 | 亚洲精品久久久久久久久久吃药 | 久久亚洲综合 | 亚洲精品久久久久中文字幕二区 | 久久久久国产一区二区三区四区 | 欧美成人精品一区 | 伊人春色在线 | 在线免费中文字幕 | 九九99久久 | 成人三级电影 | 亚洲一区二区 | 九九九视频在线观看 | 欧洲尺码日本国产精品 | 国产精品一区二区在线 | 偷拍亚洲色图 | 一区二区小视频 | 99国产精品久久久 | 在线播放国产一区二区三区 | 精品日韩一区二区三区 | 国产美女在线观看 | 天天欧美| 精品久久久久久亚洲综合网站 | 一区二区三区免费 | 欧美日韩黄色一级片 | 香蕉国产在线视频 | 成年免费大片黄在线观看岛国 | 亚洲一二三区免费 | 欧美成人h版在线观看 | 中文字幕一区二区三区四区 | 成人av高清在线观看 | 亚洲国产成人av好男人在线观看 | 成人福利网 | 精品久久久一区二区 | 91传媒在线观看 | 久久精品福利 | 亚洲国产精品成人无久久精品 | 日韩精品在线一区 | 欧美中文字幕在线 | 精品久久久久国产 | 精品视频久久久 | 久久国产一区二区三区 |