找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6993|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

秒表程序……歡迎斧正

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:3324 發(fā)表于 2010-6-21 23:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

想做個(gè)秒表程序,當(dāng)鍵盤按下后,秒表停止,再按下另一個(gè)鍵后,秒表又恢復(fù)工作,可是我寫的程序,當(dāng)鍵盤有鍵按下時(shí),就停止了,無論再按什么鍵,都沒有反應(yīng),求哪位同仁幫我修改一下,謝謝了!想結(jié)交單片機(jī)愛好者!

#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char
uchar code disp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7f,0x39,0x3f,0x79,0x71};
//數(shù)碼管顯示十六進(jìn)制,從0到f
uchar code select[]={7,6,5,4,3,2,1,0};
//位選數(shù)組,自左至右
uint key,temp;
uint tt0=0;
uint num=0;
void display(uint second);
void delay(uint z);

void init()  //初始化子函數(shù)
{
 TMOD=0x01; //定時(shí)器0工作在方式一
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;  //開總中斷
 ET0=1;  //開定時(shí)器0中斷
 TR0=1;  //計(jì)時(shí)開始
}

void Timer0() interrupt 1 //定時(shí)器0中斷子函數(shù)
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 tt0++;
}

void delay(uint z)   //延時(shí)子函數(shù)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--); 
}

void display(uint second)  //顯示子函數(shù)
{
 uint bai,shi,ge;
 bai=second/100;
 shi=second%100/10;
 ge=second%100%10;
 
 if(bai!=0)    //此處的判斷是為了消除重影,不然當(dāng)沒有到100時(shí),百位上總會(huì)有一個(gè)0在隱隱約約的顯示
  { 
  P0=disp[bai];  //顯示百位
  P2=select[2];
  delay(1);    //延時(shí)0.1s左右
  }
 if(shi!=0)
  {  
  P0=disp[shi];  //顯示十位
  P2=select[1];
  delay(1);
  }

 P0=disp[ge];  //顯示個(gè)位
 P2=select[0];
 delay(1);
} 

void main()
{
 init();
 while(1)
 {
  if(tt0!=2)  //此處為顯示秒表
  {
   display(num);
  }
  else 
  {
   tt0=0;
   num++;
  }
  P3=0x7f;  //開始檢測(cè)按鍵
  temp=P3;
  while(temp!=0x7f) //檢測(cè)是否有鍵按下
  {
   delay(5);  //延時(shí)幾毫秒后,再次檢測(cè),防干擾
   temp=P3;
   while(temp!=0x7f) 
   {
    temp=P3;
    switch(temp)
    {
     case 0x7e:key=1;
       break;
     case 0x7d:key=2;
       break;
     case 0x7b:key=3;
       break;
     case 0x77:key=4;
       break;
    }
    if(key==1)  //若第一個(gè)鍵按下,定時(shí)器停止計(jì)時(shí)
    {
     TR0=0; //定時(shí)器0停止計(jì)時(shí)
     temp=0xff; //跳出while循環(huán)
    }
    if(key==2)  //若第二個(gè)鍵按下,定時(shí)器又重新開始計(jì)時(shí)
    {
     temp=0xff;
     TR0=1;
    }
   }
  }
  
 }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:23004 發(fā)表于 2010-6-22 11:17 | 只看該作者

看到你的程序結(jié)構(gòu),哥們就暈了。。。。

給你一個(gè)99秒表的參考程序:

#include <REGX51.H>
#include <../stdint.h>
#include <ABSACC.H>
#include <INTRINS.H>
//------------------------------
#define  TH_10MS  (65536-10000)/256
#define  TL_10MS  (65536-10000)%256
//------------------------------------------
#define led12 XBYTE[0xf7ff] //led1與led2數(shù)碼管
#define led34 XBYTE[0xefff] //led3與led4數(shù)碼管
#define led_light P3_7
#define keyst  P1_0
#define keyclk  P1_1

volatile struct _clock
{
 uint8_t t_s;//秒
 uint8_t t_ms;//分秒
 uint8_t led_lightf : 1;//中間燈   ==bit  led_lightf;
 uint8_t keyf_st : 1;   //開停鍵標(biāo)志
 uint8_t keyf_clk : 1;  //清0鍵標(biāo)志
 uint8_t clockf_st : 1; //開始計(jì)時(shí)標(biāo)志
#define  STOP 0
#define  START 1
 uint8_t : 0;
}clock;


//-----------------delay-----------------------------
void delay_10ms()
{
 uint8_t i, j;
 for(i=0; i<100; i++)
  for(j=0; j<100; j++);
}

//-------------------10進(jìn)制顯示-----------------------
void display_val(uint8_t data_l, uint8_t data_r)
{
 uint8_t led_tmp12, led_tmp34;
 //取右邊分秒
 led_tmp12 = (data_r/10)%10;
 led_tmp12 <<=4;
 led_tmp12 |= (uint8_t)(data_r%10);
 //取左邊秒
 led_tmp34 = (data_l/10)%10;
 led_tmp34 <<=4;
 led_tmp34 |= data_l%10;

 led12 = led_tmp12;//送顯示
 led34 = led_tmp34;
}

//------------------------初始化--------------
void clr_data()
{
 clock.t_s = 0;
 clock.t_ms = 0;
 clock.led_lightf = 0;
 clock.keyf_st = 0;
 clock.keyf_clk = 0;
 clock.clockf_st = STOP;
 TR0 = 0;   //關(guān)定時(shí)器
 display_val(0,0);
 led_light = 0;  
}
void init_sys()
{
 clr_data();
 //定時(shí)器0設(shè)置
 TMOD = 0x01; //定時(shí)器0設(shè)為MAOD1
 TCON = 0x00; //清標(biāo)志位
 TH0 = TH_10MS;
 TL0 = TL_10MS;
 //TR0 = 1;   //開定時(shí)器
 //IE = 0x8a; //開定時(shí)中斷0,1與總開關(guān)
 EA = 1;
 ET0 = 1;
}

//--------------------鍵盤掃描-----------------
void key_scan()
{
 bit keyf;
 keyf = keyst & keyclk;
 if(keyf)
  goto error;
 delay_10ms();
 keyf = keyst & keyclk;
 if(keyf)
  goto error;
  clock.keyf_st = !keyst;
  clock.keyf_clk = !keyclk;
  do
  {
   keyf = keyst & keyclk;
  }
  while(!keyf);
error:
 return ;  
}

//--------------------鍵盤處理-------------------
void key_deal()
{
 if(clock.keyf_st)
 {
  if(clock.clockf_st == STOP)
   TR0 = 1;
  else
   TR0 = 0;
  clock.clockf_st = ~clock.clockf_st;
  clock.keyf_st = 0;
 }
 if(clock.keyf_clk)
   {
  clr_data();
  clock.keyf_clk = 0;
   }
}

// -------------------main------------------------
void main()
{
 init_sys();
 while(1)
 {
  key_scan();//鍵盤掃描
  key_deal();//鍵盤處理
 }
}
//----------------------定時(shí)中斷0-----------------
void  t0_interrupt() interrupt 1
{
 
 TR0 = 0;

 clock.t_ms++;
 if(clock.t_ms == 100)
 {
  clock.t_ms = 0;
  clock.t_s++;
  if(clock.t_s == 100)
   clock.t_s = 0;
  clock.led_lightf = ~clock.led_lightf;
 }
 display_val(clock.t_s, clock.t_ms);
 led_light = clock.led_lightf;
 TH0 = TH_10MS;
 TL0 = TL_10MS;
 TR0 = 1;
}

回復(fù)

使用道具 舉報(bào)

板凳
ID:17294 發(fā)表于 2010-6-29 22:49 | 只看該作者
C語言有注釋比較好讀
回復(fù)

使用道具 舉報(bào)

地板
ID:25278 發(fā)表于 2010-8-3 18:25 | 只看該作者
樓主遍的看著舒服
回復(fù)

使用道具 舉報(bào)

5#
ID:25782 發(fā)表于 2010-8-28 22:14 | 只看該作者

void main()
{
init();
while(1)
{
  if(tt0!=2)  //此處為顯示秒表///////其實(shí)這里是很冒險(xiǎn)的也是很容易出問題的,初學(xué)者很容易將可以“片”判斷條件不用,而用“點(diǎn)”判斷條件,如這里,如果tt0>=2呢?這也不是不可能,如tt0剛剛加到2,而這時(shí)按鍵1動(dòng)作(按鍵除抖延時(shí)還是很長(zhǎng)的,在這段時(shí)間tt0會(huì)在T0中斷里不斷增加),這樣,顯示一直在運(yùn)行,而tt0遲遲回不到“0”,就會(huì)陷入死循環(huán)了 ,將這里改成if(tt0<2)看看

 {
   display(num);
  }
  else
  {
   tt0=0;
   num++;
  }


 

 


 

[此貼子已經(jīng)被作者于2010-9-11 19:58:54編輯過]
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表