找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3385|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)數(shù)碼管時(shí)鐘 軟件框圖仿真程序 可以顯示時(shí)分秒 注釋詳細(xì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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


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

(6)    軟件框圖


單片機(jī)源程序如下:
  1. #include<reg51.h>  //包含51單片機(jī)頭文件
  2. #define uchar unsigned char//把unsigned char 定義為uchar
  3. #define uint unsigned int//把unsigned int定義為uint
  4. /*定義外部按鍵接口*/
  5. sbit K1=P3^3;   //調(diào)整
  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};        //共陽數(shù)碼管編碼
  11. uchar Show_table[6];//定義顯示數(shù)組
  12. uchar temp_time=0,time_1s=0,time_1m=0,time_1h=0;//定義中間時(shí)間變量
  13. int hour_shi=0,hour_ge=0,mine_shi=0,mine_ge=0;//定義時(shí)間變量
  14. uchar w  = 0;
  15. uchar mode=0;
  16. uchar zhengdian_flag=0; //整點(diǎn)報(bào)時(shí)標(biāo)志
  17. uchar flash_time=0;
  18. bit flash_flag=0;
  19. uchar key_num=0;  

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

  31. void Delay_ms(uint i)//1ms延時(shí)               
  32. {
  33.   uchar x,j;//定義兩個(gè)無符號字符型變量
  34.   for(j=0;j<i;j++)//循環(huán)j=0,只要j<i,j就加一直到j(luò)大于i
  35.     for(x=0;x<=148;x++);//循環(huán)x=0,只x<=0,x就減一直到x大于148
  36. }
  37. /*獨(dú)立按鍵程序*/
  38. void KeyRead()
  39. {         
  40.   static uchar key_up=1;//按鍵松開標(biāo)志          
  41.   if(key_up&&(K1==0||K2==0||K3==0||K4==0))
  42.   {
  43.     Delay_ms(2);//去除抖動(dòng)
  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)//數(shù)碼管顯示程序
  59. {
  60.   static uchar step=0;
  61.   P0 = 0xff;                 //關(guān)閉數(shù)碼管顯示
  62.   switch(step++)        //依次傳送數(shù)據(jù)
  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位數(shù)碼管 ,超過了就從0 開始

  78. }

  79. //*************************************
  80. //主函數(shù)
  81. ///***********************************                                                          
  82. void main(void)
  83. {
  84.   Time0_init();        //初始化定時(shí)器
  85.   while(1)
  86.   {
  87.     KeyRead();//讀取按鍵值
  88.     switch(key_num)
  89.     {
  90.     case 1:     //調(diào)整按鍵
  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//設(shè)定模式
  168.   {       
  169.     if(flash_flag)//首先亮,這里其實(shí)就是利用程序循環(huán)3000次來達(dá)到延時(shí)的效果
  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//然后熄滅,這樣就閃爍了, 這里其實(shí)就是利用程序循環(huán)6000次來達(dá)到延時(shí)的效果
  193.     {
  194.       Show_table[mode-1]=18;     //查數(shù)碼管表
  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();//顯示時(shí)間數(shù)據(jù)
  203.   }
  204. }

  205. //定時(shí)器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后蜂鳴器關(guān)閉
  249.     }
  250.   }
  251.   else
  252.   {
  253.     temp_3s=0;
  254.   }
  255.   TH0=(65536-50000)/256;//重新裝入計(jì)數(shù)器初值高八位
  256.   TL0=(65536-50000)%256;//重新裝入計(jì)數(shù)器初值低八位
  257. }
復(fù)制代碼
Keil代碼與Proteus仿真下載:
5-數(shù)碼管時(shí)鐘.zip (249.22 KB, 下載次數(shù): 70)

評分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:965040 發(fā)表于 2023-11-15 15:04 | 只看該作者
非常好用,運(yùn)行穩(wěn)定,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:275111 發(fā)表于 2024-3-30 21:00 | 只看該作者
留言 非常感謝 之前用的是單片機(jī)內(nèi)部模塊做定時(shí),這次需要使用mcu自己的定時(shí)器做多個(gè)時(shí)鐘控制。之前代碼總在開關(guān)TR0 總是翻車。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表