找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機(jī)秒表程序到了指定時間不會停下來

查看數(shù): 3639 | 評論數(shù): 4 | 收藏 1
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2020-6-11 21:01

正文摘要:

程序下載單片機(jī)上運(yùn)行0~99.99s計時時,單片機(jī)在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此類推; 而在運(yùn)60s倒計時功能時,到了00.00后不停止計時,qian位顯示的字符為沒有在段碼數(shù)組中定義的字符, ...

回復(fù)

ID:778766 發(fā)表于 2020-6-14 10:34
wulin 發(fā)表于 2020-6-12 13:56
qian++;沒有限制最大9。千位數(shù)大于9顯示亂碼。給你換一個思路寫這個程序,你試試。

一位共陰極數(shù)碼管顯示0~9秒,9秒后自動回零;3個按鈕開關(guān)控制,一個開關(guān)控制計時開始,一個開關(guān)控制暫停,一個開關(guān)控制回零
ID:213173 發(fā)表于 2020-6-12 13:56
qian++;沒有限制最大9。千位數(shù)大于9顯示亂碼。給你換一個思路寫這個程序,你試試。

  1. #include<reg51.h>
  2. #include<stdio.h>
  3. //sbit P20=P2^0;          //四位數(shù)碼管位選
  4. //sbit P21=P2^1;
  5. //sbit P22=P2^2;
  6. //sbit P23=P2^3;

  7. sbit s1=P2^4;           //開始/暫停
  8. sbit s2=P2^5;           //模式/復(fù)位
  9. //sbit s3=P2^6;                //記錄
  10. //sbit s4=P2^7;                //讀取
  11. sbit BUZZER=P3^6;        //蜂鳴器

  12. unsigned char code led[]={//共陽數(shù)碼管段碼"0~f-."
  13.                 0xc0,0xf9,0xa4,0xb0,
  14.                 0x99,0x92,0x82,0xf8,
  15.                 0x80,0x90,0x88,0x83,
  16.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  17. unsigned char shu[4];
  18. unsigned char sec=0;
  19. char num=0;
  20. bit flag=0;
  21. bit pause=0;

  22. void T0_init()        //定時器T0初始化              
  23. {
  24.         TMOD=0x21;
  25.         TH0=0xDC;       //10ms定時  
  26.         TL0=0x00;
  27.         TH1=0x38;       //200us定時 用于無源蜂鳴器驅(qū)動
  28.         TL1=0x38;
  29.         EA=1;
  30.         ET0=1;
  31.         ET1=1;
  32.         TR0=1;
  33. }

  34. void keyscan()                                        //按鍵掃描程序
  35. {
  36.         static bit sign=0;        //按鍵自鎖標(biāo)志
  37.         static unsigned char count=0;                //消抖計數(shù)變量                       
  38.         if(!s1||!s2)                                        //檢測按鍵如果為0
  39.         {
  40.                 if(++count>=10 && sign==0)
  41.                 {                       
  42.                         sign=1;                        //按鍵自鎖標(biāo)志置1
  43.                         if(!s1) //開始/暫停
  44.                         {
  45.                                 if(pause==0&&flag==0)
  46.                                 {
  47.                                         if(num==99 && sec==99)
  48.                                         {
  49.                                                 sec=0;
  50.                                                 num=0;
  51.                                         }
  52.                                 }
  53.                                 if(pause==0&&flag==1)
  54.                                 {
  55.                                         if(num==0 && sec==0)
  56.                                         {
  57.                                                 sec=59;
  58.                                                 num=100;
  59.                                         }
  60.                                 }
  61.                                 pause=~pause;
  62.                         }
  63.                         if(!s2)//模式/復(fù)位鍵   99s正計時/60s倒計時
  64.                         {
  65.                                 pause=0;
  66.                                 flag=~flag;
  67.                                 if(flag)
  68.                                 {
  69.                                         sec=60;
  70.                                         num=00;
  71.                                 }
  72.                                 else
  73.                                 {
  74.                                         sec=0;
  75.                                         num= 0;
  76.                                 }
  77.                         }
  78.                         TR1=1;//開蜂鳴器
  79.                 }
  80.         }
  81.         else                                                        //按鍵抬起
  82.         {
  83.                 sign=0;                                //按鍵自鎖標(biāo)志清0
  84.                 count=0;                                        //消抖計數(shù)清0
  85.         }
  86. }

  87. void display( )
  88. {
  89.         static unsigned char i=0;
  90.         shu[0]=led[sec/10];
  91.         shu[1]=led[sec%10];
  92.         shu[2]=led[num/10%10];
  93.         shu[3]=led[num%10];
  94.         P0 =0xff;
  95.         P2&=0xf0;
  96.         if(i==1) P0=shu[i]&0x7f;//加小數(shù)點(diǎn)
  97.         else P0=shu[i];
  98.         P2|=(0x01<<i);
  99.         i++;
  100.         i%=4;
  101. }

  102. void main()
  103. {         
  104.         T0_init();
  105.         while(1)
  106.         {         
  107.                 keyscan();
  108.                 display();               
  109.         }
  110. }

  111. void T0int() interrupt 1 //定時器T0中斷 方式1        
  112. {
  113.         TH0=0xDC;
  114.         TL0=0x00;
  115.         if(pause)
  116.         {
  117.                 if(!flag)//正計數(shù)99.99s
  118.                 {
  119.                         num++;
  120.                         if(num==99 && sec==99)
  121.                         {
  122.                                 pause=0;
  123.                                 TR1=1;
  124.                         }
  125.                         if(num>99)
  126.                         {
  127.                                 num=0;
  128.                                 sec++;
  129.                         }
  130.                 }
  131.                 else        //倒計時60.00s
  132.                 {
  133.                         num--;
  134.                         if(num==0&&sec==0)
  135.                         {
  136.                                 pause=0;
  137.                                 TR1=1;
  138.                         }
  139.                         if(num<0)
  140.                         {
  141.                                 num=99;
  142.                                 sec--;
  143.                         }
  144.                 }
  145.         }
  146. }

  147. void T1int() interrupt 3
  148. {
  149.         static unsigned int count=0;
  150.         BUZZER=~BUZZER;
  151.         count++;
  152.         if(count>=250)
  153.         {
  154.                 count=0;
  155.                 BUZZER=1;
  156.                 TR1=0;
  157.         }
  158. }
復(fù)制代碼




ID:332444 發(fā)表于 2020-6-12 08:24
三極管用法若得禍
ID:436885 發(fā)表于 2020-6-12 01:22
第一顯示刷新頻率要改一下,第二 狀態(tài)寄存超字節(jié)范圍,

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

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

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