找回密码
 立即注册
查看: 31|回复: 2

12-2 秒表(定时器扫描按键数码管),江协科技讲普中51单片机开发板STC89C52学习板 配套

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:21:47 | 显示全部楼层 |阅读模式
12-2 秒表(定时器扫描按键数码管),江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
主程序main.C代码如下:


#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include "Nixie.h"
#include "Delay.h"
#include "AT24C02.h"

unsigned char KeyNum;
unsigned char Min,Sec,MiniSec;
unsigned char RunFlag;

void main()
{
        Timer0_Init();
        while(1)
        {
                KeyNum=Key();
                if(KeyNum==1)                        //K1按键按下
                {
                        RunFlag=!RunFlag;        //启动标志位翻转
                }
                if(KeyNum==2)                        //K2按键按下
                {
                        Min=0;                                //分秒清0
                        Sec=0;
                        MiniSec=0;
                }
                if(KeyNum==3)                        //K3按键按下
                {
                        AT24C02_WriteByte(0,Min);        //将分秒写入AT24C02
                        Delay(5);
                        AT24C02_WriteByte(1,Sec);
                        Delay(5);
                        AT24C02_WriteByte(2,MiniSec);
                        Delay(5);
                }
                if(KeyNum==4)                        //K4按键按下
                {
                        Min=AT24C02_ReadByte(0);        //读出AT24C02数据
                        Sec=AT24C02_ReadByte(1);
                        MiniSec=AT24C02_ReadByte(2);
                }
                Nixie_SetBuf(1,Min/10);        //设置显示缓存,显示数据
                Nixie_SetBuf(2,Min%10);
                Nixie_SetBuf(3,11);
                Nixie_SetBuf(4,Sec/10);
                Nixie_SetBuf(5,Sec%10);
                Nixie_SetBuf(6,11);
                Nixie_SetBuf(7,MiniSec/10);
                Nixie_SetBuf(8,MiniSec%10);
        }
}

/**
  * @brief  秒表驱动函数,在中断中调用
  * @param  无
  * @retval 无
  */
void Sec_Loop(void)
{
        if(RunFlag)
        {
                MiniSec++;
                if(MiniSec>=100)
                {
                        MiniSec=0;
                        Sec++;
                        if(Sec>=60)
                        {
                                Sec=0;
                                Min++;
                                if(Min>=60)
                                {
                                        Min=0;
                                }
                        }
                }
        }
}

void Timer0_Routine() interrupt 1
{
        static unsigned int T0Count1,T0Count2,T0Count3;
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        T0Count1++;
        if(T0Count1>=20)
        {
                T0Count1=0;
                Key_Loop();        //20ms调用一次按键驱动函数
        }
        T0Count2++;
        if(T0Count2>=2)
        {
                T0Count2=0;
                Nixie_Loop();//2ms调用一次数码管驱动函数
        }
        T0Count3++;
        if(T0Count3>=10)
        {
                T0Count3=0;
                Sec_Loop();        //10ms调用一次数秒表驱动函数
        }
}


12-2 秒表(定时器扫描按键数码管).zip

57.72 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:22:35 | 显示全部楼层
12-2 秒表(定时器扫描按键数码管),江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
Nixie.C代码如下:

#include <REGX52.H>
#include "Delay.h"

//数码管显示缓存区
unsigned char Nixie_Buf[9]={0,10,10,10,10,10,10,10,10};

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};

/**
  * @brief  设置显示缓存区
  * @param  Location 要设置的位置,范围:1~8
  * @param  Number 要设置的数字,范围:段码表索引范围
  * @retval 无
  */
void Nixie_SetBuf(unsigned char Location,Number)
{
        Nixie_Buf[Location]=Number;
}

/**
  * @brief  数码管扫描显示
  * @param  Location 要显示的位置,范围:1~8
  * @param  Number 要显示的数字,范围:段码表索引范围
  * @retval 无
  */
void Nixie_Scan(unsigned char Location,Number)
{
        P0=0x00;                                //段码清0,消影
        switch(Location)                //位码输出
        {
                case 1:P2_4=1;P2_3=1;P2_2=1;break;
                case 2:P2_4=1;P2_3=1;P2_2=0;break;
                case 3:P2_4=1;P2_3=0;P2_2=1;break;
                case 4:P2_4=1;P2_3=0;P2_2=0;break;
                case 5:P2_4=0;P2_3=1;P2_2=1;break;
                case 6:P2_4=0;P2_3=1;P2_2=0;break;
                case 7:P2_4=0;P2_3=0;P2_2=1;break;
                case 8:P2_4=0;P2_3=0;P2_2=0;break;
        }
        P0=NixieTable[Number];        //段码输出
}

/**
  * @brief  数码管驱动函数,在中断中调用
  * @param  无
  * @retval 无
  */
void Nixie_Loop(void)
{
        static unsigned char i=1;
        Nixie_Scan(i,Nixie_Buf);
        i++;
        if(i>=9){i=1;}
}


回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:23:13 | 显示全部楼层
12-2 秒表(定时器扫描按键数码管),江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
Key.C代码如下:

#include <REGX52.H>
#include "Delay.h"

unsigned char Key_KeyNumber;

/**
  * @brief  获取按键键码
  * @param  无
  * @retval 按下按键的键码,范围:0,1~4,0表示无按键按下
  */
unsigned char Key(void)
{
        unsigned char Temp=0;
        Temp=Key_KeyNumber;
        Key_KeyNumber=0;
        return Temp;
}

/**
  * @brief  获取当前按键的状态,无消抖及松手检测
  * @param  无
  * @retval 按下按键的键码,范围:0,1~4,0表示无按键按下
  */
unsigned char Key_GetState()
{
        unsigned char KeyNumber=0;
       
        if(P3_1==0){KeyNumber=1;}
        if(P3_0==0){KeyNumber=2;}
        if(P3_2==0){KeyNumber=3;}
        if(P3_3==0){KeyNumber=4;}
       
        return KeyNumber;
}

/**
  * @brief  按键驱动函数,在中断中调用
  * @param  无
  * @retval 无
  */
void Key_Loop(void)
{
        static unsigned char NowState,LastState;
        LastState=NowState;                                //按键状态更新
        NowState=Key_GetState();                //获取当前按键状态
        //如果上个时间点按键按下,这个时间点未按下,则是松手瞬间,以此避免消抖和松手检测
        if(LastState==1 && NowState==0)
        {
                Key_KeyNumber=1;
        }
        if(LastState==2 && NowState==0)
        {
                Key_KeyNumber=2;
        }
        if(LastState==3 && NowState==0)
        {
                Key_KeyNumber=3;
        }
        if(LastState==4 && NowState==0)
        {
                Key_KeyNumber=4;
        }
}


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-24 05:52 , Processed in 0.067010 second(s), 52 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表