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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數碼管時鐘 軟件框圖仿真程序 可以顯示時分秒 注釋詳細

[復制鏈接]
ID:811102 發表于 2022-4-4 18:03 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

原理: 共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極的數碼管,共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。led數碼管由多個發光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。LED數碼管以發光二極管作為發光單元,顏色有單紅, 黃,藍,綠,白,黃綠等效果。單色,分段全彩管可用大樓,道路,河堤輪廓亮化,LED數碼管可均勻排布形成大面積顯示區域,可顯示圖案及文字,并可播放不同格式的視頻文件。
(僅寫所用到的主要原理,不要介紹單片機本身的特點)
(4)    電路原理圖
51hei.png

(5)    所用主要元器件清單
序號    名稱    規格型號    數量    備注
1    MCU    STC89C51    1   
2    晶振    11.0592MHz    1   
3    數碼管    2位共陰數碼管    3   
4    芯片    74HC595    2   
5    按鍵    6*6*5    4   
6    上拉電阻    10k    1   
7    復位電路    10uf    1   
8    電阻    5.1k    1   
9    電阻    100    1   
10    蜂鳴器    Buz    1   

(6)    軟件框圖
51hei.png

單片機源程序如下:
  1. #include<reg51.h>  //包含51單片機頭文件
  2. #define uchar unsigned char//把unsigned char 定義為uchar
  3. #define uint unsigned int//把unsigned int定義為uint
  4. /*定義外部按鍵接口*/
  5. sbit K1=P3^3;   //調整
  6. sbit K2=P3^0;   //確定
  7. sbit K3=P3^2;   //加
  8. sbit K4=P3^1;   //減

  9. sbit BUZZ=P1^7;   //蜂鳴器
  10. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xf7,0XAF,0XFF};        //共陽數碼管編碼
  11. uchar Show_table[6];//定義顯示數組
  12. uchar temp_time=0,time_1s=0,time_1m=0,time_1h=0;//定義中間時間變量
  13. int hour_shi=0,hour_ge=0,mine_shi=0,mine_ge=0;//定義時間變量
  14. uchar w  = 0;
  15. uchar mode=0;
  16. uchar zhengdian_flag=0; //整點報時標志
  17. uchar flash_time=0;
  18. bit flash_flag=0;
  19. uchar key_num=0;  

  20. /*定時器0初始化*/                                                          
  21. void Time0_init()
  22. {
  23.   TMOD |= 0x01;                        //使用模式1,16位定時器
  24.   TH0   = (65536-50000)/256;        //定時器裝入初始值50ms
  25.   TL0   = (65536-50000)%256;//裝入定時器低八位計數值
  26.   EA    = 1;  //總中斷
  27.   ET0   = 1;//定時器0初始化
  28.   TR0   = 1;//打開定時器
  29.   
  30. }

  31. void Delay_ms(uint i)//1ms延時               
  32. {
  33.   uchar x,j;//定義兩個無符號字符型變量
  34.   for(j=0;j<i;j++)//循環j=0,只要j<i,j就加一直到j大于i
  35.     for(x=0;x<=148;x++);//循環x=0,只x<=0,x就減一直到x大于148
  36. }
  37. /*獨立按鍵程序*/
  38. void KeyRead()
  39. {         
  40.   static uchar key_up=1;//按鍵松開標志          
  41.   if(key_up&&(K1==0||K2==0||K3==0||K4==0))
  42.   {
  43.     Delay_ms(2);//去除抖動
  44.     key_up=0;
  45.     if(K1==0)key_num=1;
  46.     else if(K2==0)key_num=2;
  47.     else if(K3==0)key_num= 3;       
  48.     else if(K4==0)key_num= 4;
  49.    
  50.   }else if(K1==1&&K2==1&&K3==1&&K4==1)// 無按鍵按下
  51.   {
  52.     key_up=1;             
  53.     key_num= 0;
  54.   }
  55.   else
  56.   {key_num= 0;}

  57. }
  58. void display(void)//數碼管顯示程序
  59. {
  60.   static uchar step=0;
  61.   P0 = 0xff;                 //關閉數碼管顯示
  62.   switch(step++)        //依次傳送數據
  63.   {
  64.     case 0:P2=0x01;P0 = table[Show_table[0]];
  65.     break;
  66.     case 1:P2=0x02;P0 = table[Show_table[1]];
  67.     break;
  68.     case 2:P2=0x04;P0 = table[Show_table[2]];
  69.     break;
  70.     case 3:P2=0x08;P0 = table[Show_table[3]];
  71.     break;
  72.     case 4:P2=0x10;P0 = table[Show_table[4]];
  73.     break;
  74.     case 5:P2=0x20;P0 = table[Show_table[5]];
  75.     break;
  76.   }
  77.   if(step>5)step=0;           //一共6位數碼管 ,超過了就從0 開始

  78. }

  79. //*************************************
  80. //主函數
  81. ///***********************************                                                          
  82. void main(void)
  83. {
  84.   Time0_init();        //初始化定時器
  85.   while(1)
  86.   {
  87.     KeyRead();//讀取按鍵值
  88.     switch(key_num)
  89.     {
  90.     case 1:     //調整按鍵
  91.       mode++;
  92.       if(mode>4)mode=1;
  93.       break;
  94.     case 2:     //確定按鍵
  95.       mode=0;
  96.       break;
  97.     case 3:     //增加按鍵
  98.       if(mode==1)
  99.       {
  100.         hour_shi++;
  101.         if(hour_shi>2)hour_shi=0;
  102.       }
  103.       else if(mode==2)
  104.       {
  105.         hour_ge++;
  106.         if(hour_shi<2)
  107.         {
  108.           if(hour_ge>9)hour_ge=0;
  109.         }
  110.         else
  111.         {
  112.           if(hour_ge>3)hour_ge=0;
  113.         }
  114.       }
  115.       else if(mode==3)
  116.       {
  117.         mine_shi++;
  118.         if(mine_shi>5)mine_shi=0;
  119.       }
  120.       else if(mode==4)
  121.       {
  122.         mine_ge++;
  123.         if(mine_ge>9)mine_ge=0;
  124.       }
  125.       break;
  126.     case 4:     //減少按鍵
  127.       if(mode==1)
  128.       {
  129.         hour_shi--;
  130.         if(hour_shi<0)hour_shi=2;
  131.       }
  132.       else if(mode==2)
  133.       {
  134.         hour_ge--;
  135.         if(hour_shi<2)
  136.         {
  137.           if(hour_ge<0)hour_ge=9;
  138.         }
  139.         else
  140.         {
  141.           if(hour_ge<0)hour_ge=3;
  142.         }
  143.       }
  144.       else if(mode==3)
  145.       {
  146.         mine_shi--;
  147.         if(mine_shi<0)mine_shi=5;
  148.       }
  149.       else if(mode==4)
  150.       {
  151.         mine_ge--;
  152.         if(mine_ge<0)mine_ge=9;
  153.       }
  154.       break;
  155.     }
  156.           if(mode==0)//正常顯示模式
  157.   {
  158.     Show_table[0]=hour_shi;
  159.     Show_table[1]=hour_ge;
  160.     Show_table[2]=mine_shi;
  161.     Show_table[3]=mine_ge;
  162.     hour_shi=time_1h/10;
  163.     hour_ge=time_1h%10;
  164.     mine_shi=time_1m/10;
  165.     mine_ge=time_1m%10;
  166.   }
  167.   else//設定模式
  168.   {       
  169.     if(flash_flag)//首先亮,這里其實就是利用程序循環3000次來達到延時的效果
  170.     {
  171.       if(mode==1)
  172.       {
  173.         Show_table[3]=mine_ge;
  174.         Show_table[mode-1]=hour_shi;
  175.       }
  176.       else if(mode==2)
  177.       {
  178.         Show_table[0]=hour_shi;
  179.         Show_table[mode-1]=hour_ge;
  180.       }
  181.       else if(mode==3)
  182.       {
  183.         Show_table[1]=hour_ge;
  184.         Show_table[mode-1]=mine_shi;
  185.       }
  186.       else if(mode==4)
  187.       {
  188.         Show_table[2]=mine_shi;
  189.         Show_table[mode-1]=mine_ge;
  190.       }
  191.     }
  192.     else//然后熄滅,這樣就閃爍了, 這里其實就是利用程序循環6000次來達到延時的效果
  193.     {
  194.       Show_table[mode-1]=18;     //查數碼管表
  195.     }
  196.     time_1h=hour_shi*10+hour_ge;
  197.     time_1m=mine_shi*10+mine_ge;
  198.   }
  199.   
  200.   Show_table[4]=time_1s/10;
  201.   Show_table[5]=time_1s%10;
  202.   display();//顯示時間數據
  203.   }
  204. }

  205. //定時器0中斷
  206. void time0(void)interrupt 1
  207. {
  208.   static uchar temp_3s=0;
  209.   if(mode==0)
  210.   {
  211.   flash_time=0;
  212.     temp_time++;
  213.     if(temp_time>=20)//1s=20*50ms
  214.     {
  215.       temp_time=0;
  216.       time_1s++;
  217.       if(time_1s>=60)
  218.       {
  219.         time_1s=0;
  220.         time_1m++;
  221.         if(time_1m>=60)
  222.         {
  223.           time_1m=0;
  224.           time_1h++;
  225.                   BUZZ=0;     //打開蜂鳴器
  226.           zhengdian_flag=1;
  227.           if(time_1h>=23)
  228.           {
  229.             time_1h=0;
  230.           }
  231.         }
  232.       }
  233.     }
  234.   }
  235.   flash_time++;
  236.   if(flash_time>2)
  237.   {
  238.     flash_flag=~flash_flag;
  239.     flash_time=0;
  240.   }


  241.   if(zhengdian_flag)
  242.   {
  243.     temp_3s++;
  244.     if(temp_3s>=60)//3000MS=50*60
  245.     {
  246.       zhengdian_flag=0;
  247.       temp_3s=0;
  248.       BUZZ=1;//3S后蜂鳴器關閉
  249.     }
  250.   }
  251.   else
  252.   {
  253.     temp_3s=0;
  254.   }
  255.   TH0=(65536-50000)/256;//重新裝入計數器初值高八位
  256.   TL0=(65536-50000)%256;//重新裝入計數器初值低八位
  257. }
復制代碼
Keil代碼與Proteus仿真下載:
5-數碼管時鐘.zip (249.22 KB, 下載次數: 70)

評分

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

查看全部評分

回復

使用道具 舉報

ID:965040 發表于 2023-11-15 15:04 | 顯示全部樓層
非常好用,運行穩定,學習了
回復

使用道具 舉報

ID:275111 發表于 2024-3-30 21:00 | 顯示全部樓層
留言 非常感謝 之前用的是單片機內部模塊做定時,這次需要使用mcu自己的定時器做多個時鐘控制。之前代碼總在開關TR0 總是翻車。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区欧美 | 国产一区二区视频在线观看 | 免费特黄视频 | 天天干天天色 | 伊人网伊人网 | 91在线电影 | 久久高清国产 | 免费欧美 | 国产探花在线精品一区二区 | 免费看的av | 九九久久国产 | 91视频在线 | 91av视频在线播放 | 天啪 | 亚洲国产成人精品久久久国产成人一区 | 国产精品区二区三区日本 | 丝袜 亚洲 欧美 日韩 综合 | 精品九九| 国产精品一区在线观看你懂的 | 高清黄色 | 日日摸夜夜添夜夜添精品视频 | 国产精品a久久久久 | 欧美一区二区三区在线 | 在线看91 | 国产精品久久久99 | 免费性视频 | 日韩福利 | 久久久久久国产精品久久 | 久久大 | 天堂男人av | 久草在线| 国产亚洲精品精品国产亚洲综合 | 91精品国产综合久久久久久丝袜 | 日本视频一区二区三区 | 国产精品a久久久久 | 二区成人 | 天天射影院 | 自拍偷拍第一页 | 亚洲91精品 | 精品蜜桃一区二区三区 | 久久久亚洲一区 |