標題: 4位共陰極數(shù)碼管秒表設(shè)計仿真與程序 [打印本頁]

作者: 阿爾特    時間: 2017-12-5 15:04
標題: 4位共陰極數(shù)碼管秒表設(shè)計仿真與程序
單片機課設(shè),數(shù)字秒表設(shè)計,計時9:59:9
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define GPIO_DIG   P2                           //數(shù)據(jù)端

  4. #define uchar unsigned char                   //重命名關(guān)鍵字
  5. #define uint unsigned int                   //重命名關(guān)鍵字

  6. sbit K1=P3^0;                //開始
  7. sbit K2=P3^1;                //暫停
  8. sbit K3=P3^2;                //復(fù)位

  9. sbit L1=P1^4;                //數(shù)碼管1位選
  10. sbit L2=P1^5;                //數(shù)碼管2位選
  11. sbit L3=P1^6;                //數(shù)碼管3位選
  12. sbit L4=P1^7;                //數(shù)碼管4位選

  13. sbit beep=P1^0;

  14. unsigned char code DIG_CODE[10] = {
  15. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f};
  17. //0、1、2、3、4、5、6、7、8、9的顯示碼
  18. unsigned char code DIG_CODE2[10] = {
  19. 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
  20. 0xff,0xef};
  21. //0、1、2、3、4、5、6、7、8、9帶小數(shù)點的顯示碼
  22. unsigned char DisplayData[4];
  23. //用來存放要顯示的8位數(shù)的值

  24. uchar i,m;           //定義變量
  25. uchar min=0;
  26. long int k=0;
  27. uint Second_Counts;                   //定義變量

  28. void DigDisplay()                   //數(shù)碼管顯示子函數(shù)
  29. {
  30.         unsigned int j;                   //定義變量

  31.         L1=0;                          //位選
  32.         L2=1;
  33.         L3=1;
  34.         L4=1;
  35.         GPIO_DIG = DisplayData[0];     //發(fā)送段碼
  36.         j = 1000;                                                   //掃描間隔時間設(shè)定
  37.         while(j--);       
  38.         L1=1;                           //消隱
  39.         L2=1;
  40.         L3=1;
  41.         L4=1;               

  42.         L1=1;
  43.         L2=0;                          //位選
  44.         L3=1;
  45.         L4=1;
  46.         GPIO_DIG = DisplayData[1];     //發(fā)送段碼
  47.         j = 1000;                                                   //掃描間隔時間設(shè)定
  48.         while(j--);       
  49.         L1=1;                           //消隱
  50.         L2=1;
  51.         L3=1;
  52.         L4=1;      

  53.         L1=1;
  54.         L2=1;
  55.         L3=0;                           //位選
  56.         L4=1;
  57.         GPIO_DIG = DisplayData[2];     //發(fā)送段碼
  58.         j = 1000;                                                   //掃描間隔時間設(shè)定
  59.         while(j--);       
  60.         L1=1;                           //消隱
  61.         L2=1;
  62.         L3=1;
  63.         L4=1;      

  64.         L1=1;
  65.         L2=1;
  66.         L3=1;
  67.         L4=0;                           //位選
  68.         GPIO_DIG = DisplayData[3];     //發(fā)送段碼
  69.         j = 1000;                                                   //掃描間隔時間設(shè)定
  70.         while(j--);       
  71.         L1=1;                           //消隱
  72.         L2=1;
  73.         L3=1;
  74.         L4=1;      
  75.        
  76. }

  77. void main()
  78. {
  79. //        Second_Counts=570;
  80. //        min=9;
  81.         GPIO_DIG = 0x00;                 //初始化數(shù)據(jù)口
  82.    
  83.         TMOD=0x01;                                //定時器0方式1
  84.         TH0=(65536-50000)/256;                //定時器0:50ms
  85.         TL0=(65536-50000)%256;
  86.         TH1=(65536-2000)/256;               
  87.         TL1=(65536-2000)%256;
  88.         EA=1;   
  89. //        ET1=1;
  90. //        TR1=1;         
  91.     while (1)
  92.     {
  93.                 if(K1==0)
  94.                 {
  95.                         ET0=1;
  96.                         TR0=1;                //開啟定時器
  97.                 }
  98.                 if(K2==0)
  99.                 {
  100.                         ET0=0;
  101.                         TR0=0;                //關(guān)閉定時器
  102.                 }
  103.                 if(K3==0)                                                 //復(fù)位按鍵按下時
  104.                 {
  105.                         ET0=0;
  106.                         TR0=0;                //關(guān)閉定時器
  107.                         DisplayData[0] = DIG_CODE2[0];          //清零顯示
  108.                         DisplayData[1] = DIG_CODE[0];          //清零顯示
  109.                         DisplayData[2] = DIG_CODE2[0];          //清零顯示
  110.                         DisplayData[3] = DIG_CODE[0];          //清零顯示
  111.                         i=0;                                                          //清零計數(shù)
  112.                         Second_Counts=0;                                  //清零秒
  113.                 }

  114.                 if((Second_Counts>0)&&(m==0))
  115.                 {
  116.                         ET1=1;
  117.                         TR1=1;   
  118.                 }

  119.                 if((min==9)&&(Second_Counts==599))
  120.                 {
  121.                         ET0=0;
  122.                         TR0=0;                //關(guān)閉定時器
  123.                         ET1=1;
  124.                         TR1=1;
  125.                 }

  126.                 DigDisplay();                 //執(zhí)行數(shù)碼管顯示函數(shù)
  127.     }
  128. }


  129. //T0中斷函數(shù)
  130. void DSY_Refresh() interrupt 1
  131. {
  132.         TH0=(65536-50000)/256;                //恢復(fù)定時器0初值
  133.         TL0=(65536-50000)%256;
  134.         i++;
  135.         m++;
  136.         if(m>=20)
  137.         {
  138.                 m=0;
  139.         }
  140.         if(i==2)                                //50ms*2=0.1s轉(zhuǎn)換狀態(tài)
  141.         {
  142.                 i=0;
  143.                 Second_Counts++;
  144.                 if(Second_Counts>=600)
  145.                 {
  146.                         Second_Counts=0;
  147.                         min++;
  148.                 }

  149.                 DisplayData[0] = DIG_CODE2[min%10];          //顯示百位
  150.                 DisplayData[1] = DIG_CODE[Second_Counts/100%10];          //顯示十位
  151.                 DisplayData[2] = DIG_CODE2[Second_Counts/10%10];          //顯示個位
  152.                 DisplayData[3] = DIG_CODE[Second_Counts%10];                  //顯示小數(shù)點后一位
  153. //                if(Second_Counts==10000) Second_Counts=0;                          //當(dāng)秒計數(shù)到1000秒又變?yōu)?
  154. ……………………

  155. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
4位共陰極數(shù)碼管秒表hangqunli.zip (131.85 KB, 下載次數(shù): 416)



作者: 1515798262    時間: 2018-1-9 09:33
要用Proteus7.5才能成功

51hei.png (12.26 KB, 下載次數(shù): 92)

51hei.png

作者: syaaaa    時間: 2019-8-17 11:10
不錯,正好有用
作者: puresilver    時間: 2019-9-26 18:56
有用~~
作者: 龍哥哥牛逼    時間: 2019-11-10 12:04
我想問一下作者,P0口來輸出段碼可以嗎
作者: 無奈的一人    時間: 2019-11-13 11:32
我為什么用protus打不開
作者: 越獄123    時間: 2019-11-13 14:33
很厲害呀
作者: @初學(xué)者    時間: 2020-1-6 18:12
卑微的我,想知道共陽極的加上能夠記錄歷史數(shù)據(jù)的,大佬能不能幫幫我
作者: pangshe    時間: 2020-1-7 15:57
樓主真厲害,思路奇特,程序優(yōu)美,電路簡潔。
作者: rtgvb    時間: 2020-4-16 11:55
算法簡單易懂,很不錯
作者: LHL45969817    時間: 2020-5-25 20:48
很厲害棒棒的

作者: 楊富    時間: 2020-6-14 15:20
為什么我的運行出來不對呀

作者: 1238881    時間: 2020-12-2 23:12
牛逼很不錯,太好用了
作者: ak333    時間: 2020-12-15 09:42
學(xué)習(xí)了,謝謝分享,很詳細的程序
作者: chjchj816    時間: 2021-1-7 08:42
代碼寫得規(guī)范哦  參考參考
作者: 筱豆先生    時間: 2022-6-3 10:46
程序重新編譯,仿真無法運行,程序是有問題的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1