赞助论坛
  • 4450阅读
  • 0回复

51单片机编程基础之三 [复制链接]

楼层直达
rkvclu  
发帖
17
精华
0
金币
65
威望
3
贡献
0
好评
0
注册
2008-06-14
楼主    rkvclu 发表于: 2008-06-16 15:14:03 
双数码管可调秒表
解:只要满足题目要求,方法越简单越好。由于单片机I/O资源足够,所以双数码管可接成静态显示方式,两个共阴数码管分别接在P1(秒十位)和P2(秒个位)口,它们的共阴极都接地,安排两个按键接在P3.2(十位数调整)和P3.3(个位数调整)上,为了方便计时,选用12MHz的晶体。为了达到精确计时,选用定时器方式2,每计数250重载一次,即250us,定义一整数变量计数重载次数,这样计数4000次即为一秒。定义两个字节变量S10和S1分别计算秒十位和秒个位。编得如下程序:


代码
#include <at89x52.h>  
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节  
// 0   1   2   3   4   5   6   7   8   9   A   b   C   d   E   F  
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};  
void main( void )  
{  
unsigned int us250 = 0;  
unsigned char s10 = 0;  
unsigned char s1 = 0;  
unsigned char key10 = 0; //记忆按键状态,为1按下  
unsigned char key1 = 0; //记忆按键状态,为1按下  
//初始化定时器 Timer0  
TMOD = (TMOD & 0xF0) | 0x02;  
TH1 = -250; //对于8位二进数来说,-250=6,也就是加250次1时为256,即为0  
TR1 = 1;  
while(1){       //----------循环1  
P1 = Seg7Code[ s10 ]; //显示秒十位  
P2 = Seg7Code[ s1 ]; //显示秒个位  
while( 1 ){       //----------循环2  
  //计时处理  
if( TF0 == 1 ){  
  TF0 = 0;  
  if( ++us250 >= 4000 ){  
  us250 = 0;  
  if( ++s1 >= 10 ){  
    s1 = 0;  
    if( ++s10 >= 6 ) s10 = 0;  
  }  
  break; //结束“循环2”,修改显示  
  }  
  }  
  //按十位键处理  
  P3.2 = 1; //P3.2作为输入,先要输出高电平  
  if( key10 == 1 ){ //等松键  
if( P3.2 == 1 ) key10=0;  
  }  
else{   //未按键  
  if( P3.2 == 0 ){  
  key10 = 1;  
if( ++s10 >= 6 ) s10 = 0;  
  break; //结束“循环2”,修改显示  
  }  
  }  
  //按个位键处理  
  P3.3 = 1; //P3.3作为输入,先要输出高电平  
  if( key1 == 1 ) //等松键  
{ if( P3.3 == 1 ) key1=0; }  
  else {   //未按键  
  if( P3.3 == 0 ){ key1 = 1;  
if( ++s1 >= 10 ) s1 = 0;  
  break; //结束“循环2”,修改显示  
  }  
  }  
} //循环2’end  
}//循环1’end  
}//main’end