×
单片机 > 单片机程序设计 > 详情

51单片机的定时器程序设计

发布时间:2020-12-31 发布时间:
|

这个基于51单片机的定时器设计,使用共阴数码管显示,如果要换成共阳数码管只需要将程序内数组改为共阳数码管的数组,38译码器LSA,LSB,LSC分别接单片机的P2^2,
P2^3,P2^4,蜂鸣器使用的是无源蜂鸣器,接单片机P1^5,三个低电平触发按键分别接的P3^1,P3^2,P3^3.

 
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit key0=P3^1;  //定义P31口是k0
sbit key1=P3^0;  //定义P33口是k1
sbit key2=P3^2;  //定义P33口是k2
sbit beep=P1^5;
程序运行后,先进入设置模式,key0和key1分别设置秒和分,key2确定后进入定时模式,数码管显示时间,定时结束后蜂鸣器发声提示。

单片机源程序如下:

//基于stc89c52的定时器

//时间:2020年1月5日,作者:吃猫的鱼


#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器


typedef unsigned int u16;          //对数据类型进行声明定义

typedef unsigned char u8;


sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit key0=P3^1;         //定义P31口是k0

sbit key1=P3^0;         //定义P33口是k1

sbit key2=P3^2;         //定义P33口是k2

sbit beep=P1^5;        


u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                                        0x7f,0x6f,0x5e,0x3f,0x3f,0x6f};//显示0~F的值


u16 miao=0,fen=0;//时间参数

bit flag=1;


/*******************************************************************************

* 函 数 名         : delay

* 函数功能                   : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

        while(i--);        

}

/*******************************************************************************

* 函 数 名         : Timer1Init

* 函数功能                   : 定时器1初始化

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Timer1Init()

{

        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。


        TH1=0XFC;        //给定时器赋初值,定时1ms

        TL1=0X18;        

        ET1=1;//打开定时器1中断允许

        EA=1;//打开总中断

        TR1=1;//打开定时器                        

}

void good_init()

{

        u8 i,j=1000;

while(j)

{

                for(i=10;i<14;i++)

        {

                switch(i)         //位选,选择点亮的数码管,

                {

                        case(10):

                                LSA=0;LSB=0;LSC=0; break;//显示第0位

                        case(11):

                                LSA=1;LSB=0;LSC=0; break;//显示第1位

                        case(12):

                                LSA=0;LSB=1;LSC=0; break;//显示第2位

                        case(13):

                                LSA=1;LSB=1;LSC=0; break;//显示第2位

                

                }

                P0=smgduan[i];//发送段码

                                delay(300); //间隔一段时间扫描        

                P0=0x00;//消隐

        }

     j--;        

}

}

void DigDisplay()

{


                        

                LSA=0;LSB=0;LSC=0; 

                P0=smgduan[miao%10];//发送段码

                delay(500);

                LSA=1;LSB=0;LSC=0;

                P0=smgduan[miao/10];//发送段码

                delay(500);

                LSA=0;LSB=1;LSC=0; 

                P0=smgduan[fen%10];//发送段码

                delay(500);

                LSA=1;LSB=1;LSC=0;                 

                P0=smgduan[fen/10];//发送段码

                delay(500);

                //                delay(100); //间隔一段时间扫描        

                //                P0=0x00;//消隐

        

}


/*******************************************************************************

* 函 数 名       : main

* 函数功能                 : 主函数

* 输    入       : 无

* 输    出             : 无

*******************************************************************************/

void main()

{        

        

        good_init();

        while(flag)

        {        

               if(key0==0)//秒针

         {

          delay(1000);

                 if(key0==0)

                         {

                                 miao++;

                                

                         }

                 while(!key0);

         }

                  if(key1==0)//分针

         {

          delay(1000);

                 if(key1==0)        

                         {

                                 fen++;

                                

                         }

                 while(!key1);

         }

                           if(key2==0)//确定

         {

          delay(1000);

                 if(key2==0)        

                         {

                           flag=0;

                                

                         }

                 while(!key2);

         }

         miao=miao%60;

         fen=fen%60;

         DigDisplay();

        }

        Timer1Init();//定时器初始化

        while(1)//工作模式

        {

         if(miao<=1)

         {

          fen--;

          miao=60;

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法