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

標題: 單片機秒表程序,不知道錯在哪里 [打印本頁]

作者: 深層次    時間: 2023-10-19 20:16
標題: 單片機秒表程序,不知道錯在哪里
要求:按鍵1啟動秒表,數碼管共陽
               按鍵2停止秒表,顯示當前值
再按下按鍵1則從0開始計時,重復上述過程
計時范圍0-59,采用顯示緩沖器的方法編程,按鍵采用外部中斷處理

單片機源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段碼
uchar code seg_scan[]={16,16,16,16};//位選碼
uchar seg_buf[2]={0x01,0x02};//數碼管顯示緩沖區
void t0();//t0初始化
void ex();//外部中斷初始化
void display();//數碼管顯示函數
void delayme(uint xms);//延時函數
uchar a=0,count=0;
void Time();


void main()
{  t0();
   ex();
while(1)
  {   Time();
     display();
  }
}
/***************顯示函數**************/


void display()
{  uchar i,n=0x01;
  for(i=0;i<4;i++)
  {  P2=~n;//送位選
    P0=seg[seg_buf[ i]];//段碼[ i]
     delayme(2);
     n=n<<1;
     P0=0XFF;//消隱
     P2=0XFF;
  }


}


void t0()
{   TMOD=0X01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    ET0=1;   //打開t0中斷開關
    PT0=0;   
    EA=1;   //打開中斷總開關
}


void ex()
{  IT0=1;
   EX0=1;
   PX0=1;


   IT1=1;
   EX1=1;
   PX1=1;


   EA=1;


}


void t0_int() interrupt 1
{    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
   count++;
   if(count>=20)
   {count=0;a++;}
    if(a>=60)a=0;
  
}


void key1()interrupt 0
{
        TR0=1;//啟動t0
        a=0x00;
        IE0=0;//清int0中斷標志位
}


void key2()interrupt 2
{
        TR0=0;//啟動t0
        IE1=0;//清int1中斷標志位
}
void delayme(uint xms)
{ uint i,j;
for(i=0;i<xms;i++)
  for(j=0;j<120;j++);
}
void Time()
{   seg_buf[0]=seg[a%10];  //低位--個位
    seg_buf[1]=seg[a/10];   //高位--十位
}

作者: 深層次    時間: 2023-10-19 21:11
后來修改成這個樣子,但還是兩個同時計時,而且按下按鍵1不可以從0開始,而是從1開始,而且為什么從一到二需要的時間比二到三時間更多
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段碼
uchar code seg_scan[]={10,10,10,10};//位選碼
uchar seg_buf[2]={0x01,0x02};//數碼管顯示緩沖區
void t0();//t0初始化
void ex();//外部中斷初始化
void display(uchar date,uchar get);//數碼管顯示函數
void delayme(uint xms);//延時函數
uchar a=0,count=0;
uchar flags=0;//定時標志

void main()
{  t0();
   ex();
while(1)
  {if(flags==0)
   {  
     flags=1;
     a++;
     if(a>=60)
     {
       a=0;
     }
    seg_buf[0]=seg[a%10];  //低位
    seg_buf[1]=seg[a/10];   //高位

   }
  }
}


void display(uchar date,uchar get)
{  P2 = (P2&0x1f)|0xc0;
   P0=0X01<<get;
   P2 = (P2&0x1f)|0xf9;
   P0=date;
}

void t0()
{   TMOD=0X01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    ET0=1;   //打開t0中斷開關
    PT0=0;   
    EA=1;   //打開中斷總開關
}

void ex()
{  IT0=1;
   EX0=1;
   PX0=1;

   IT1=1;
   EX1=1;
   PX1=1;

   EA=1;

}

void t0_int() interrupt 1
{    uchar i=0;
   TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
   count++;
   if(count>=20)
   {count=0;
    flags=0;
    }
    P0=0XFF;
   switch(i)
   { case 0:i++;display(seg_buf[0],1);break;
      case 1:i++;display(seg_buf[1],0);break;
      default:break;
   }
  
}

void key1()interrupt 0
{
        TR0=1;//啟動t0
        a=0x00;
        IE0=0;//清int0中斷標志位
}

void key2()interrupt 2
{
        TR0=0;//啟動t0
        IE1=0;//清int1中斷標志位
}



作者: jhczy    時間: 2023-10-20 10:40
程序中當“flags==0”時,“a+1”,所以,顯示不可能有0的,需將“seg_buf[0]=seg[a%10];  //低位
    seg_buf[1]=seg[a/10];   //高位”調整到flags==0的外面
作者: jhczy    時間: 2023-10-20 10:44
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流程
作者: wulin    時間: 2023-10-20 11:16
錯誤比比皆是,給你改了。

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段碼
  5. uchar seg_buf[2]={0xc0,0xc0};//數碼管顯示緩沖區

  6. void t0();//t0初始化
  7. void ex();//外部中斷初始化
  8. void display();//數碼管顯示函數

  9. uchar a=0,sec;
  10. bit flags=0;//定時標志
  11. bit start;

  12. void main()
  13. {
  14.         t0();
  15.         ex();
  16.         while(1)
  17.         {
  18.                 if(flags && start)
  19.                 {  
  20.                         flags=0;
  21.                         if(++a>=200)
  22.                         {
  23.                                 a=0;
  24.                                 sec=++sec%60;
  25.                         }
  26.                         seg_buf[0]=seg[sec%10];  //低位
  27.                         seg_buf[1]=seg[sec/10];   //高位
  28.                 }
  29.         }
  30. }

  31. void t0()
  32. {
  33.         TMOD=0X01;
  34.         TH0=(65536-5000)/256;
  35.         TL0=(65536-5000)%256;
  36.         TR0=1;   
  37.         ET0=1;   //打開t0中斷開關
  38.         EA=1;   //打開中斷總開關
  39. }

  40. void ex()
  41. {
  42.         IT0=1;
  43.         EX0=1;
  44.         IT1=1;
  45.         EX1=1;
  46. }

  47. void display()
  48. {
  49.         static uchar i;
  50.         P0=0xff;
  51.         P2=0x01<<i;
  52.         P0=seg_buf[i];
  53.         if(++i==2)i=0;               
  54. }

  55. void t0_int() interrupt 1
  56. {
  57.         TH0=(65536-5000)/256;
  58.         TL0=(65536-5000)%256;
  59.         flags=1;
  60.         display();
  61. }

  62. void key1()interrupt 0
  63. {
  64.         sec=0;
  65.         a=0;
  66.         start=1;
  67. }

  68. void key2()interrupt 2
  69. {
  70.         start=0;
  71. }
復制代碼




作者: 深層次    時間: 2023-10-20 15:06
jhczy 發表于 2023-10-20 10:40
程序中當“flags==0”時,“a+1”,所以,顯示不可能有0的,需將“seg_buf[0]=seg[a%10];  //低位
    seg ...

按照你說的確實是可以從0開始計時,這個主意好棒。


作者: 深層次    時間: 2023-10-20 15:08
jhczy 發表于 2023-10-20 10:44
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流 ...

用仿真的軟件調試過了,但還是個十位同時計時,這就是問題


作者: 深層次    時間: 2023-10-20 19:23
wulin 發表于 2023-10-20 11:16
錯誤比比皆是,給你改了。

我試過你的方法確實可以實現要求,但問題是,我對于這部分代碼其實不怎么明白,不知道這樣設計的道理。

屏幕截圖 2023-10-20 192230.png (114.42 KB, 下載次數: 57)

屏幕截圖 2023-10-20 192230.png





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一级黄色毛片免费 | 亚洲在线久久 | 国产免费色 | 久久精品高清视频 | 欧美一区二区免费视频 | a在线视频| 久久99精品国产 | 国产香蕉视频在线播放 | 久久首页 | 天天看天天操 | 久国久产久精永久网页 | 国产精品久久久久久久久久久新郎 | 五月激情综合 | 99国产精品99久久久久久粉嫩 | 国产成人精品一区二区三区网站观看 | 女同av亚洲女人天堂 | а天堂中文最新一区二区三区 | 毛片一级片 | 亚洲欧美日韩中文字幕一区二区三区 | 欧美日韩在线视频一区二区 | 91成人精品 | 成人免费视频 | 免费黄色网址视频 | 日本在线精品视频 | 亚洲精品日韩一区二区电影 | caoporn国产精品免费公开 | av一区二区三区四区 | 一级黄色av电影 | 精品中文字幕一区二区三区 | 自拍偷拍第一页 | 国产精品不卡视频 | 午夜国产一级 | 国产一区二区久久 | 国产清纯白嫩初高生视频在线观看 | 99re66在线观看精品热 | 成人深夜小视频 | av男人的天堂在线 | 玖草资源 | 一区二区三区在线看 | 国产一区二区 | 久久国产免费看 |