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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1472|回復: 7
收起左側

單片機秒表程序,不知道錯在哪里

[復制鏈接]
ID:1096616 發表于 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];   //高位--十位
}
回復

使用道具 舉報

ID:1096616 發表于 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中斷標志位
}


回復

使用道具 舉報

ID:170318 發表于 2023-10-20 10:40 | 顯示全部樓層
程序中當“flags==0”時,“a+1”,所以,顯示不可能有0的,需將“seg_buf[0]=seg[a%10];  //低位
    seg_buf[1]=seg[a/10];   //高位”調整到flags==0的外面
回復

使用道具 舉報

ID:170318 發表于 2023-10-20 10:44 | 顯示全部樓層
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流程
回復

使用道具 舉報

ID:213173 發表于 2023-10-20 11:16 | 顯示全部樓層
錯誤比比皆是,給你改了。 無標題.jpg

  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. }
復制代碼



回復

使用道具 舉報

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

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

回復

使用道具 舉報

ID:1096616 發表于 2023-10-20 15:08 | 顯示全部樓層
jhczy 發表于 2023-10-20 10:44
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流 ...

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

回復

使用道具 舉報

ID:1096616 發表于 2023-10-20 19:23 | 顯示全部樓層
wulin 發表于 2023-10-20 11:16
錯誤比比皆是,給你改了。

我試過你的方法確實可以實現要求,但問題是,我對于這部分代碼其實不怎么明白,不知道這樣設計的道理。
屏幕截圖 2023-10-20 192230.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产在线 | 天天干一干 | 国产7777| 国产日韩欧美亚洲 | 青青草国产在线视频 | 欧美日韩亚洲国产 | 国产三级黄色 | 在线观看小视频 | 精品三级在线观看 | 亚洲欧美另类在线观看 | 99久久久 | 成人免费毛片入口 | 成人黄色网 | www欧美| 欧美黄色免费 | 国产精品久久久久久久久久久久久 | 五月婷婷在线观看 | 日韩在线免费视频 | 亚洲特级片 | 黄色免费毛片 | 一级毛片在线看 | 成人在线免费视频观看 | 色婷婷网 | 日韩少妇av | 男人的天堂亚洲 | 一级片aa | 草草视频在线观看 | 日本免费在线 | 狠狠干欧美 | www.一级片| 亚洲香蕉视频 | 日本在线不卡视频 | 亚洲精品久久久久avwww潮水 | 国产h在线观看 | 欧美又粗又长 | 视频一区在线播放 | 成人国产综合 | 成人做爰免费视频免费看 | 国产在线不卡 | 日本欧美在线 | 亚洲国产天堂 |