1~99秒倒计时数码管显示C程序+Proteus仿真

1~99秒倒计时数码管显示C程序+Proteus仿真文件。
优化了程序,使用51单片机内部定时器,可以实现1-99秒内倒计时。

仿真效果为:
1~99秒倒计时数码管显示C程序+Proteus仿真_第1张图片 



源程序为:
/*
调试环境:Proteus 7.8  AT89S52单片机  8位共阴数码管
功能为:实现数码管1秒~99秒倒计时,    12M晶振
*/

#include
#define uchar unsigned char
sbit LED1=P1^1;                           //连的是LED1
#define MAX_NUM     13                //最大倒计时数1~99可设
#define SEGPORT         P0           //定义数码管连接端口
sbit LE_DUAN         = P2^0;           //定义573锁存使能端口 段锁存
sbit LE_WEI         = P2^1;           //定义573锁存使能端口 位锁存

unsigned char code Seg_Duan[]        = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //共阴数码管显示段码值 0~9
unsigned char code Seg_Wei[]        = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                 //数码管的位码,低电平有效。

static uchar second=MAX_NUM,count;    //99只是一个数,可以任意改,因为这里只学习怎样实现倒计时

uchar shiwei;
uchar gewei;

void delay(unsigned int cnt)
{
        while(--cnt);
}

void main()
{
        TMOD|=0x01;                                                        //定时器设置 16位
        TH0=(65536-50000)/256;                                //定时时间   50ms
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        SEGPORT = 0;
        LE_DUAN = 0;
        LE_WEI  = 0;
        while(1)
        {
                shiwei=second/10;                       //数码管10位
                gewei=second%10;                        //数码管个位

                SEGPORT=0;                                           //清空数据,防止有交替重影
               LE_DUAN=1;                                             //段锁存
               LE_DUAN=0;
                delay(30);

                SEGPORT = Seg_Wei[1];                         //先送位码值
                LE_WEI = 1;                                      //573高电平锁存
                LE_WEI = 0;
                SEGPORT = Seg_Duan[shiwei];            //再送段码值,这里为 2~9
                LE_DUAN = 1;                                     //573高电平锁存
                LE_DUAN = 0;
                delay(300);


                SEGPORT = Seg_Wei[0];                         //先送位码值
                LE_WEI = 1;                                      //573高电平锁存
                LE_WEI = 0;
                SEGPORT = Seg_Duan[gewei];            //再送段码值,这里为 2~9
                LE_DUAN = 1;                                     //573高电平锁存
                LE_DUAN = 0;
                delay(300);
        }
}

void tim(void) interrupt 1    //定时器0中断    
{
        TH0=(65536-50000)/256;                                //定时时间   50ms
        TL0=(65536-50000)%256;
        count++;
    if(count==20)                                    //50毫秒定时,50*20=1000(毫秒)=1秒
    {
            count=0;
            second--;
            if(second==0xff)                                 /*无符号char型数值,0-1为:0xff,这里若为:0的话,则倒计到0时不显示0直接显示最大倒计数。  */
            {
                LED1=~LED1;                                   //这里让LED1反转一下,表现倒计时一周。
            second=MAX_NUM;                               //回到最大倒计数值,再次倒计,当然,可以加入其他的控制,
            }
         
        }
}

你可能感兴趣的:(单片机技术)