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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
要求:按鍵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];   //高位--十位
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 | 只看該作者
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流程
回復

使用道具 舉報

5#
ID:213173 發表于 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. }
復制代碼



回復

使用道具 舉報

6#
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開始計時,這個主意好棒。

回復

使用道具 舉報

7#
ID:1096616 發表于 2023-10-20 15:08 | 只看該作者
jhczy 發表于 2023-10-20 10:44
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流 ...

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

回復

使用道具 舉報

8#
ID:1096616 發表于 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
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚州精品天堂中文字幕 | 国产激情精品视频 | 日韩成人在线免费观看 | 国产视频二区 | 亚洲久在线 | 在线午夜电影 | 成人av网站在线观看 | 狠狠久 | 91精品国产综合久久婷婷香蕉 | 国产ts人妖另类 | 国产精品日日夜夜 | 婷婷久久综合 | 亚洲免费在线 | 精品一区二区三区视频在线观看 | 欧美成人一区二免费视频软件 | 国产精品特级毛片一区二区三区 | japan21xxxxhd美女 日本欧美国产在线 | 婷婷色国产偷v国产偷v小说 | 精品视频一区二区三区在线观看 | 欧美精品综合在线 | 日韩二区 | 亚洲色片网站 | 欧美一级二级在线观看 | 欧美1区| 99亚洲精品 | 成人免费一区二区三区视频网站 | 亚洲免费一区 | 久久91精品国产一区二区 | 亚洲大片在线观看 | a级黄色网| 高清18麻豆 | 中文字幕高清 | 黄色在线观看国产 | 欧美成视频| 久精品视频| a欧美| 成人深夜福利 | 黄色国产在线视频 | 亚洲区一区二区 | 视频一区中文字幕 | 成人免费淫片aa视频免费 |