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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2378|回復: 2
收起左側

STC單片機做的個性時鐘 附程序 制作出來的實物圖

[復制鏈接]
ID:41347 發表于 2022-9-27 10:40 | 顯示全部樓層 |閱讀模式
共陽數碼管 LED指示燈共陽
W1-位1-P2.4
W2-位2-P2.7
W3-位3-P2.6
W4-位4-P2.5
數碼管段:P0口
LED指示燈陰極;P1口+P2.0--P2.3口
K1 P3.2
K2 P3.3
共陽是碼管順序:由上至下順時針 W1 a f W2 W3 b---W4 g c dp d e

制作出來的實物圖如下:
psu.jpg psu (2).jpg psu (1).jpg
單片機源程序如下:
/***************************************************************************
數碼管的顯示 LED 個性時鐘
單片機:STC12C5A60S2或STC89C52RC
調時間時按鍵有連發功能
******************************************************************************/
//頭文件:
#include "reg52.h"
#define yes  1
#define no   0
#define keyon  0    //按鍵開
#define keyoff  1   //按鍵關
#define uchar unsigned char
#define uint unsigned int
//變量定義:
unsigned char qian,bai,shi,ge;
unsigned char hour,minute,secont;
unsigned int count;
unsigned char miaocount;
code unsigned char table[]=
   {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數碼管
code unsigned char table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
     //表:共陽帶點數碼管 0-9
code unsigned char led[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xf7,
                              0xfb,0xfd,0xfe};//LED顯示數組
#define hidden 0xff;
//引腳定義:  
sbit SMG_q=P2^4; //定義數碼管陽級控制腳(千位)
sbit SMG_b=P2^7; //定義數碼管陽級控制腳(百位)
sbit SMG_s=P2^6; //定義數碼管陽級控制腳(十位)
sbit SMG_g=P2^5; //定義數碼管陽級控制腳(個位)
//KEY 調整
sbit key1=P3^2;
sbit key2=P3^3;
bit IS5ms; //5ms 標志位
bit IS10ms;//10ms標志位
uchar w;//定義數碼管位變量
uchar preset=100;//預設置用來調整時間的精度
/***********************************************/
void init()
     {
    hour=0;  
    minute=0;   //初始時間設置
    TMOD=0x11;//16位定時器0和定時器1的工作方式
    TH0=(65536-10027)/256;
    TL0=(65566-10027)%256;  //10ms 細調
    EA=1;  //總中斷允許
    ET0=1; //允許TMR0中斷
    TR0=1;  //啟動定時器
    TH1=(65536-5000)/256;
    TL1=(65566-5000)%256;  //5ms
    ET1=1;//允許TMR1中斷
    TR1=1;//啟動TMR1
  }
/***************************************************/
  //顯示函數,參數為顯示內容
void display()
{  
        qian=hour/10;  //顯示時間的千位
          bai=hour%10;   //顯示時間的百位
          shi=minute/10;   //顯示時間的十位
          ge=minute%10;     //顯示時間的個位     
   if((w==1)&&(qian==0))
      {
    SMG_q=1;
       SMG_b=1;
       SMG_s=1;  
       SMG_g=1;
       P0=hidden; //千位是0的話進行消隱不顯示
   }else
   {
    SMG_q=0;
       SMG_b=1;
       SMG_s=1;  
       SMG_g=1;
       P0=table[qian]; //輸出顯示內容
   }
   if(w==2)      //百位
      {
    SMG_q=1;
       SMG_b=0;
       SMG_s=1;  
       SMG_g=1;
       P0=table1[bai]; //輸出顯示內容
   }
   if(w==3)      //十位
      {
    SMG_q=1;
       SMG_b=1;
       SMG_s=0;  
       SMG_g=1;
       P0=table[shi]; //輸出顯示內容
   }
   if(w==4)      //個位
      {
    SMG_q=1;
       SMG_b=1;
       SMG_s=1;  
       SMG_g=0;
       P0=table[ge]; //輸出顯示內容
   }
w++;       //位循環顯示
if(w>4)
   {
    w=1;
   }
}  
/*******************************/
/******************************/
void timer0() interrupt 1  //定時器0中斷
           {
        static uchar timecount,num=0;
        TH0=(65536-10027)/256;
                TL0=(65566-10027)%256;  //10ms
       timecount++;    //10MS*100=1000ms時間計數
       if(timecount>=preset)  //預置值
          {
          timecount=0;   //清0時間計數
       ++num;      //LED位數+
       if(num<=8)     //P1口的8位顯示
         { P2=0xff;
           P1=led[num];      
         }else if((num>=9)&&(num<=12))  //P2口的4位顯示
                 {
            P1=0xff;
            P2=led[num];
         if(num==12)
           {  
          num=0;  
           }
            }
         
         
         if(++secont>59)    //如果59秒到
         {
          secont=0;
          minute++;     //分鐘+
       if(minute>59)    //如果59分到
          {
           minute=0;
           hour++;     //時+
        if(hour>23)   //如果時間大于23點
           {
             hour=0; //重回到0
           }
          }
         }
       }
     }

/***********************/
void timer1(void) interrupt 3
       {
     static uchar count;
       TH1=(65536-5000)/256;
       TL1=(65566-5000)%256;  //5ms,用來進行數碼管掃描
    IS5ms=yes;
    count++;
    if(count==2)    //  每到10MS進行一次鍵盤掃描
      {
    count=0;
    IS10ms=yes;   //10MS到的標志
   }
     
    }
/********************************/
uchar GetKey()   //按鍵掃描函數
{
uchar keyRetu=0;    //返回的按鍵值
static uchar s_keyState=0,keyTime=0; //按鍵狀態,按鍵按下的時間計數器
switch (s_keyState)
{
   case 0:
    if(key1==keyon)   //檢測到有按鍵按下,轉到狀態1,相當于是消抖過程
    {
     s_keyState=1;
    }
if(key2==keyon)
{
  s_keyState=4;
}
    break;
   case 1:
    if(key1==keyon)    //再次檢測到有按鍵,轉到狀態2
    {
     s_keyState=2;
     keyTime=0;       //清零按鍵時間計數器
    }
    else
    {
     s_keyState=0; //沒有檢測到按鍵,說明狀態0檢測到是一個抖動,重新轉到狀態0
    }
    break;
   case 2:
    if(key1==keyoff)    //檢測到按鍵松開
    {
     s_keyState=0; //狀態轉到狀態0
     keyRetu=1;   //輸出1
    }
    else
    {
     if(++keyTime>=25)    //按下時間>0.5s
     {
      s_keyState=3;   //轉到狀態3
      keyTime=0;   //清零按鍵時間計數器
      keyRetu=1;    // 輸出1
     }
    }
    break;
   case 3:
    if(key1==keyoff)    //檢測到按鍵松開
    {
     s_keyState=0; //狀態轉到狀態0
    }
    else
    {
     if(++keyTime>=10)    //按下時間>0.2s
     {
      keyTime=0;   //清零按鍵時間計數器
      keyRetu=1;    // 輸出1
     }
    }
    break;
  case 4:
    if(key2==keyon)    //再次檢測到有按鍵,轉到狀態5
    {
     s_keyState=5;
     keyTime=0;   //清零按鍵時間計數器
    }
    else
    {
     s_keyState=0; //沒有檢測到按鍵,說明狀態0檢測到是一個抖動,重新轉到狀態0
    }
    break;
//
   case 5:
    if(key2==keyoff)    //檢測到按鍵松開
    {
     s_keyState=0; //狀態轉到狀態0
     keyRetu=2;   //輸出2
    }
    else
    {
     if(++keyTime>=25)    //按下時間>0.5s
     {
      s_keyState=6;   //轉到狀態6
      keyTime=0;   //清零按鍵時間計數器
      keyRetu=2;    // 輸出2
     }
    }
    break;
//
case 6:
    if(key2==keyoff)    //檢測到按鍵松開
    {
     s_keyState=0; //狀態轉到狀態0
    }
    else
    {
     if(++keyTime>=10)    //按下時間>0.2s
     {
      keyTime=0;   //清零按鍵時間計數器
      keyRetu=2;    // 輸出2
     }
    }
    break;
}
return keyRetu;   //返回鍵值
}
/**********************************************/
//主函數,C語言的入口函數:  
void main()
{
init(); //端口及定時器初始化
while(1)
      //死循環
{
        if(IS5ms==yes)  //5MS到的標志
        {
       IS5ms=no;
      display();  //調用顯示函數
     }
      if(IS10ms==yes)   //10MS到的標志
      {
        IS10ms=no;
      switch(GetKey()) //掃描按鍵得到鍵值
      {
      case 1:    //鍵值處理
       hour++;
    if(hour>23)
      {
       hour=0;
      }
      break;
      case 2:      //鍵值處理
       minute++;
    if(minute>59)
      {
       minute=0;
      }
      break;
      }
      
      }
   
              
        
      
}
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:16255 發表于 2022-9-27 18:56 | 顯示全部樓層
確定挺有“個性”的。
回復

使用道具 舉報

ID:74784 發表于 2022-9-27 21:49 | 顯示全部樓層
我做的是60個模擬秒:


3代床頭表.jpg

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 高清国产一区二区 | 欧美aⅴ在线观看 | 国产精品一区二区三区久久 | h片在线观看网站 | 午夜国产羞羞视频免费网站 | av福利网| 日韩欧美一区在线 | 97久久精品午夜一区二区 | 美女久久| 欧美日韩国产综合在线 | 黄网免费| 亚洲国产精品激情在线观看 | 国产亚洲精品精品国产亚洲综合 | 成人免费在线视频 | 一区二区三区四区国产 | 91精品国产乱码久久久 | aaa综合国产| 91原创视频在线观看 | 在线欧美激情 | 久久久久久国产精品免费 | 国产精品一区二区欧美黑人喷潮水 | 一区二区三区四区免费视频 | 成人亚洲视频 | 久久久久国产 | 一区二区三区四区视频 | 久久精品亚洲欧美日韩精品中文字幕 | 在线一区视频 | 天天草视频 | 国产二区精品视频 | 99久久精品一区二区毛片吞精 | 精品欧美一区二区三区精品久久 | 日韩中文字幕在线视频 | 东京久久| 午夜精品一区二区三区在线视频 | 亚洲成av人片在线观看无码 | 日本色婷婷 | 成年人网站免费视频 | 国产色| 国产精品久久久亚洲 | 欧美一区不卡 | 免费精品国产 |