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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 1461 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2023-10-19 20:16

正文摘要:

要求:按鍵1啟動秒表,數碼管共陽                按鍵2停止秒表,顯示當前值 再按下按鍵1則從0開始計時,重復上述過程 計時范圍0-59,采用顯示緩沖器的方法 ...

回復

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

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

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



ID:170318 發表于 2023-10-20 10:44
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流程
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: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中斷標志位
}


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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费人成在线观看网站 | 国产免费一区二区三区最新6 | 免费大黄视频 | 九九亚洲精品 | 久久国产日韩欧美 | 国产精品久久在线观看 | 国产99精品| 91精品麻豆日日躁夜夜躁 | 亚洲精品国产成人 | 中文字幕在线电影观看 | 国产一区www | 在线91| 国产一区二区三区四区五区加勒比 | 三级av在线 | 久久久国产一区 | 九九久久国产 | 视频在线一区二区 | 久久精品黄色 | 人人人人干 | 色综网 | japanhdxxxx裸体| 日韩在线视频免费观看 | 99爱国产 | 91在线视频免费观看 | 精品福利视频一区二区三区 | 国产精品久久久久久婷婷天堂 | av网站免费看 | 亚洲欧美精品久久 | 欧美video | 99精品一区二区 | 97人澡人人添人人爽欧美 | 亚洲精品一区二区三区蜜桃久 | 青草青草久热精品视频在线观看 | 农村真人裸体丰满少妇毛片 | 在线观看深夜视频 | 日韩欧美字幕 | 国产精品欧美一区二区三区 | 成人小视频在线观看 | 亚洲国产中文字幕 | 成人久久18免费网站图片 | 亚洲精品视频免费看 |