找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
ID:164431 发表于 2017-2-14 13:18 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
利用51单片机实现5分钟倒计时,即5-00,4-59,4-58,……
要求:
1、用定时器实现2ms计数刷新数码管显示;
2、用定时器中断实现1s计时用于倒计时。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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
课设吗?

不是。。。。
回复

使用道具 举报

5#
ID:164431 发表于 2017-2-15 13:21 来自手机 | 只看该作者
Villan_Ran、 发表于 2017-2-14 15:07
当时写的一个程序,不是五分钟倒计时,但原理都一样 程序自己对照着改一下就好了

好的,谢谢啦。
回复

使用道具 举报

6#
ID:111634 发表于 2017-2-15 21:53 | 只看该作者
本帖最后由 zl2168 于 2017-2-15 21:54 编辑

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

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解
回复

使用道具 举报

7#
ID:164851 发表于 2017-2-15 22:34 | 只看该作者
我也正需要呢
回复

使用道具 举报

8#
ID:164828 发表于 2017-2-16 13:41 | 只看该作者
真的很厉害
回复

使用道具 举报

9#
ID:164949 发表于 2017-2-16 16:09 | 只看该作者
是 在哪里啊  ,,,,,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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