基于51单片机的00-99秒表--C语言

来源:互联网 发布:知乎 神人 常凯申 编辑:程序博客网 时间:2024/06/06 10:39

//以前写过一个计时程序,是用汇编语言写的,只用了一个按键实现计时器的启动、暂停和复位。
//有位网友要求用C语言写一遍,并提供了部分程序,在下面的博文留言中可以看到:
//http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/2ece818af7a3f20bc9fc7aca.html
//但是这个程序有不少错误,设定定时器的方式时,使用了T0,但是却把初始值送到了TH1TL1,呵呵
//接着启动了T1,之后却反复判断TF0是否为1 !
//这个程序并且缺少开始/暂停/复位的按键,有兴趣的读者可以到上面的链接去看原始程序。
//
//做而论道对程序进行了改正,增加了启动、暂停和复位的按键,原来的个位加一的按键功能,照样保留。
//然后又补写了许多注释。

//程序仿真运行时的截图如下:

基于51单片机的00-99秒表--C语言 - 非著名博主 - 电子信息角落

//图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/0afb4b98a9014c0805b9c3e20a7b020879f4f4dd.html

//程序如下:

#include <at89x52.h>
//--------------------------------------------------
unsigned char code Seg7Code[16] = { //用十六进数作为数组下标,可直接取得对应的七段编码字节
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0 1 2 3 4 5 6 7   
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};// 8 9 A b C d E F
//--------------------------------------------------
void main( void )
{
    unsigned int us250 = 0;
    unsigned char s10 = 0;
    unsigned char s1 = 0;

    unsigned char key1 = 0;   //记忆按键状态,为1按下
    unsigned char key2 = 0;   //记忆按键状态,为1按下
//--------------------------------------------------
    TMOD = (TMOD & 0xF0) | 0x02;    //T0定时方式2
    TH0 = -250;//对于8位二进数来说, -250=6, 就是加250次1时为256,即为0
    TR0 = 1;
    while(1)  {             //----循环1--显示、循环2
      P0 = 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 >= 10 ) s10 = 0;
            }
            break;          //跳出"循环2",去显示
        } }
//--------------------------------------------------
        P3_2 = 1;           //输入,先要输出高电平

        if( key2 == 1 )  {         //已经按过
          if( P3_2 == 1 ) key2 = 0;//松键
        }
        else {                     //未按过
          if( P3_2 == 0 )  {       //现在按下了
            key2 = 1;
            if (TR0)  TR0 = 0;
            else {
              s1 = 0;  s10 = 0;    //清零
              us250 = 0;
              TR0 = 1;
              break;        //跳出"循环2",去显示
        } } }
//--------------------------------------------------
        P3_3 = 1;           //输入,先要输出高电平

        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
//--------------------------------------------------

0 0
原创粉丝点击