找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5251|回復(fù): 3
收起左側(cè)

按鍵按一次計數(shù)器開始計數(shù),按兩次停止計數(shù)

[復(fù)制鏈接]
ID:150865 發(fā)表于 2017-1-7 22:29 | 顯示全部樓層 |閱讀模式
有沒有人有源程序,看起來很簡單,,自己寫就各種實(shí)現(xiàn)不了

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:94072 發(fā)表于 2017-1-7 23:44 | 顯示全部樓層
用標(biāo)志位啊,按一次時為1,按兩次時為2,停止計數(shù),標(biāo)志位清零
回復(fù)

使用道具 舉報

ID:155507 發(fā)表于 2017-1-8 00:19 | 顯示全部樓層
  1. /*-----------------------------------------------
  2. 名稱:數(shù)碼管顯示,按鍵控制秒表
  3. 內(nèi)容:中斷按鍵控制,數(shù)碼管顯示,P3.2 中斷0控制計時和停止,P3.3 中斷1清零
  4. ------------------------------------------------*/
  5. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

  6. unsigned int msecond,second;//定義全局變量
  7. bit GoFlag;//定義停止,計時標(biāo)志

  8. #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
  9. sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存         74hc573 就是鎖存器
  10. sbit LATCH2=P2^3;//             位鎖存

  11. unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  12. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼
  13. unsigned char TempData[8]; //存儲顯示值的全局變量

  14. void DelayUs2x(unsigned char t);//函數(shù)聲明
  15. void DelayMs(unsigned char t);
  16. void Display(unsigned char FirstBit,unsigned char Num);
  17. void Init_Timer0(void);
  18. void CLR(void);
  19. /*------------------------------------------------
  20.                                         主函數(shù)
  21. ------------------------------------------------*/
  22. void main (void)
  23. {
  24.         unsigned char num=0;                  


  25.         EX0=1;         //外部中斷0開
  26.         IT0=1;         //IT1=0表示邊沿觸發(fā)
  27.         EX1=1;         //外部中斷1開
  28.         IT1=1;         //IT1=1表示邊沿觸發(fā)
  29.         Init_Timer0();
  30.         while (1)         //主循環(huán)
  31.         {

  32.                 TempData[0]=DuanMa[second/10];//分解顯示信息,如要顯示68,則68/10=6  68%10=8  
  33.                 TempData[1]=DuanMa[second%10];
  34.                 TempData[2]=0x40;// "-"
  35.                 TempData[3]=DuanMa[msecond/10];//分解顯示信息,如要顯示68,則68/10=6  68%10=8  
  36.                 TempData[4]=DuanMa[msecond%10];
  37.                
  38.                 //主循環(huán)中添加其他需要一直工作的程序
  39.                
  40.         }
  41. }

  42. /*------------------------------------------------
  43. 顯示函數(shù),用于動態(tài)掃描數(shù)碼管
  44. 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數(shù)碼管開始顯示
  45. 如輸入0表示從第一個顯示。
  46. Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
  47. ------------------------------------------------*/
  48. void Display(unsigned char FirstBit,unsigned char Num)
  49. {
  50.         static unsigned char i=0;
  51.        

  52.         DataPort=0;   //清空數(shù)據(jù),防止有交替重影
  53.         LATCH1=1;     //段鎖存
  54.         LATCH1=0;

  55.         DataPort=WeiMa[i+FirstBit]; //取位碼
  56.         LATCH2=1;     //位鎖存
  57.         LATCH2=0;

  58.         DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
  59.         LATCH1=1;     //段鎖存
  60.         LATCH1=0;
  61.        
  62.         i++;
  63.         if(i==Num)
  64.         i=0;


  65. }
  66. /*------------------------------------------------
  67.                                         定時器初始化子程序
  68. ------------------------------------------------*/
  69. void Init_Timer0(void)
  70. {
  71.         TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  72.         //TH0=0x00;              //給定初值
  73.         //TL0=0x00;
  74.         EA=1;            //總中斷打開
  75.         ET0=1;           //定時器中斷打開
  76.         TR0=1;           //定時器開關(guān)打開
  77. }
  78. /*------------------------------------------------
  79.                                 定時器中斷子程序
  80. ------------------------------------------------*/
  81. void Timer0_isr(void) interrupt 1
  82. {
  83.         static unsigned char num;
  84.         TH0=(65536-2000)/256;                  //重新賦值 2ms
  85.         TL0=(65536-2000)%256;

  86.         Display(0,8);
  87.         if(GoFlag)
  88.         {
  89.                 num++;
  90.                 if(num==5)
  91.                 {
  92.                         num=0;
  93.                         msecond++;
  94.                         if (msecond==100)//100進(jìn)1
  95.                         {
  96.                                 msecond=0;
  97.                                 second++;//秒加1
  98.                                 if(second==100)
  99.                                 second=0;
  100.                         }
  101.                 }
  102.         }
  103. }
  104. /*------------------------------------------------
  105.                         外部中斷0程序
  106. ------------------------------------------------*/
  107. void ISR_INT0(void) interrupt 0
  108. {
  109.         GoFlag=!GoFlag; //利用外部中斷打開和關(guān)閉定時標(biāo)志 用于開始和停止計時
  110. }
  111. /*------------------------------------------------
  112.                         外部中斷1程序
  113. ------------------------------------------------*/
  114. void ISR_INT1(void) interrupt 2
  115. {
  116.         if(GoFlag==0)//停止時才可以清零
  117.         CLR();
  118. }
  119. /*------------------------------------------------
  120.                         數(shù)值清零
  121. ------------------------------------------------*/
  122. void CLR(void)
  123. {
  124.         second=0;      //利用外部中斷清零
  125.         msecond=0;
  126. }

復(fù)制代碼
回復(fù)

使用道具 舉報

ID:111634 發(fā)表于 2017-1-8 13:31 | 顯示全部樓層
本帖最后由 zl2168 于 2017-1-8 13:32 編輯

一鍵三用:按第一次,秒表運(yùn)行計時,最大計時99.9s,超過復(fù)0。按第二次,秒表停運(yùn)行,但保持最后顯示秒數(shù)。按第三次,秒表清0。


實(shí)例93 99.9秒秒表
Proteus仿真一下,確認(rèn)有效。
實(shí)例95 99.9秒秒表.rar (38.86 KB, 下載次數(shù): 19)
99.9秒秒表.jpg
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,書中電路和程序設(shè)計有詳細(xì)說明,電路與程序真實(shí)可靠可信可行,程序語句條條有注解。若需99.99秒,硬件電路增加一位595軟件程序增加0.01s10ms)計數(shù)器,并修改相應(yīng)計數(shù)顯示程序。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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