找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4600|回复: 7
收起左侧

c51 24秒倒计时 求助大神

[复制链接]
ID:346831 发表于 2018-6-7 12:28 | 显示全部楼层 |阅读模式
倒计时部分  有问题  求助大神指点
4.jpg
3.png
1.png
2.jpg
回复

使用道具 举报

ID:213173 发表于 2018-6-7 15:51 | 显示全部楼层
#include <AT89X52.H>
#define uchar unsigned char
#define uint  unsigned int
sbit key1=P2^0;
sbit key2=P2^1;       
uchar code table[]={                //共阳数码管段码"0~f-."
                0xc0,0xf9,0xa4,0xb0,
                0x99,0x92,0x82,0xf8,
                0x80,0x90,0x88,0x83,
                0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
uchar Cnt50ms = 0;
uchar Cnt1s = 24;

void display()//显示程序
{
        static uchar count=0;        //计数变量
        static uchar count1=0;
        count1++;                                        //动态显示计数延时
        if(count1>=50)
        {
                count1=0;
                P1=0xff;                                        //消隐
                switch(count)
                {
                        case 0:
                           P3=0x01;                        //秒十位位码
                           P1=table[Cnt1s/10];//秒十位段码
                           count=1;
                        break;
                        case 1:                               
                           P3=0x02;                        //秒个位位码
                           P1=table[Cnt1s%10];//秒个位段码
                           count=0;
                        break;
                }
        }
}

void Timer0Init()                //50毫秒@12.000MHz
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0xB0;                //设置定时初值
        TH0 = 0x3C;                //设置定时初值
        TF0 = 0;                //清除TF0标志
//        TR0 = 1;                //定时器0开始计时
        EA=1;                                                        //开总中断
        ET0=1;                                                //开定时器0中断
}
void keyscan()                                //按键扫描
{
        static uchar count1=0,count2=0;        //计数变量                       
        static bit key_sign1=0,key_sign2=0;        //按键状态标志

        if(key1==0)                                //检测输入如果为0
        {
                count1++;                                        //计数延时消抖
                if((count1>=250)&&(key_sign1==0))
                {                       
                        key_sign1=1;                //按键状态标志置1,防止重复响应
                        TR0 = 1;                                //定时器0开始计时
                }
        }
        else                                                         //按键抬起
        {
                count1=0;                                //计数变量清0
                key_sign1=0;                        //按键状态标志清0
        }
        if(key2==0)                                //检测输入如果为0
        {
                count2++;                                        //计数延时消抖
                if((count2>=250)&&(key_sign2==0))
                {                       
                        key_sign2=1;                //按键状态标志置1,防止重复响应
                        Cnt1s=24;
                        TR0 = 0;                                //定时器0停止计时
                }
        }
        else                                                         //按键抬起
        {
                count2=0;                                //计数变量清0
                key_sign2=0;                        //按键状态标志清0
        }
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定时器初始化
        while(1)
        {
                keyscan();                                //按键扫描
                display();                                //显示程序
        }
}
/**************中断服务程序*****************/
void timer0() interrupt        1
{
        TL0 = 0xB0;                //设置定时初值
        TH0 = 0x3C;                //设置定时初值
        Cnt50ms++;
        if(Cnt50ms>=20)                                //1s
        {
                Cnt50ms=0;
                Cnt1s--;
                if(Cnt1s==0)
                {
                        Cnt1s=0;
                        TR0 = 0;                        //定时器0停止计时
                }
        }
}
回复

使用道具 举报

ID:346831 发表于 2018-6-7 16:02 | 显示全部楼层
这个论坛没人的吗
回复

使用道具 举报

ID:295874 发表于 2018-6-7 18:09 | 显示全部楼层
啥问题也没有说明白。再说这是你的全部程序吗?如果是,你的程序计时是不会对的,因为你的定时器在初始化的时候就已经开始计数了,会产生计时不准确的。
回复

使用道具 举报

ID:111634 发表于 2018-6-7 20:47 | 显示全部楼层
本帖最后由 zl2168 于 2018-6-7 20:49 编辑

介绍你一个参考案例
实例96  能预置初值的倒计时秒表
实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 31)
回复

使用道具 举报

ID:346831 发表于 2018-6-8 16:45 | 显示全部楼层
liyongan_1985 发表于 2018-6-7 18:09
啥问题也没有说明白。再说这是你的全部程序吗?如果是,你的程序计时是不会对的,因为你的定时器在初始化的 ...

额  第一次发帖见谅见谅  谢谢大佬的帮助
回复

使用道具 举报

ID:346831 发表于 2018-6-8 16:48 | 显示全部楼层
wulin 发表于 2018-6-7 15:51
#include
#define uchar unsigned char
#define uint  unsigned int

大神  你这是直接帮我写出了吗 辛苦了  还打好了备注  作为一个初学者  非常感谢
回复

使用道具 举报

ID:346831 发表于 2018-6-8 16:49 | 显示全部楼层
zl2168 发表于 2018-6-7 20:47
介绍你一个参考案例
实例96  能预置初值的倒计时秒表
先Proteus仿真一下,确认有效。

谢谢帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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