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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3615|回復: 4
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
程序下載單片機上運行0~99.99s計時時,單片機在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此類推;
而在運60s倒計時功能時,到了00.00后不停止計時,qian位顯示的字符為沒有在段碼數組中定義的字符,請問怎么解決,仿真圖和實物顯示一樣




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

sbit s1=P2^4;           //開始  
sbit s2=P2^5;         //復位
sbit s3=P2^6;                //記錄
sbit s4=P2^7;                //讀取

sbit feng=P3^6;        //控制蜂鳴器響不響   

unsigned char ge=0,shi=0,bai=0,qian=0,dao=0;      
unsigned char code led[ ]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //共陽極段碼   
unsigned char code led1[ ]={0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0}  ;//60s倒計時ge、shi、bai位段碼  
unsigned char code led2[ ]={0x92,0x99,0xb0,0xa4,0xf9,0xc0}  ;//60s倒計時qian位段碼   
void display();
void delay_ms(unsigned int ms)  // 延遲
{
   unsigned char a;
   while(ms--)
      for(a=125;a>0;a--);
}

void T0_init( )        //定時器T0初始化              
{
   TMOD=0x01;
           TH0=0xDC;       //10ms定時  
   TL0=0x00;
   EA=1;
   ET0=1;

}

void main()
{  

        feng=0;           
   T0_init( );

   while(1){         
      display( );
                 

      while(!s1)//0~99.99s計時
      {   

      feng=~feng;
                        ge=0,shi=0,bai=0,qian=0;
         display( );                                               
         if(s1)
                        {                dao=0;
                                 feng=~feng;
                 TR0=1;
                        }
      }
                while(!s2)                //        暫停
                {
                                feng=~feng;
                                TR0=0;
                }
                while(!s3)                        //60s倒計時       
                {       
                        feng=~feng;
                        ge=0,shi=0,bai=0,qian=0;
                         display( );
                        if(s3)
                        {
                        dao=1;
                        TR0=1;
                       

                }}

      while(!s4)         //清零鍵               
      {
                        feng=~feng;
         display( );
         if(s4)
                       
         TR0=0;
                        dao=0;
         qian=0;
         bai=0;
         shi=0;
         ge=0;
      }
if((dao==0&&qian==9&&bai==9&&ge==9&&shi==9)||(dao==1&&qian==5&&bai==9&&ge==9&&shi==9))                //計時結束后歸零
{
                        feng=~feng;
                        dao=0;
         TR0=0;
         qian=0;
         bai=0;
         shi=0;
         ge=0;

}

      }
}


void display( )
{
        if(dao==0)                        //        0~99.99s計時
        {
   P23=0;        //位選
   P0=led[ge];        //
   delay_ms(5); //消隱

   P23=1;        //位選
   P22=0;
   P0=led[shi];
   delay_ms(5); //消隱

   P22=1;        //位選
   P21=0;
   P0=led[bai]&0x7f;//   與操作,使數碼管最高位置一,點亮dp位        
   delay_ms(5); //消隱

   P21=1;        //位選
   P20=0;
   P0=led[qian];
   delay_ms(5); //消隱
   P20=1;}
        if(dao==1)                                                                        //60s倒計時
        {
        P23=0;        //位選
   P0=led1[ge];        //
   delay_ms(5); //消隱

   P23=1;        //位選
   P22=0;
   P0=led1[shi];
   delay_ms(5); //消隱

   P22=1;        //位選
   P21=0;
   P0=led1[bai]&0x7f;//   與操作,使數碼管最高位置一,點亮dp位        
   delay_ms(5); //消隱

   P21=1;        //位選
   P20=0;
   P0=led2[qian];
   delay_ms(5); //消隱
   P20=1;
       
        }

       
}


void T0int( ) interrupt 1 //定時器T0中斷 方式1        
{
   TH0=0xDC;       //重新給a,10ms定時  65536-55536(a)  
   TL0=0x00;
   ge++;
   if(ge==10){
      ge=0;
      shi++;
      }
   if(shi==10){
      shi=0;
      bai++;
      }
    if(bai==10){        //滿十進位   
         bai=0;
         qian++;
         }
}

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

使用道具 舉報

沙發
ID:436885 發表于 2020-6-12 01:22 | 只看該作者
第一顯示刷新頻率要改一下,第二 狀態寄存超字節范圍,
回復

使用道具 舉報

板凳
ID:332444 發表于 2020-6-12 08:24 | 只看該作者
三極管用法若得禍
回復

使用道具 舉報

地板
ID:213173 發表于 2020-6-12 13:56 | 只看該作者
qian++;沒有限制最大9。千位數大于9顯示亂碼。給你換一個思路寫這個程序,你試試。

  1. #include<reg51.h>
  2. #include<stdio.h>
  3. //sbit P20=P2^0;          //四位數碼管位選
  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;           //模式/復位
  9. //sbit s3=P2^6;                //記錄
  10. //sbit s4=P2^7;                //讀取
  11. sbit BUZZER=P3^6;        //蜂鳴器

  12. unsigned char code led[]={//共陽數碼管段碼"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定時 用于無源蜂鳴器驅動
  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;        //按鍵自鎖標志
  37.         static unsigned char count=0;                //消抖計數變量                       
  38.         if(!s1||!s2)                                        //檢測按鍵如果為0
  39.         {
  40.                 if(++count>=10 && sign==0)
  41.                 {                       
  42.                         sign=1;                        //按鍵自鎖標志置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)//模式/復位鍵   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;                                //按鍵自鎖標志清0
  84.                 count=0;                                        //消抖計數清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;//加小數點
  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)//正計數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. }
復制代碼




回復

使用道具 舉報

5#
ID:778766 發表于 2020-6-14 10:34 | 只看該作者
wulin 發表于 2020-6-12 13:56
qian++;沒有限制最大9。千位數大于9顯示亂碼。給你換一個思路寫這個程序,你試試。

一位共陰極數碼管顯示0~9秒,9秒后自動回零;3個按鈕開關控制,一個開關控制計時開始,一個開關控制暫停,一個開關控制回零
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久免费 | 日韩欧美国产一区二区三区 | 一二区成人影院电影网 | 亚洲狠狠爱一区二区三区 | 亚洲人成人一区二区在线观看 | 国产精品一区二区视频 | 国产精品久久久亚洲 | 亚洲精品久久久久久国产精华液 | 日韩精品在线免费观看 | 色毛片 | 国产精品不卡 | 精品一区二区三区日本 | 黄色网址免费在线观看 | 日韩伦理一区二区 | 国产精品亚洲一区二区三区在线 | 精品1区2区3区 | 中文字幕在线不卡播放 | 国产一区二区免费 | 国产激情一区二区三区 | 国产精品1区2区3区 一区中文字幕 | 可以在线观看av的网站 | 国产精品久久在线观看 | 国产综合在线视频 | 免费黄色片视频 | 久久久人成影片一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 免费国产视频在线观看 | 久热国产精品视频 | 午夜影视网 | 久久国产精品免费一区二区三区 | 成人国产精品久久久 | 亚洲国产精品一区二区三区 | 国产一区二区三区 | 日韩精品一区二区三区免费观看 | 欧美激情黄色 | 色婷婷精品久久二区二区蜜臂av | 国产成人短视频在线观看 | 亚洲第一av| 国户精品久久久久久久久久久不卡 | 91亚洲视频在线 | 亚洲精品久久久一区二区三区 |