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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1699|回復: 0
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:492429 發表于 2019-3-17 10:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機小白求助
要求是做一個定時鬧鐘,可以設置四個鬧鐘并且能夠監測重復鬧鐘
現在有一個示例程序實可以設置一個鬧鐘并響鈴的,麻煩請各位大神教教我怎么添加到四個鬧鐘并監測重復
示例程序如下,我用的是stc89c52rc芯片

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

***********************************************************************************************************************/
#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,故所記次數應為46080計時器每隔50000微妙發起一次中斷。
        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一個循環,若要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;                   //當小時最高位為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;                   //當小時最高位為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, 下載次數: 13

原理圖

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品成av人在线视午夜片 | www.狠狠干| 99精品99久久久久久宅男 | 91动漫在线观看 | 成人在线视频免费播放 | 我要看黄色录像一级片 | 亚洲视频免费在线 | 欧美高清免费 | a毛片| 欧美一区二区三区 | 成人午夜视频在线观看 | 亚洲综合成人网 | 韩日一区二区三区 | 国产精品成人国产乱一区 | 国产亚洲精品a | 一区二区国产在线观看 | 午夜免费av | 国产在线精品一区二区三区 | 久久久精品一区二区 | a级在线免费视频 | 成人精品一区 | 最新国产精品视频 | 国产视频线观看永久免费 | 国产伦一区二区三区 | 一区二区在线不卡 | 久久久亚洲一区 | 伦理二区 | 91一区二区三区在线观看 | 国产成人精品久久二区二区91 | 亚洲一区二区三区 | 欧美精品第三页 | 国产精品1区2区 | 国产精品伦一区二区三级视频 | www.99热 | 欧美日韩国产精品激情在线播放 | 91精品国产一区二区三区动漫 | 日本a视频 | 日韩欧美成人一区二区三区 | japanhdxxxx裸体 | 欧美在线一二三 | 精品国产欧美一区二区 |