标题:一个秒表程序,新手上路
只看楼主
尘曦
Rank: 2
来 自:四川省泸州市
等 级:论坛游民
帖 子:14
专家分:20
注 册:2018-10-28
 问题点数:0 回复次数:4 
一个秒表程序,新手上路
//功能说明:1.按下按键k4,秒表开始/暂停计时
//                    2.按下按键k5,秒表清零计时,并等待开始计时
//                    3.在等待计时过程中,LED灯闪烁,表示在等待计时
//                    4.LED显示器上第一位显示分,第二三位显示秒,第四位显示毫秒中间用小数点隔开
//                    5.计时最大长度为10分钟,9分59秒后,自动清零

#include<reg52.h>

#define uchar unsigned char

#define dula P0        //段选信号的锁存器控制
#define wela P2        //位选信号的锁存器控制,这里只用到P2.4~P2.7引脚

sbit k4 = P3^6;        //红色按键k4
sbit k5 = P3^7;        //红色按键k5
bit stop = 1;
unsigned char j,k,num0,num1,num2,num3,ss,sec,min,count=0;
unsigned char time_count;
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};        //LED显示器各位码表
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};        //LED显示器各位的码表(带上小点)
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

void delay(unsigned char i)
{
    for(j=i;j>0;j--)
        for(k=125;k>0;k--);
}

void display1(uchar wei,uchar shu)    //在任意一位显示任意数字
{
    wei=wei-1;
    wela|=0xf0;        //给P2.4~P2.7引脚置1
    if(wei==1)        //小数点位次
        P0=table1[shu];
    else if(wei==3)
        P0=table1[shu];
    else
    P0=table[shu];
    wela=wela&weitable[wei];//给P2引脚需要显示的那一位置1,其他清0
    delay(5);
}
void display(unsigned char a,unsigned char b,unsigned char c,unsigned char d)//1次显示四个数字,且每位显示数字可自定
{
    display1(4,a);
    display1(3,b);
    display1(2,c);
    display1(1,d);
}

void start_timer()
{
    ET0=1;    //开定时器T0中断
    EA=1;        //开总中断
    TR0=1;    //打开定时器
}

void stop_timer()
{
    ET0=0;        //关定时器T0中断
    EA=0;            //关总中断
    TR0=0;        //关闭定时器
}

void main()
{
    TMOD=0x01;        //模式设置,00000001,可见采用的是定时器T0,工作与模式1(M1=0,M0=1)
    TH0=(65536-46080)/256;        //由于晶振为11.0592MHZ,故所记次数应该为46080次,计时器每隔50000us发起一次中断。
    TL0=(65536-46080)%256;        //46080为50000x11.0592所得
    while(1)
    {
        if(k4==0)        //判断是否有按下按键的信号
        {
            delay(10);    //延时10ms消抖
            if(k4==0)    //再次判断是否有按下按键的信号
            {
                while(k4==0);//直到判断按键松开
                {
                    if(stop)
                        start_timer();//打开定时器
                    else
                            start_timer();//关闭定时器
                    stop=~stop;
                    P1=0xff;
                }
            }
        }
    else if(k5==0)//判断是否有按下按键的信号
    {
        delay(10);
        if(k5==0)
        {
            while(k5==0);
            {
                stop_timer();
                stop=1;
                P1=0xff;
                count=0;
                time_count=0;
                ss=0;
                sec=0;
                min=0;
            }
        }
    }

    if(stop)
    {
        count++;
        if(count==100)
        {
            P1=~P1;
            count=0;
        }
    }

    else if(time_count==2)//计数2次0.05s为0.1s
    {
            count=0;
            time_count=0;
            ss++;
            if(ss==10)
            {
                ss=0;
                sec++;
            }
            if(sec==60)
            {
                sec=0;
                min++;
            }
            if(min==10)
            {
                min=0;
                stop_timer();
            }
        delay(20);
        }
        
    num0=ss%10;//取出当前描述的个位
    num1=sec%10;//取出当前描述的个位
    num2=sec/10;//取出当前描述的十位
    num3=min%10;//取出当前描述的个位
    display(num3,num2,num1,num0);//显示
    }
}

void timer0()interrupt 1
{
    TH0=(65536-46080)/256;
    TL0=(65536-46080)%256;
    time_count++;
}

[此贴子已经被作者于2018-10-30 12:25编辑过]

搜索更多相关主题的帖子: 按键 显示 char unsigned void 
2018-10-29 15:52
尘曦
Rank: 2
来 自:四川省泸州市
等 级:论坛游民
帖 子:14
专家分:20
注 册:2018-10-28
得分:0 
无注解,晚一点注解
2018-10-29 15:54
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
得分:0 
等有注释了,再看

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-10-29 17:20
尘曦
Rank: 2
来 自:四川省泸州市
等 级:论坛游民
帖 子:14
专家分:20
注 册:2018-10-28
得分:0 
回复 3楼 Tomorrw_I
好了
2018-10-30 12:25
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
得分:0 
51C,单片机程序

126邮箱联系方式:no1xijin@126. com
2018-10-30 14:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490792-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.686363 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved