搜索
bottom↓
回复: 10

求个c51数显定时程序

[复制链接]

出0入0汤圆

发表于 2012-3-5 21:29:34 | 显示全部楼层 |阅读模式
求个c51数显定时程序
要求很简单;
四位显示,四个按键 一个加定时 一个减 一个开始计时 一个停止
设置好定时 按开始就计时 到定时自动停止
四位显示要求 前两位显定时时间后两位计时
开始时启动一个继电器 计时到时启动一个继电器并释放前一继电器
谢谢了 EMAIL:funluo@126.com
电路可根据程序来设计 也可以设计好电路再写程序

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-3-6 09:18:51 | 显示全部楼层
毕业设计???

出0入169汤圆

发表于 2012-3-6 10:13:57 | 显示全部楼层
楼主还是去百度裸跪吧。

出0入0汤圆

 楼主| 发表于 2012-3-6 19:26:08 | 显示全部楼层
不是毕业设计,是要做个定时器,小菜编程不行

出0入0汤圆

发表于 2012-3-6 22:13:38 | 显示全部楼层
。。。。。。。。。。。

出0入0汤圆

发表于 2012-3-7 11:05:43 | 显示全部楼层
。。。。。

出0入0汤圆

发表于 2012-3-7 17:58:08 | 显示全部楼层
还好没有跪求

出0入0汤圆

 楼主| 发表于 2012-4-7 21:44:32 | 显示全部楼层
呵呵 求归求也不用跪,我还没这么下贱

出0入0汤圆

发表于 2012-4-7 22:08:50 | 显示全部楼层
不会是用来、、、、、、、?

出0入134汤圆

发表于 2012-4-7 22:34:35 | 显示全部楼层
额  都一个月了

以前写过一个差不多的


/******************************
程序名称:MyDigit计时程序
程序作者:elecfun
编写时期:2010年8月23日
说明:此程序实现99时59分内的计时与显示,使用4位共阳数码管显示
      当时与分均为0时,只显示秒;当时为0分不为0时,显示分、秒;当时不为0时,显示时、分
      3个按键来控制开始、停止、清零(开始与停止按键可以合并而使用2个按键),清零只有在停止状态下才可用
      在停止状态下按开始,继续计时
******************************/

#include <AT89X51.h>

#define LedBitData  P2
#define LedSegData  P0

sbit
KEY_START = P1^0;
sbit
KEY_STOP  = P1^1;
sbit
KEY_CLEAR = P1^2;

unsigned char
MS50,SEC,MIN,HOUR;
unsigned char
SEG[4];

//定义共阳数码管的显示数字
code unsigned char LedDisplayCode[]=      
{

    0xC0
,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,//0、1、2、3、4、5、6、7
    0x80,0x90                               //8、9
};

/**********延时子程序********/

void
Delay(unsigned int t)
{

    unsigned char
t1,t2;
    for
(t1=0;t1<t;t1++)
        for
(t2=0;t2<120;t2++)
            ;
}

/**********数码管扫描程序**********/

void
Scan()
{

    unsigned char
a;

    if
(HOUR == 0)
    {

        if
(MIN == 0)   //小时、分同时为0时,只显示秒
        {
            SEG[0] = 0xFF;SEG[1] = 0xFF;
            SEG[2] = LedDisplayCode[SEC/10];SEG[3] = LedDisplayCode[SEC%10];
        }
else          //小时为0分不为0时,显示分、秒
        {
            SEG[0] = LedDisplayCode[MIN/10]; SEG[1] = LedDisplayCode[MIN%10];
            SEG[2] = LedDisplayCode[SEC/10]; SEG[3] = LedDisplayCode[SEC%10];
        }
        
    }

    else
{              //小时不为0时,显示小时、分
        SEG[0] = LedDisplayCode[HOUR/10]; SEG[1] = LedDisplayCode[HOUR%10];
        SEG[2] = LedDisplayCode[MIN/10]; SEG[3] = LedDisplayCode[MIN%10];
    }


    if
(!TR0)               //停止状态下小数点点亮
    {
        SEG[1] &= 0x7F;
    }
else
    {

        if
(MS50 < 10)      //小数点闪烁
        {
            SEG[1] &= 0x7F;
        }
    }

   

    for
(a=0; a<4; a++)      //刷新
    {     
        LedBitData = ~(1<<a);
        LedSegData = SEG[a];
        Delay(1);
        LedSegData = 0xFF;
    }
}

/* 按键检测及处理 */

void
Key(void)
{

    if
(KEY_START == 0)     //开始
    {
        Delay(1);
        if
(KEY_START == 0)
        {

            while
(KEY_START == 0) Scan();
            TR0 = 1;
        }
    }

    if
(KEY_STOP == 0)      //停止
    {
        Delay(1);
        if
(KEY_STOP == 0)
        {

            while
(KEY_STOP == 0) Scan();
            TR0  = 0;
        }
    }

    if
(KEY_CLEAR == 0)     //清零
    {
        Delay(1);
        if
(KEY_CLEAR == 0)
        {

            if
(!TR0)       //停止时才可以清零
            {
                MS50 = 0;
                SEC  = 0;
                MIN  = 0;
                HOUR = 0;
            }
        }
    }
}

/**********系统初始化**********/

void
SysInt()
{

    MS50 = 0;                    //初始时钟时间0:0:0
    SEC  = 0;
    MIN  = 0;
    HOUR = 0;

    EA   = 1;                     //开总中断
    ET0  = 1;                    //开定时器0中断
    TMOD = 0x01;               //定时器0为16位定时器模式
    TH0  = 0x3c;               //初始定时常数15536,即50ms
    TL0  = 0xb0;
}

/**********主程序**********/

void
main()
{

    SysInt();                                   //系统初始化
    while(1)
    {

        Scan();                                   //显示子程序
        Key();                                   //按键检测处理子程序
    }
}

/**********定时器0中断**********/

void
Time0(void) interrupt 1
{

    TH0=0x3c;TL0=0xaf;                        //重新赋初值
    MS50++;                                        //50ms寄存器加1
    if(MS50==20)                              
    {

        MS50=0;                        
        SEC++;                                   
        if
(SEC==60)                              //到1分钟则清零,分加1
        {
            SEC=0;
            MIN++;
            if
(MIN==60)                         //到60分则清零,小时加1
            {
                MIN=0;
                HOUR++;
                if
(HOUR==99) HOUR=0;     //小时到99则清零
            }
        }
    }
}


出0入0汤圆

发表于 2012-4-7 22:41:22 | 显示全部楼层
elecfun 好人哦
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 04:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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