找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1732|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

怎么用51單片機(jī)寫包含四個鬧鐘的響鈴程序?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:492429 發(fā)表于 2019-3-17 10:48 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
單片機(jī)小白求助
要求是做一個定時鬧鐘,可以設(shè)置四個鬧鐘并且能夠監(jiān)測重復(fù)鬧鐘
現(xiàn)在有一個示例程序?qū)嵖梢栽O(shè)置一個鬧鐘并響鈴的,麻煩請各位大神教教我怎么添加到四個鬧鐘并監(jiān)測重復(fù)
示例程序如下,我用的是stc89c52rc芯片

單片機(jī)原理圖如附件
/********************************************************************
該例程為數(shù)碼管顯示可調(diào)且可定時鐘表,用到TX-1c開發(fā)板中矩陣鍵盤的上三排與第四排前兩個按鍵。
若要更改時鐘初始值(即時鐘校準(zhǔn)),可先按下矩陣鍵盤中的s16鍵(第三排第三列),此時時鐘會暫停。然后按S6---S15中的鍵修改矯正當(dāng)前值,S6--S15分 別先后對應(yīng)數(shù)字0到9。矯正完后,按下s17 (第三排最后一個),時鐘可繼續(xù)工作。
若要設(shè)置定時時間,可先按下s18 (第四排第一個),然后按數(shù)字鍵S6--S15設(shè)置定時時間(設(shè)置順序是由高位到低位的順序),設(shè)置完定時后,按下s17可恢復(fù)到正常計時狀態(tài)定時時間到,蜂鳴器會持續(xù)響一分鐘報時。
若要取消定時,或者蜂鳴器響時想對其關(guān)閉,可以按下s19功能鍵。注意晶振需為11.0592M。
若為其他數(shù)值晶振,請合理改變TH0與TL0參數(shù)值,否則計時會有很大誤差。

***********************************************************************************************************************/
#include<reg51.h>

#define uchar unsigned char

sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit P10 = P1^0;  
sbit P11 = P1^1;
sbit P12 = P1^2;  
sbit P13 = P1^3;
sbit P14 = P1^4;  
sbit P15 = P1^5;  
sbit P16 = P1^6;
sbit P17 = P1^7;
unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
uchar shi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,change,yidingshi;
uchar baoshi,baoshijieshu;
unsigned int pp;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa0,0x83,0xc6,0xa1,0x84,0x8e};

void delay(unsigned char i)
{
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
{
   dula=0;
   P0=table[shi2];
   dula=1;
   dula=0;

   wela=0;
   P0=0x01;
   wela=1;
   wela=0;
   delay(5);

   P0=table[shi1]|0x80;
   dula=1;
   dula=0;

   P0=0x02;
   wela=1;
   wela=0;
   delay(5);

   P0=table[fen2];
   dula=1;
   dula=0;

   P0=0x04;
   wela=1;
   wela=0;
   delay(5);

   P0=table[fen1]|0x80;
   dula=1;
   dula=0;

   P0=0x08;
   wela=1;
   wela=0;
   delay(5);

   P0=table[miao2];
   dula=1;
   dula=0;

   P0=0x10;
   wela=1;
   wela=0;
   delay(5);

   P0=table[miao1];
   dula=1;
   dula=0;

   P0=0x20;
   wela=1;
   wela=0;
   delay(5);
}

void keyscan0()
{
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xbb:
               ok=0;
                           change=1;
               break;

          case 0x7b:
               ok=1;
                           change=0;
                           dingshi=0;
               break;
         }        

      }
      }
          P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xe7:
               ok=0;
                           dingshi=1;
               break;
                  case 0xd7:
               yidingshi=0;         //取消定時
               break;
         }

                 }
                 }        
}


void keyscan()
{
  {        
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {        
        temp=P3;
        switch(temp)
        {
          case 0xee:
               key=0;
                           wei++;
               break;

          case 0xde:
               key=1;
                           wei++;
               break;

          case 0xbe:
               key=2;
                           wei++;
               break;

          case 0x7e:
               key=3;
                           wei++;
               break;
         }
         while(temp!=0xf0)
        {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
      }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xed:
               key=4;
                           wei++;
               break;

          case 0xdd:
               key=5;
                           wei++;
               break;

          case 0xbd:
               key=6;
                           wei++;
               break;

          case 0x7d:
               key=7;
                           wei++;
               break;
         }
         while(temp!=0xf0)
         {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
      }
      }
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xeb:
               key=8;
                           wei++;
               break;

          case 0xdb:
               key=9;
                           wei++;
               break;
         }
        while(temp!=0xf0)
         {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
      }
      }
}
}

void main()
{
        TMOD=0x01;

        TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數(shù)應(yīng)為46080計時器每隔50000微妙發(fā)起一次中斷。
        TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
        ET0=1;
        EA=1;
        
        while(1)
        {        keyscan0();
               
                if(ok==1)
                {        TR0=1;
                        wei=0;
               
                if(pp==20)
                {        pp=0;
                        m++;
                        if(m==60)
                        {
                                m=0;
                                f++;
                                if(f==60)
                                {
                                        f=0;
                                        s++;
                                        if(s==24)  //為24h一個循環(huán),若要12小時只需在此改為12即可。
                                        {
                                                s=0;
                                        }
                                }
                        }
                }
               
                a0=s%10;
                a1=s/10;
                b0=f%10;
                b1=f/10;
                c0=m%10;
                c1=m/10;
                display(a1,a0,b1,b0,c1,c0);
        }
        else
        {
        if(change==1)
        {        TR0=0;
                keyscan();
                if(key!=10)
                {
               
                switch(wei)
                {
                        case 1: if(key<3)                //小時最高位為2
                                        a1=key;
                                        else
                                        wei--;
                                        break;
                        case 2: if(a1==1|a1==0)
                                        a0=key;
                                        else
                                        if(key<5)
                                        a0=key;                   //當(dāng)小時最高位為2時低位最高為4
                                        break;
                        case 3: if(key<6)                //分鐘最高位為5
                                        b1=key;
                                        else
                                        wei--;
                                        break;
                        case 4: b0=key; break;
                        case 5: if(key<6)                //秒最高位為5
                                        c1=key;
                                        else
                                        wei--;
                                        break;
                        case 6: c0=key; break;
                }
                key=10;
                }
                        m=c1*10+c0;
                        f=b1*10+b0;
                        s=a1*10+a0;
                display(a1,a0,b1,b0,c1,c0);
        }
        if(dingshi==1)
        {
                TR0=0;
                display(shi20,shi10,fen20,fen10,miao20,miao10);        
                keyscan();
                if(key!=10)
                {
                switch(wei)
                {
                        case 1: if(key<3)                //小時最高位為2
                                        shi20=key;
                                        else
                                        wei--;
                                        break;
                        case 2: if(a1==1|a1==0)
                                        shi10=key;
                                        else
                                        if(key<5)
                                        a0=key;                   //當(dāng)小時最高位為2時低位最高為4
                                        break;
                        case 3: if(key<6)                //分鐘最高位為5
                                        fen20=key;
                                        else
                                        wei--;
                                        break;
                        case 4: fen10=key; break;
                        case 5: if(key<6)                //秒最高位為5
                                        miao20=key;
                                        else
                                        wei--;
                                        break;
                        case 6: miao10=key; break;
                }
                key=10;
                }
                yidingshi=1;
                display(shi20,shi10,fen20,fen10,miao20,miao10);        
        }        
        }
        if(yidingshi==1)
        {
        if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0==miao10))
                beep=0;
        if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0==miao10))
                {
          P10=0;
    delay(30);delay(30);
                P10=1;
                continue;
         }
        }
        if(((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10+1)&&(c1==miao20)&&(c0==miao10))||(yidingshi==0))//ò»·ÖÖó±¨ê±ìáê¾
                beep=1;
        }
}

void time0() interrupt 1
{        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        pp++;
}


51板原理圖.pdf

781.32 KB, 下載次數(shù): 13

原理圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表