找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2937|回复: 8
收起左侧

有大神帮忙给写一个倒计时的程序吗?

[复制链接]
ID:164431 发表于 2017-2-14 13:18 来自手机 | 显示全部楼层 |阅读模式
利用51单片机实现5分钟倒计时,即5-00,4-59,4-58,……
要求:
1、用定时器实现2ms计数刷新数码管显示;
2、用定时器中断实现1s计时用于倒计时。
回复

使用道具 举报

ID:164592 发表于 2017-2-14 15:06 | 显示全部楼层
/*******************************************************************************
* 实 验 名                 : 动态显示数码管实验
* 使用的IO             : 数码管使用P0,P2.2,P2.3,P2.4
* 实验效果       : 数码管显示76543210。
* 注    意                 :
*******************************************************************************/
#include <reg51.h>

#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char DisplayData[8];
unsigned int Time=0;
unsigned char m=0;
unsigned char n=0;
unsigned char x=0;
unsigned char y=0;
unsigned char a=0;
unsigned char b=0;
void DigDisplay(); //动态显示函数
void TimerConfiguration();
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        TimerConfiguration();
        while(1)
        {       
                DigDisplay();
        }                               
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能                   : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<8;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):LSA=0;LSB=0;LSC=0;
                                        if(Time>=20)
                                                {m++;Time=0;}
                                        GPIO_DIG=DIG_CODE[m];
//                                        if(m==10)
//                                                m=0;
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;
                        case(1):LSA=1;LSB=0;LSC=0;
                                        if(m==10)
                                                {n++;m=0;}
                                        GPIO_DIG=DIG_CODE[n];
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;//显示第1位
                        case(2):LSA=0;LSB=1;LSC=0;
                                        GPIO_DIG=0x40;
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;//显示第2位
                        case(3):LSA=1;LSB=1;LSC=0;
                                        if(n==6)
                                        {x++; n=0;}
                                        GPIO_DIG=DIG_CODE[x];
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;//显示第3位
                        case(4):LSA=0;LSB=0;LSC=1;
                                        if(x==10)
                                        {y++;x=0;}
                                        GPIO_DIG=DIG_CODE[y];
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;//显示第4位
                        case(5):LSA=1;LSB=0;LSC=1;
                                        GPIO_DIG=0x40;
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;//显示第5位
                        case(6):LSA=0;LSB=1;LSC=1;
                                        if(y==6)
                                                {a++;y=0;}
                                        GPIO_DIG=DIG_CODE[a];
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        break;//显示第6位
                               
                        case(7):LSA=1;LSB=1;LSC=1;
                                        if(a==6)
                                        {b++;a=0;}
                                        GPIO_DIG=DIG_CODE[b];
//                                        j=10;       
//                                        while(j--);       
//                                        GPIO_DIG=0x00;
                                        if(b==10)
                                                b=0;
                                        break;//显示第7位       
                }
                j=10;       
                while(j--);       
                GPIO_DIG=0x00;
        }
}
void TimerConfiguration()
{
    TMOD = 0x01; //选择工作方式1
    TH0 = 0x3C;         //设置初始值,定时50MS
    TL0 = 0xB0;
    EA = 1;                         //打开总中断
    ET0 = 1;                 //打开定时器0中断
    TR0 = 1;                 //启动定时器0
}
void Timer0() interrupt 1
{
                  TH0 = 0x3C;         //设置初始值
            TL0 = 0xB0;
                Time++;
}
回复

使用道具 举报

ID:164592 发表于 2017-2-14 15:07 | 显示全部楼层
当时写的一个程序,不是五分钟倒计时,但原理都一样 程序自己对照着改一下就好了
回复

使用道具 举报

ID:164431 发表于 2017-2-15 13:20 来自手机 | 显示全部楼层
ning 发表于 2017-2-14 13:21
课设吗?

不是。。。。
回复

使用道具 举报

ID:164431 发表于 2017-2-15 13:21 来自手机 | 显示全部楼层
Villan_Ran、 发表于 2017-2-14 15:07
当时写的一个程序,不是五分钟倒计时,但原理都一样 程序自己对照着改一下就好了

好的,谢谢啦。
回复

使用道具 举报

ID:111634 发表于 2017-2-15 21:53 | 显示全部楼层
本帖最后由 zl2168 于 2017-2-15 21:54 编辑

能预置初值的倒计时秒表
Proteus仿真一下,确认有效。
实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 7)
回复

使用道具 举报

ID:164851 发表于 2017-2-15 22:34 | 显示全部楼层
我也正需要呢
回复

使用道具 举报

ID:164828 发表于 2017-2-16 13:41 | 显示全部楼层
真的很厉害
回复

使用道具 举报

ID:164949 发表于 2017-2-16 16:09 | 显示全部楼层
是 在哪里啊  ,,,,,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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