STC89C51单片机

一.软件

1.Keil 5.

2.烧录软件:STC-ISP或者普中-ISP.

二.功能介绍

1.流水灯。

2.数码管全良和全灭。

3.HELLO的显示。

4.数码管显示时间(初值是23:59:40)。

5.按键控制,可以更改时间。

三.代码

每个功能都在单独的函数之中。

当中也有很多的不足,比如按键消抖不到位。

#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

uchar Hel[]={0x76,0x79,0x38,0x38,0x3f};         //共阴HELLO十六进制;
uchar wei[]={0x10,0x08,0x04,0x02,0x01};            //位选后五位数码管显示;
uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,
                         0x6d,0x7d,0x07,0x7f,0x6f};     //0-9数字;

sbit zanting = P2^0;   //暂停按键;
sbit kaiqi = P2^1;     //开启按键;
sbit fuwei = P2^2;     //复位按键;
sbit shi_jia = P2^3;   //时+1按键;
sbit shi_jian = P2^4;  //时-1按键;
sbit fen_jia = P2^5;   //分+1按键;
sbit fen_jian = P2^6;  //分减1按键;
                         
uchar shi=23,    fen=59,    miao=40;      //进位标志位;
uchar shi_s,    shi_g,    fen_s,
            fen_g,    miao_s,    miao_g; //时分秒的个位(xxx_g),十位(xxx_s);
                         
void Delay(uint c)                      //延时函数;
{
    uchar a, b;
    for(;c>0;c--)
            {
                for (b=8;b>0;b--)
                {
                    for (a=20;a>0;a--);
                }   
            }       
}      

void liushuideng()           //流水灯模块;
{
    uint i,j;
    for(j=0;j<3;j++)
    {
        uint LED=0x01;
        for(i=0;i<8;i++)
        {
            P0=LED;
            LED=LED<<1;    //左移;
          Delay(30);
        }
    }
}

void SMG_quanliang()   //共阴数码管 全亮 或 全灭;
{
    uint i;
    for(i=0;i<3;i++)      //进行3次;
    { 
     P1=0x00;              //位选;
     P0=0xff;             //段选;
     Delay(100);
     P0=0x00;
     Delay(100);
    }
}

void hello()            //动态数码管显示HELLO;
{
    uint i,j=100;
    while(j--)         //显示一会儿;
    {
        for(i=0;i<5;i++)
     {
         P1=~wei[i];
         P0=Hel[i];
         Delay(1);
     }
  }
}

void T0_csh()         //初始化定时器0;
{
    TMOD=0X01;        //工作方式1;
    TH0=-50000/256;      //50ms;
    TL0=-50000%256;
    ET0=1;             //打开T0中断;
    TR0=1;             //启用T0中断;
    EA=1;              //打开总中断;
}

void ShiFenMiao()
{
    P1=~0x24;          //中间的“-”,XX-XX-XX;
    P0=0x40;
    Delay(1);
    
    P1=~0x01;          //XX-XX-X_;
    P0=num[miao_g];
    Delay(1);
    
    P1=~0x02;          //XX-XX-_X;
    P0=num[miao_s];
    Delay(1);
    
    P1=~0x08;          //XX-X_-XX;
    P0=num[fen_g];
    Delay(1);
    
    P1=~0x10;          //XX-_X-XX;
    P0=num[fen_s];
    Delay(1);
    
    P1=~0x40;          //X_-XX-XX;
    P0=num[shi_g];
    Delay(1);
    
    P1=~0x80;          //_X-XX-XX;
    P0=num[shi_s];
    Delay(1);
}

void anjian()
{
    if(fen_jia==0)
    {
        Delay(50);     //消抖;
        if(fen_jia==0)
        {
            fen++;
            if(fen==60)
            {  fen=00;  }
            while(!fen_jia);
        }
    }
    
    if(fen_jian==0)
    {
        Delay(50);    //消抖;
        if(fen_jian==0)
        {
            fen--;
            while(!fen_jian);
        }
    }
    
    if(shi_jia==0)
    {
        Delay(50);     //消抖;
        if(shi_jia==0)
        {
            shi++;
            if(shi==24)
            { shi=00; }
            while(!shi_jia);
        }
    }
    
    if(shi_jian==0)
    {
        Delay(50);        //消抖;
        if(shi_jian==0)
        {
            shi--;
            while(!shi_jian);
        }
    }
    
    if(fuwei==0)
    {
        Delay(50);         //消抖;
        if(fuwei==0)
        {
            miao=0;         //复位,全变为0;
            fen=0;
            shi=0;
            while(!fuwei);
        }
    }
    
    if(zanting==0)
    {
        Delay(5);         //消抖;
        if(zanting==0)
        {
            EA=0;                                                                        //关闭总中断;
            while(!zanting);
        }
    }
    
    if(kaiqi==0)
    {
        Delay(5);            //消抖;
        if(kaiqi==0)
        {
            EA=1;                                                                        //打开总中断;
            while(!kaiqi);
        }
    }
    
}

void T0_int() interrupt 1
{
    uchar i;
    i++;
    if(i==20)           //50ms*20 = 1s;
     {
        i=0;
        miao++;                                                                        
        if(miao==60)      //60s = 1min;
        {
            miao=0;
            fen++;
            if(fen==60)                                                            //60min = 1h;
            {
                fen=0;
                shi++;
                if(shi==24)            //24h转变成00h;
                {
                    shi=0;
                    fen=0;
                    miao=0;
                }
            }
        }
        shi_s=shi/10;              //“/”除法得到高位;
        shi_g=shi%10;              //“%”求余得到低位;
        
        fen_s=fen/10;
        fen_g=fen%10;
        
        miao_s=miao/10;
        miao_g=miao%10;
     }
}

void main()                     //主函数;
{    
        liushuideng();
        SMG_quanliang();
        hello();
        T0_csh();
    while(1)
    {
        anjian();
        ShiFenMiao();
    }
}

四.详细代码及显示

链接:https://pan.baidu.com/s/1pt7TwPVW6FnfDiq954EJSg?pwd=0123 
提取码:0123

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值