找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2471|回复: 1
打印 上一主题 下一主题
收起左侧

请问各位大神如果让数码管0-60增加程序

[复制链接]
跳转到指定楼层
楼主
    附件里的是我的开发板原理图,P0口接到J12位置,由595锁存器供给段显,P1直接接到到J16端口,单片机用的是STC90C516RC+。我可以正常点亮数码管,就是不会怎么让数码管从0-60自动增加,到60后再重复0-60.请各位大神写下这个程序,最好注释下发给我,可以发我邮箱353898172@qq.com.本人正在学习单片机,学到这来就卡住了,死活不知道怎么来控制这个数码管。请给位大神帮帮忙。

数码管.png (134.96 KB, 下载次数: 61)

数码管

数码管
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2017-9-21 07:09 | 只看该作者
给你一个数码管时钟程序,有详细注释,只要把按键I/O口对照实际电路改一下就可以直接使用。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P3^5;                        //小时+
sbit K2 = P3^6;                        //分钟+
sbit K3 = P3^7;                        //秒清0
sbit A0=P1^0;                        //位A
sbit A1=P1^1;
sbit A2=P1^2;
sbit A3=P1^3;
sbit A4=P1^4;
sbit A5=P1^5;
sbit A6=P1^6;
sbit A7=P1^7;

uchar code table[]={                //共阴数码管0~F数组
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x40};
uint Cnt100us;                                //定义100微秒变量
uchar hour=12,min=0,sec=0;//定义时、分、秒变量

/**************************************
        定时器0初始化程序 100微秒@12.000MHz
**************************************/

void Timer0Init()                //100微秒@12.000MHz
{
        TMOD = 0x02;                //设置自动重载模式
        TL0 = 0x9C;                        //设置定时初值
        TH0 = 0x9C;                        //设置定时重载值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
}
/************************************
        计时子程序
************************************/
void Time()       
{
        if(TF0==1)                                        //如果查询定时器溢出标志TF0为1
        {                                                        //定时器溢出周期100us
                TF0=0;                                        //定时器溢出标志TF0清0
                Cnt100us++;                                //时间变量Cnt100us自+1
                if(Cnt100us>=10000)                //在此增减可以按万分之一秒调整精度
                {
                        Cnt100us=0;                                //变量Cnt100us清0
                        sec++;                                        //秒自+1
                        if(sec>=60)                                //如果秒>=60
                        {
                                sec=0;                                //秒清0
                                min++;                                //分自+1
                                if(min>=60)                        //分>=60
                                {
                                        min=0;                        //分清0
                                        hour++;                  //小时自+1
                                        if(hour>=24)        //小时>=24
                                                hour=0;                //小时清0
                                }
                        }
                }
        }
}
/*************************
          按键扫描程序
*************************/
void key_scan()
{
        static bit key1_sign,key2_sign,key3_sign;        //按键自锁标志变量
        static uchar count1,count2,count3=0;                //消抖计数变量                       

        if(K1==1)                                        //检测按键1没有按下
        {
                key1_sign=0;                        //按键1自锁标志清0
                count1=0;                                //消抖计数1清0
        }
        else                                                        //按键1按下
        {
                count1++;                                //消抖计数1自+1
                if(count1>=200)                        //200次检测按键如果为0
                {                       
                        count1=200;                        //防止溢出
                        if(key1_sign==0)        //按键1自锁标志为0
                        {
                                key1_sign=1;        //按键1自锁标志置1
                                hour++;                        //小时自+1
                                if(hour>=24)        //小时>=24
                                        hour=0;                //小时清0
                        }
                }
        }

        if(K2==1)                                        //检测按键2没有按下
        {
                key2_sign=0;                        //按键2自锁标志清0
                count2=0;                                //消抖计数2清0
        }
        else                                                        //按键2按下
        {
                count2++;                                //消抖计数2自+1
                if(count2>=200)                        //200次检测按键如果为0
                {                       
                        count2=200;                        //防止溢出
                        if(key2_sign==0)        //按键2自锁标志为0
                        {
                                key2_sign=1;        //按键2自锁标志置1
                                min++;                        //分自+1
                                if(min>=60)                //分>=60
                                        min=0;                //分清0
                        }
                }
        }
        if(K3==1)                                        //检测按键3没有按下
        {
                key3_sign=0;                        //按键3自锁标志清0
                count3=0;                                //消抖计数2清0
        }
        else                                                        //按键3按下
        {
                count3++;                                //消抖计数3自+1
                if(count3>=200)                        //200次检测按键如果为0
                {                       
                        count3=200;                        //防止溢出
                        if(key3_sign==0)        //按键3自锁标志为0
                        {
                                key3_sign=1;        //按键3自锁标志置1
                                Cnt100us= 0;        //100微秒变量清0
                                sec = 0;                        //秒清0
                        }
                }
        }
}
/********************************
        显示程序  
********************************/
void display()
{
        static uchar xx=0;        //时分显示变量
        static uchar yy=0;        //计数延时变量
        yy++;       
        if(yy>=60)        //1~255可调,数码管闪烁可减小,有鬼影可加大
        {
                yy=0;
                switch(xx)
                {
                        case 0:
                        P0=0x00;                        //消隐
                        P1=0xfe;                        //显示时十位位码
                        P0=table[hour/10];                //显示时十位段码
                        xx=1;
                        break;       
                       
                        case 1:
                        P0=0x00;
                        P1=0xfd;                        //显示时个位位码
                        P0=table[hour%10];                //显示时个位段码
                        xx=2;
                        break;       
                       
                        case 2:
                        P0=0x00;
                        P1=0xfb;                        //显示时-
                        P0=table[16];                //显示时-
                        xx=3;
                        break;       
                       
                        case 3:
                        P0=0x00;
                        P1=0xf7;                        //显示时十位位码
                        P0=table[min/10];                //显示分十位段码
                        xx=4;
                        break;       
                       
                        case 4:
                        P0=0x00;
                        P1=0xef;                        //显示分个位位码
                        P0=table[min%10];                //显示分个位段码
                        xx=5;
                        break;       
                       
                        case 5:
                        P0=0x00;
                        P1=0xdf;                        //显示分-
                        P0=table[16];                //显示分-
                        xx=6;
                        break;       
                       
                        case 6:
                        P0=0x00;
                        P1=0xbf;                        //显示秒十位位码
                        P0=table[sec/10];                //显示秒十位段码
                        xx=7;
                        break;       
                       
                        case 7:
                        P0=0x00;
                        P1=0x7f;                        //显示秒个位位码
                        P0=table[sec%10];                //显示秒个位段码
                        xx=0;
                        break;       
                }
        }
}

/********************************
                主程序
********************************/
void main(void)
{
        Timer0Init();        //初始化定时器
        while(1)
        {
                key_scan();//按键扫描
                Time();                //计时
                display();        //显示
        }
}




回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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