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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

可自定義 小時:分鐘的1602鬧鐘程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2010年07月06日   【字體:

      本程序還是在原有基礎上小修改了一下,去掉了星期顯示,把原來整點鬧鐘改成了可自由設定小時+分鐘的鬧鐘,其他的功能還是不變。

       功能:時間,時分鬧鐘設置,上下限溫度設置,溫度顯示。

       鬧鐘可設置到分鐘,響鈴時間還是10秒鐘。

        可擴展功能:音樂響鈴,一個星期中的任何一天鬧鐘設定,需要添加或者修改一下程序即可,程序只是簡單的整理了一下,很多地方很亂,需要程序的朋友最好有較好的編程能力,否者很難理解程序的寫作思維。


仿真圖

完整的源代碼下載: http://www.zg4o1577.cn/ziliao/file/1602_naoz.rar 
 


#include"reg51.h"
#define uchar unsigned char 
#define uint unsigned int 


   sbit BEEP=P3^7;    //// 定義蜂鳴器口

   unsigned char L,H,Z,Y;     //// 定義高低溫度變量


/////////////////////////////////////////////////////////////////////////////////////////////////

 /**********報警聲音**************/

 bi(uint t)
   {
    int c,n;
    for(c=0;c<t;c++)
    {
     for(n=0;n<50;n++);
     BEEP=~BEEP;      //按位取反BEEP
    }
 return(t);
   }

 


///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////


/**********18b20溫度程序**********/ 

   sbit DQ=P3^6;       //定義溫度數據口
    int xs;      //定義小數 
   unsigned int temp,temp1,temp2;  //定義溫度轉換變量     


 //////////////////////////////////////////////////////////////////////////////////////////////

   /*********18B20延時程序************/

  void delay_18B20(unsigned int i)
     {
      while(i--);
     }

//////////////////////////////////////////////////////////////////////////////////////////////

/*********ds18b20初始化函數*********/

void Init_DS18B20(void)  
   {
      unsigned char x=0;
      DQ = 1;          //DQ復位 ds18b20通信端口 
      delay_18B20(8);  //稍做延時
      DQ = 0;          //單片機將DQ拉低 
      delay_18B20(80); //精確延時 大于 480us
      DQ = 1;          //拉高總線
      delay_18B20(4);
      x=DQ;            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
      delay_18B20(20);
   }

///////////////////////////////////////////////////////////////////////////////////////////

/********ds18b20讀一個字節**********/

unsigned char ReadOneChar(void)
   {
     unsigned char i=0,dat = 0;
     for (i=8;i>0;i--)
     {
       DQ = 0;    //高電平拉成低電平時讀周期開始
       dat>>=1;
       DQ = 1;    //給脈沖信號
       if(DQ)
       dat|=0x80;  
       delay_18B20(4);
     }
     return(dat);
   }

//////////////////////////////////////////////////////////////////////////////////////////

/*************ds18b20寫一個字節****************/

void WriteOneChar(unsigned char dat)
 {
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
     DQ = 0;         //從高電平拉至低電平時,寫周期的開始
     DQ = dat&0x01;  //數據的最低位先寫入
     delay_18B20(5); //60us到120us延時
     DQ = 1;        
     dat>>=1;        //從最低位到最高位傳入
   }
 }


////////////////////////////////////////////////////////////////////////////////////////////

/**************讀取ds18b20當前溫度************/

void ReadTemperature(void)
 {
    unsigned char a=0,b=0,t=0;

    Init_DS18B20 ( );
    WriteOneChar ( 0xCC );       // 跳過讀序號列號的操作
    WriteOneChar ( 0x44 );       // 啟動溫度轉換
    delay_18B20  ( 100  );       // this message is wery important
    Init_DS18B20 ( );
    WriteOneChar ( 0xCC );       //跳過讀序號列號的操作
    WriteOneChar ( 0xBE );       //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
    delay_18B20  ( 100  );
    a=ReadOneChar( );            //讀取溫度值低位
    b=ReadOneChar( );            //讀取溫度值高位

    temp1 = b<<4;                //高8位中后三位數的值
    temp1+= ( a&0xf0 )>>4;       //低8位中的高4位值加上高8位中后三位數的值   temp1室溫整數值
    temp2 = a&0x0f;              //小數的值
    temp  = ( ( b*256+a ) >>4 ); //當前采集溫度值除16得 實際溫度值    zhenshu    
    xs=temp2*0.0625*10;          //小數位,若為0.5則算為5來顯示   xs小數    xiaoshu      
 }


/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

 


/*********************1602液晶程序********************/
 

/******定義液晶控制口*******/ 
 
    sbit lcdrs=P2^5;   //定義液晶三個控制口
    sbit lcdrw=P2^6;
    sbit lcden=P2^7;

    sbit K1=P3^0;     //定義三個開關
 sbit K2=P3^1;
 sbit K3=P3^2;
 /////////////////////////////////////////////////////////////////////////////////////////////////

/******定義變量*******/
  
uchar count,shi,fen,miao,xq,K1num;   //定義時間程序里所需要的變量


/////////////////////////////////////////////////////////////////////////////////////////////////

/******定義數組*******/

 // uchar code table [ ]= "H:38 L:25 00 Q:7";    //液晶界面顯示的內容
 // uchar code table1[ ]= "23:59:55    .  C";

  uchar code table [ ]= "01:00:55   01-01";    //液晶界面顯示的內容
  uchar code table1[ ]= "H:38 L:25   .  C";
//////////////////////////////////////////////////////////////////////////////////////////////////

/******延時程序*******/ 
 
  void delay(uint m)    //液晶延時程序
     {
        uint i,j;
      for(i=m;i>0;i--)
     for(j=110;j>0;j--);
     }
///////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////// 

/**********寫指令*************/ 
  void write_com(uchar com)
      {
         lcdrs=0;
         lcdrw=0;
         lcden=0;
         P0=com;
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
      }

 /////////////////////////////////////////////////////////////////////////////////////

/************寫數據*************/ 

  void write_data(uchar date)
      {
         lcdrs=1;
         lcdrw=0;
         lcden=0;
         P0=date;
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
      }


///////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

 /***************液晶顯示程序***************/  
  
   /*********時分秒數的分離**********/ 
    
  void write_sfm(uchar add,uchar date)
      { 
        uchar shi,ge;     //分離數字,如35,分成3和5  
     shi=date/10;     
      ge=date%10;     
        write_com  ( 0x80+add  );    
        write_data ( 0x30+shi  );       
     write_data ( 0x30+ge   );       
      }

 //////////////////////////////////////////////////////////////////

/**********星期***********/ 

   void write_xq(uchar add1,uchar date1)
       {
          uchar ge;      //星期只需要一個數字顯示   
       ge=date1%10;    
          write_com  ( 0x80+add1 );    
        write_data ( 0x30+ge   );      
       }
  

  ////////////////////////////////////////////////////////////////
 
 /************高溫低溫數的分離************/

  void write_HL(uchar add2,uchar date2)
     {
         uchar shi,ge;   
      shi=date2/10;     
       ge=date2%10;      
         write_com(0x80+0x40+add2);     
      write_data(   0x30+shi  );  
      write_data(   0x30+ge   );   
     }
 
  /////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////
 
 /***************按鍵調時程序***************/ 
   
   void keycan()
    {
         /**********功能選擇**********/ 
      if( K1==0    ) { K1num++; delay(1); if( K1==0 ) {  while(!K1);bi(200);
 
   if( K1num==1 ) { TR0=0; write_com ( 0x80+1 ); write_com(0x0f); }  //時
   if( K1num==2 ) { write_com ( 0x80+4 ); }        //分
   if( K1num==3 ) { write_com ( 0x80+7 );  }       //秒
   //if( K1num==4 ) { write_com ( 0x80+11 );  }       //星期
   if( K1num==4 ) { write_com ( 0x80+12 );  }       //鬧鐘
   if( K1num==5 ) { write_com ( 0x80+15 );  }
   if( K1num==6 ) { write_com ( 0x80+0x40+3 );  }      //上限
   if( K1num==7 ) { write_com ( 0x80+0x40+8 );  }      //下限
   if( K1num==8 ) { K1num=0; write_com(0x0c); TR0=1; }     //退出設置
       } 
      }

/////////////////////////////////////////////////////////////////////////////////////////////////

         /*********功能加*********/ 
     
       if( K1num!=0 ) {
         if( K2==0    ) { delay(1);
         if( K2==0    ) { while(!K2);bi(200);

   if( K1num==1 ) { shi++;    if(  shi==24 )   shi=0;  write_sfm ( 0,shi );  write_com ( 0x80+1 ); }      
         if( K1num==2 ) { fen++;    if(  fen==60 )   fen=0;  write_sfm ( 3,fen );  write_com ( 0x80+4 ); }
      if( K1num==3 ) { miao++;   if( miao==60 )  miao=0;  write_sfm ( 6,miao);  write_com ( 0x80+7 ); }
      //if( K1num==4 ) { xq++;     if(   xq==8  )    xq=1;  write_xq  (11,xq  );  write_com ( 0x80+11); }
   if( K1num==4 ) {  Z++;     if(    Z==24 )     Z=0;  write_sfm (11,Z   );  write_com ( 0x80+12); }
   if( K1num==5 ) {  Y++;     if(    Y==60 )     Y=0;  write_sfm (14,Y   );  write_com ( 0x80+15); }
   if( K1num==6 ) {  H++;     if(    H==100)     H=0;  write_HL  ( 2,H   );  write_com ( 0x80+0x40+3);}
   if( K1num==7 ) {  L++;     if(    L==100)     L=0;  write_HL  ( 7,L   );  write_com ( 0x80+0x40+8);}
   
    }
      }
     } 
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         /**********功能減************/ 
      if(K1num!=0)  {
      if(K3==0   )  { delay(1);
      if(K3==0   )  { while(!K3); bi(200);

   if( K1num==1 ) { shi--;    if(  shi==-1 )   shi=23;  write_sfm ( 0,shi );  write_com ( 0x80+1 ); }      
         if( K1num==2 ) { fen--;    if(  fen==-1 )   fen=59;  write_sfm ( 3,fen );  write_com ( 0x80+4 ); }
      if( K1num==3 ) {miao--;    if( miao==-1 )  miao=59;  write_sfm ( 6,miao);  write_com ( 0x80+7 ); }
     // if( K1num==4 ) { xq--;     if(   xq==0  )     xq=7;  write_xq  (11,xq  );  write_com ( 0x80+11); }
         if( K1num==4 ) {  Z--;     if(    Z==-1 )     Z=23;  write_sfm (11,Z   );  write_com ( 0x80+12); }
   if( K1num==5 ) {  Y--;     if(    Y==-1 )     Y=59;  write_sfm (14,Y   );  write_com ( 0x80+15); }
   if( K1num==6 ) {  H--;     if(    H==-1 )     H=99;  write_HL  ( 2,H   );  write_com ( 0x80+0x40+3);}
   if( K1num==7 ) {  L--;     if(    L==-1 )     L=99;  write_HL  ( 7,L   );  write_com ( 0x80+0x40+8);}
   
    }
      }
     }
    }

////////////////////////////////////////////////////////////////////////////////////////////////////

/*************初始化**************/
 
  void init()
      {
        uchar num;  //定義一個變量num,用于下面數組的初始化//  
        lcden=0;
        write_com ( 0x38 );
        write_com ( 0x0c );   //不顯示光標  
        write_com ( 0x06 );   //光標向右邊自動移位  
        write_com ( 0x01 );   //清屏  

        shi=1; fen=00; miao=55;  //xq=7; 
  H=38; L=25; Z=1; Y=1;
        write_com ( 0x80 );     
               for( num=0; num<16; num++ )
                  { write_data( table[num]  );  delay(5); }

        write_com ( 0x80+0x40 );       
               for( num=0; num<16; num++ )
                  { write_data( table1[num] );  delay(5); }


 ///////////////////////////////////////////////////////////////////////////////////////
/********定時器初始化*************/ 

          TMOD=0x01; //定義定時器0,工作方式1  
          TH0=(65536-50000)/256;   //高8位  
          TL0=(65536-50000)%256;   //低8位  
          EA=1;     //開全局中斷  
          ET0=1;    
          TR0=1;    //打開定時器  
        }

 

///////////////////////////////////////////////////////////////////////////////////////////////////////

/***********定時器中斷函數************/
 
  void timer0() interrupt 1
   {
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
     count++;
   if( count==20 ) { count=0;    miao++;
   if(  miao==60 ) {  miao=0;     fen++; }  
   if(   fen==60 ) {   fen=0;     shi++; }  
   if(   shi==24 ) {   shi=0;      //xq++;
   //if(    xq==8  ) {    xq=1;    }  
        }      
   }
  }

 


///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

/*****************************************/


uchar code mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
/*  設定顯示位置           
/**************************************/
void lcd_pos(uchar pos)
{                          
  write_com(pos | 0x80) ;  //數據指針=80+地址變量
}

  /////////////////////////////////////////////////////////////////////////////
/*自定義字符寫入CGRAM   
/*********************************/
void  writetab()  
{  
    unsigned char i ;
    write_com(0x40) ;            //寫CGRAM
    for (i = 0 ; i< 8 ; i++)       
    write_data(mytab[ i ]) ;        
}

 

/////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

void wendu()  /////溫度顯示程序/////   
 {
     
        writetab(   ) ;          //自定義字符寫入CGRAM
        delay   ( 5 ) ;
        lcd_pos   ( 0x4e ) ;      //顯示圈圈
        write_data( 0x00 ) ;    //顯示自定義字符 
        write_com ( 0x0c );
        ReadTemperature();    
         
        write_com  ( 0x80+0x40+10 ); 
        write_data ( 0x30+temp/10 );

        write_com  ( 0x80+0x40+11 );
        write_data ( 0x30+temp%10 );
  
        write_com  ( 0x80+0x40+13 );
        write_data ( 0x30+xs%10   );


         /////時間顯示地址/////  
        
        
     
        write_sfm( 0,shi  ); 
  write_sfm( 3,fen  );
  write_sfm( 6,miao );
 // write_xq (11,xq   ); 
  } 


//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////

   //////溫度報警程序//////
  void baojing()
   {  
     if(H==temp)
    {
      bi(500);
       }
      if(L==temp)
    {
      bi(500);
       }
    if((Z==shi)&(Y==fen)&(miao<10))   //設定報警,響10秒鐘結束。
    {   
      
     {  
    bi(500);
    }
    }
   }


 //////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
 /***************主函數***************/ 
   void main()
     {
        init();
        while(1)  
        {
  keycan();
        wendu(); 
  baojing();
     }
    }

 

關閉窗口

相關文章

主站蜘蛛池模板: 中文字幕日本一区二区 | 欧美激情亚洲天堂 | 老牛影视av一区二区在线观看 | 狠狠婷婷综合久久久久久妖精 | 日本高清不卡视频 | 中文字幕高清视频 | 国产亚洲成av人在线观看导航 | 老司机精品福利视频 | 久久成人精品视频 | 精品久久久久久亚洲综合网 | 精品中文在线 | 国产亚洲精品精品国产亚洲综合 | 亚洲视频在线观看 | 99re国产| 亚洲乱码国产乱码精品精98午夜 | 羞羞网站免费 | 精品一二三区视频 | 国产激情91久久精品导航 | 毛片在线看片 | 高清黄色网址 | 午夜欧美 | 黄一区二区三区 | 色婷婷亚洲一区二区三区 | 久久99久久99 | 天天人人精品 | 国产精品一区二区三区久久久 | 黄篇网址 | 欧美日韩在线电影 | 日日夜夜天天 | 六月婷婷久久 | 免费v片 | 一级做a毛片 | 中文一区二区 | 欧日韩在线观看 | www在线| 九九综合九九 | 国产视频一区二区 | www.日韩av.com| 久久综合久久久 | a级大片| 日韩欧美三区 |