欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機做簡易電子表程序及Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
這周我做了一個用51單片機的時鐘,下面介紹一下具體實用功能 。仿真一開始,時間顯示的是20:30:00   
當按下第二個開關時  即可調節"分"如圖,按一下便調整為31分。

再按一下第二個鍵,此時可調節"時"如圖。

按一下以后,時間為21時。

代碼放在附件,有需要可以下載。

單片機源程序如下:
  1. #include <reg51.h>

  2. sbit key1 = P1^0;
  3. bit flag1s = 0;
  4. bit KeySta = 1;
  5. unsigned char hour = 20;
  6. unsigned char minute = 30;
  7. unsigned char second = 00;
  8. unsigned char mode = 0;
  9. void FreshTime();
  10. void TimeInit();
  11. void IntInit();
  12. void InitLedBuff();
  13. void keyscan();
  14.   
  15. unsigned char code LedChar[] = {  //共陰數碼管顯示字符轉換表
  16.     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
  18. unsigned char LedBuff[6] = {  //數碼管顯示緩沖區
  19.     0xff,0xff,0xff,0xff,0xff,0xff};

  20. void main()
  21. {
  22.   TimeInit();
  23.   IntInit();
  24.   InitLedBuff();
  25.   while(1)//顯示內容處理
  26.   {
  27.     if(flag1s&&!mode) //時間顯示模式
  28.     {
  29.       flag1s = 0;
  30.       FreshTime();
  31.     }
  32.     else if(mode == 1)  //校準分鐘
  33.     {
  34.       LedBuff[0] = 17;
  35.       LedBuff[1] = 17;
  36.       LedBuff[4] = 17;
  37.       LedBuff[5] = 17;//不顯示
  38.       LedBuff[2] = minute/10;
  39.       LedBuff[3] = minute%10;
  40.     }
  41.     else if(mode == 2)  //校準小時
  42.     {
  43.       LedBuff[2] = 17;
  44.       LedBuff[3] = 17;
  45.       LedBuff[4] = 17;
  46.       LedBuff[5] = 17;//不顯示
  47.       LedBuff[0] = hour/10;
  48.       LedBuff[1] = hour%10;
  49.     }
  50.     else if(mode == 3)  //校準完成重新顯示
  51.     {
  52.       InitLedBuff();
  53.       mode = 0;
  54.     }
  55.     keyscan();
  56.   }
  57. }

  58. void InitLedBuff()//初始化時間到顯示緩沖區
  59. {
  60.   LedBuff[0] = hour/10;
  61.   LedBuff[1] = hour%10;
  62.   LedBuff[2] = minute/10;
  63.   LedBuff[3] = minute%10;
  64.   LedBuff[4] = second/10;
  65.   LedBuff[5] = second%10;
  66. }
  67. void FreshTime()//刷新時間到顯示緩沖區
  68. {
  69.   second++;
  70.   if(second == 60)//進位
  71.   {
  72.     second = 0;
  73.     minute++;
  74.     LedBuff[2] = minute/10;
  75.     LedBuff[3] = minute%10;
  76.     if(minute == 60)//進位
  77.     {
  78.       minute = 0;
  79.       hour++;
  80.       if(hour == 24)
  81.         hour = 0;
  82.       LedBuff[0] = hour/10;
  83.       LedBuff[1] = hour%10;
  84.     }  
  85.   }
  86.   LedBuff[4] = second/10;
  87.   LedBuff[5] = second%10;
  88. }

  89. void TimeInit()//定時器初始化
  90. {
  91.   TMOD = 0X11;    //設置定時器為模式1
  92.   TL0 = 0xB0;
  93.   TH0 = 0x3C;     //定時初值 50ms
  94.   TL1 = 0x18;                //
  95.         TH1 = 0xFC;                //定時初值 1ms
  96.   TR0 = 1;    //定時器0開始計時
  97.   TR1 = 1;    //定時器1開始計時
  98.   ET1 = 1;    //使能定時器1
  99.   ET0 = 1;    //使能定時器0
  100.   PT0 = 1;    //提高計時準確性,提高定時器0中斷優先級
  101.   EA = 1;     //打開總中斷
  102. }
  103. void IntInit()//外部中斷初始化
  104. {
  105.   IT0 = 1;     //下降沿觸發
  106.   EX0 = 1;    //使能外部中斷0
  107. }

  108. void keyscan() //按鍵掃描及處理
  109. {
  110.   static bit backup = 1;
  111.   if (KeySta != backup)  //當前值與前次值不相等說明此時按鍵有動作
  112.   {
  113.     if (backup == 0)   //如果前次值為0,則說明當前是彈起動作
  114.     {
  115.       if(mode == 1)   //校準分鐘時,分鐘加一
  116.       {
  117.         minute++;
  118.         if(minute==60)
  119.           minute = 0;
  120.       }
  121.       else if(mode == 2)    //校準小時,小時加一
  122.       {
  123.         hour++;
  124.         if(hour==24)
  125.           hour = 0;
  126.       }
  127.     }
  128.     backup = KeySta;   //更新備份為當前值,以備進行下次比較
  129.   }
  130. }
  131. void Int0() interrupt 0
  132. {
  133.   mode++;
  134.   if(mode == 4)
  135.   {
  136.     mode = 0;
  137.   }
  138. }
  139. void Ledfresh() //數碼管顯示刷新
  140. {
  141.   static unsigned char i = 0;
  142.   switch(i)
  143.   {
  144.     case 0 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  145.     case 1 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  146.     case 2 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  147.     case 3 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  148.     case 4 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
  149.     case 5 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i=0;break;
  150.   }
  151. }
  152. void Time0() interrupt 1 //12MHz 50ms
  153. {
  154.   static unsigned char n = 0;
  155.   TL0 = 0xB0;
  156.   TH0 = 0x3C;
  157.   n++;
  158.   if(n==20)
  159.   {
  160.     n=0;
  161.     flag1s = 1;//1s標志位
  162.   }
  163. }

  164. void Time1() interrupt 3  //12MHz 1ms
  165. {
  166.   static unsigned char keybuff = 0xff;
  167.   TL1 = 0x18;                //
  168.         TH1 = 0xFC;                //定時初值 1ms
  169.   Ledfresh();
  170.   keybuff = (keybuff<<1)|key1;
  171.   if (keybuff == 0x00)
  172.   {   //連續8次掃描值都為0,即16ms內都只檢測到按下狀態時,可認為按鍵已按下
  173.       KeySta = 0;
  174.   }
  175.   else if (keybuff == 0xFF)
  176.   {   //連續8次掃描值都為1,即16ms內都只檢測到彈起狀態時,可認為按鍵已彈起
  177.       KeySta = 1;
  178.   }
  179.   else
  180.   {}  //其它情況則說明按鍵狀態尚未穩定,則不對KeySta變量值進行更新
  181. }
復制代碼
請自行畫圖

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:762381 發表于 2020-5-27 12:41 | 只看該作者
請問有沒有Proteus的工程文件啊
回復

使用道具 舉報

無效樓層,該帖已經被刪除
地板
ID:1033811 發表于 2022-6-13 18:16 來自觸屏版 | 只看該作者
你這個圖不全啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表