基于天翔板,实现1分钟倒计时

本文介绍了一种使用51单片机实现60进制计数的方法,通过定时器中断和数码管显示实现了从1.00到0.59的倒计时功能。
//1.00->0.59(60进制+10进制)---核心思想
#include <reg52.h> 			//51.52单片机头文件
#define uint unsigned int		//定义宏方便引用(可有可无)
uint num0,miaoshi,ge,miaoge;	//博主英语实在不行,只能汉语言代替0
uint num=60;	//博主调试了很长时间,发现num=60放在定时器里,导致每次溢出都会重置num,考虑好!
int num1;

sbit dula=P2^6;				//申明段选寄存器
sbit wela=P2^7;				//申明位选寄存器
sbit led1=P1^0;				//这个灯可有可无
uint code store[]={		//不写,自动计算多少个
0x3f,0x06,0x5b,0x4f,     //0xb0为1. 这里有个点 哈
0x66,0x6d,0x7d,0x07,     //0xbf为0.
0x7f,0x6f,0xbf,0xb0		
};

void delayms(uint xms)  //空语句延时函数
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
void display(uint ge,uint miaoge,uint miaoshi)//当一个工程足够大,你会发现函数特别重要
{								//这个是为了显示数码管的程序
    dula=1;
    P0=store[ge+10];    //故意设置ge+10;实现个位1和0
    dula=0;    
    P0=0xff;		//消影(数码管高速刷新,可能出现混乱的情况,将p0口放1,可以使数码管全灭)
    wela=1;
    P0=0xf7;	//11110111;第四个数码管位选
    wela=0;
    delayms(5);
    
    dula=1;
    P0=store[miaoge];    //
    dula=0;    
    P0=0xff;//消影
    wela=1;
    P0=0xef;	//11101111第5个
    wela=0;
    delayms(5);

    dula=1;
    P0=store[miaoshi];
    dula=0;    
    P0=0xff;
    wela=1;
    P0=0xdf;//11011111第六个
    wela=0;
    delayms(5);//总延迟修改值要小于中断一次的时间,否则混乱
    //一般总时间要小于10ms;
}
void main()
{
    
    TMOD=0X11;                   //工作方式位00010001 方式1
    							//51单片机定时器有4种工作方式
    //闲谈:GATE---测量脉宽(一般将其置0)
    //C/T	选0定时,选1计数
    //方式1是16位定时器
    //pow是c语言库函数,去查msdn
    TH0=(65536-45872)/256;//这里我用50ms,可以换的
    TL0=(65536-45872)%256;//( pow(2,16)-(50000/1.09) )%(pow(2,8))
    //1.09是机器周期(12个时钟周期),这个要看你晶振,天翔板子是11.0592mhz
    TH1=(65536-45872)/256;
    TL1=(65536-45872)%256;

    EA=1;//总开关
    ET0=1;//定时器0控制打开
    ET1=1;//定时器1控制打开
    TR0=1;//定时器0溢出诊断
    TR1=1;//同理
    
    while(1)   //卡死循环
    {
        display(ge,miaoge,miaoshi); //如果不调用函数,都在主函数中,显得特别罗嗦               
    }        
}
void T0_time() interrupt 1 //t0中断序号为1
{
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    num0++;
    if(num0>=20)//(20*50ms==1s)
    {
        num0=0;//每一次溢出加一进来,num0++;然后重置    
        led1=~led1;//取反,实现灯的亮灭
    }                   
}
void T1_time() interrupt 3
{
    TH1=(65536-45872)/256;
    TL1=(65536-45872)%256;
    num1++;
        if(num1>=20)//20*50ms=1s 
        {
            num1=0;      //同理      
            if(num<=0)
            {
                num=60;//千万不要再定时器中断中 定义值(因为每一次溢出都会进入定时器请求中断)
            }
            //相当于六十进制,实现1和0---这是思想的核心
                ge=num/60; //如果60获取1.,如果小于60,则获取0.
            //如果不写这个if else,miaoge位会出现6 因为60/10=6
                if(num>=60)
                {    
                    
                    miaoge=num%10;
                    miaoshi=num%10;
                }
                else
                {
                    
                    miaoge=num/10;
                    miaoshi=num%10;
                }
        num--; //每进入一次 num--,实现数字的倒计时       
        }
}

在这里插入图片描述

以上大致为实现效果,我太菜了,我不会上传视频!

关于脉冲这里

聊一下(其实用的很少)
这个图,与下面的文字联系着看

将gate置1,此时左边初始化tr0为1,右边经过逻辑门,变成0

如果int0为0,则&这里过不去,开关打不开;

如果int0为1,则&为1,开关打开,不断计数,当出现低电平时,右边为0,自动断开

th0 tl0不再计数,可以取出它的值赋给某个变量

最后,感谢某位大佬教会我使用gitee+picgo;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值