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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2101|回復: 0
收起左側

基于單片機6個數碼管顯示的數字鐘程序

[復制鏈接]
ID:914603 發表于 2022-4-8 23:57 | 顯示全部樓層 |閱讀模式
這是我上個月寫的,因為第一次寫所以挑了個簡單的數字鐘練下手。
附件里包含代碼和仿真圖。

屏幕截圖 2022-04-08 235205.png

單片機源程序如下:
  1. #include<reg51.h>
  2. sbit no_off = P1^0;                //該按鍵用于暫停計時,設置時間
  3. sbit select = P1^1;                //該按鍵選擇調秒,分鐘,還是調小時,上電默認選擇秒
  4. sbit add = P1^2;                        //該按鍵往上調
  5. sbit sub = P1^3;                        //該按鍵往下調
  6. sbit set = P1^4;                        //該按鍵用于設置鬧鐘
  7. sbit led = P3^1;                        //設置了鬧鐘,該指示燈亮,否則不亮
  8. sbit beep = P3^7;                        //用于設置鬧鐘

  9. unsigned char state = 0;                 //匹配選擇調秒、調分或者調時的狀態
  10. unsigned char hour = 0;
  11. unsigned char min = 0;
  12. unsigned char sec = 0;
  13. unsigned char set_hour=0;
  14. unsigned char set_min=0;
  15. unsigned char count = 0;
  16. unsigned char num=0;                        //該變量用來設置led閃爍,定時時間到,led閃爍1秒鐘
  17. unsigned char disp[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};                //共陽數碼管字形碼

  18. void delay(unsigned int k);
  19. void scan(void);
  20. void alarm(void);
  21. void display(void);

  22. void main(void)
  23. {
  24.        
  25.         TMOD=0x11;
  26.         TH0=(65535-50000)/256;
  27.         TL0=(65535-50000)%256;
  28.         TH1=(65535-500)/256;
  29.         TL1=(65535-500)%256;
  30.         EA=1;
  31.         ET0=1;
  32.         ET1=1;
  33.         TR0=1;
  34.         TR1=0;
  35.         led=1;
  36.         while(1)
  37.         {
  38.                 scan();
  39.                 display();
  40.         }
  41. }

  42. void delay(unsigned int k)                //延時
  43. {
  44.         unsigned int i;
  45.         for(i=0;i<k;i++);
  46. }

  47. void scan(void)                                                        //按鍵掃描
  48. {
  49.         if(no_off==0)
  50.         {
  51.                 delay(1200);
  52.                 if(no_off==0) {TR0=~TR0;}
  53.                 while(!no_off);
  54.         }
  55.         if(select==0)
  56.         {
  57.                 delay(1200);
  58.                 if(select==0)
  59.                 {
  60.                         state++;
  61.                         if(state==3) state=0;
  62.                 }
  63.                 while(!select);
  64.         }
  65.   if(add==0)
  66.         {
  67.                 delay(1200);
  68.                 if(add==0)
  69.                 {
  70.                         switch(state)
  71.                         {
  72.                         case 0:{ sec++; if(sec==60) sec=0;break;}
  73.                         case 1:{ min++; if(min==60) min=0;break;}
  74.                         case 2:{ hour++; if(hour==24) hour=0;break;}
  75.                         default :        ;
  76.                         }       
  77.                 }
  78.                 while(!add);
  79.         }
  80.         if(sub==0)
  81.         {
  82.                 delay(1200);
  83.                 if(sub==0)
  84.                 {       
  85.                         switch(state)
  86.                         {
  87.                         case 0:{ sec--; if(sec==255) sec=59;break;}
  88.                         case 1:{ min--; if(min==255) min=59;break;}
  89.                         case 2:{ hour--; if(hour==255) hour=23;break;}
  90.                         default :        ;
  91.                         }
  92.                 }
  93.                 while(!sub);
  94.         }
  95.         if(set==0)
  96.         {
  97.                 delay(1200);                        //消抖
  98.                 if(set==0)
  99.                 {
  100.                         led=~led;
  101.                         set_hour=hour;        //設置鬧鐘的小時
  102.                         set_min=min;                //設置鬧鐘的分鐘
  103.                         while(!set);                //等待按鍵釋放
  104.                 }
  105.         }
  106. }

  107. void display(void)                //數碼管掃描顯示函數
  108. {
  109.         unsigned char i;
  110.         for(i=0;i<6;i++)
  111.         {
  112.                 switch(i)
  113.                 {
  114.                         case 0: {P0=disp[hour/10];P2=0x01;break;}
  115.                         case 1: {P0=disp[hour%10];P2=0x02;break;}
  116.                         case 2: {P0=disp[min/10];P2=0x04;break;}
  117.                         case 3: {P0=disp[min%10];P2=0x08;break;}
  118.                         case 4: {P0=disp[sec/10];P2=0x10;break;}
  119.                         case 5: {P0=disp[sec%10];P2=0x20;break;}
  120.                 }
  121.                 delay(200);
  122.                 P0=0xff;                        //消隱
  123.         }
  124. }

  125. void time(void) interrupt 1                //定時1s
  126. {
  127.         EA=0;TR0=0;
  128.         TH0=(65535-50000)/256;
  129.         TL0=(65535-50000)%256;
  130.         count++;
  131.         if(count==20)
  132.         {
  133.                 count=0;
  134.                 sec++;
  135.                 if(sec==60)
  136.                 {
  137.                         sec=0;
  138.                         min++;
  139.                         if(min==60)
  140.                         {
  141.                                 min=0;
  142.                                 hour++;
  143.                                 if(hour==24)
  144.                                 {
  145.                                         hour=0;
  146.                                 }
  147.                         }
  148.                 }
  149.         }
  150.                 if((min==set_min)&&(hour==set_hour)&&(led==0)&&(TR0=1)) TR1=1;                        //時間到,鬧鐘響
  151.                 if((min==set_min+1)&&(hour==set_hour)) {TR1=0;led=1;}                                                                //鬧鐘響一分鐘后關閉,同時關閉指示燈
  152.                 EA=1;TR0=1;
  153. }

  154. void alarm() interrupt 3                //鬧鐘響應
  155. {
  156.         EA=0;TR1=0;
  157.         TH1=(65535-500)/256;
  158.         TL1=(65535-500)%256;
  159.         beep=~beep;
  160.         num++;
  161.         if(num==250)
  162.         {
  163.                 num=0;
  164.                 led=~led;                                                        //led燈閃爍
  165.         }
  166.         EA=1;TR1=1;
  167. }
復制代碼

Keil代碼下載:
數字鐘.zip (92.47 KB, 下載次數: 31)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91在线 | 中日 | 99免费看| 美女黄频 | 日韩三级一区 | 国产精品亚洲第一区在线暖暖韩国 | 秋霞a级毛片在线看 | 精品一区二区三区四区在线 | 91在线精品秘密一区二区 | 国产 91 视频| 精品国产高清一区二区三区 | 国产欧美一区二区三区免费 | 黄色毛片黄色毛片 | 欧美 日韩精品 | 国产精品成人av | 动漫www.被爆羞羞av44 | 成人伊人 | 国产一区二区三区高清 | 97日日碰人人模人人澡分享吧 | 欧美精品网站 | 久久亚洲一区二区三区四区 | 九九精品影院 | 日韩午夜一区二区三区 | 中文字幕一区二区三区精彩视频 | 国产成人精品久久二区二区 | 国精产品一区一区三区免费完 | 亚洲欧美中文日韩在线v日本 | 久久久久久中文字幕 | 欧美日韩综合一区 | 精品在线观看一区二区 | 久久久久久91 | 亚洲国产高清在线观看 | 日韩三级电影在线看 | 亚洲天堂中文字幕 | 国产欧美在线视频 | 亚洲欧美一区二区三区视频 | 午夜欧美 | 一区二区久久精品 | 毛片网站免费观看 | 日韩国产精品一区二区三区 | 国产精品久久在线 | 看黄在线 |