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

发布者:RadiantBeauty最新更新时间:2020-01-20 来源: 51hei关键字:51单片机  定时器  程序设计 手机看文章 扫描二维码
随时随地手机看文章

这个基于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;

         }

          DigDisplay();


         

        }

}

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

* 函 数 名         : void Timer1() interrupt 3

* 函数功能                   : 定时器0中断函数

* 输    入         : 无

* 输    出         : 无

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

void Timer1() interrupt 3

{

        static u16 i;

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

        TL1=0X18;

        i++;        

        if(fen==0&&miao==1)//蜂鸣器叫

         {

[1] [2]
关键字:51单片机  定时器  程序设计 引用地址:基于51单片机的定时器程序设计

上一篇:基于热敏电阻的单片机温度测量系统设计
下一篇:软件模拟串行通信——UART协议实现

推荐阅读最新更新时间:2024-11-07 14:07

需更换电池的倒计时数字定时器
只需 MCU、LCD、32kHz 晶振以及一个电阻即可构成一部基本的倒计时定时器,而且只需一颗普通的钮扣电池就能实现连续超过 10 年的工作时间。有两大关键性设计可最小化功耗并尽可能延长电池使用寿命,一是认真选择电池,二是充分利用 MCU 的低功耗模式。   我们之所以选择 CR2032 锂离子钮扣电池,主要是因为它占地较小,可以支持便携式应用,放电曲线较平,可直接驱动LCD,无需补偿,而且漏电极低,能够实现更长的工作时间。典型的 CR2032 额定容量为 "200mA,工作时间可维持数小时。为了实现连续工作 10 年的设计目标,平均系统电流消耗应不得超过 2.28μA,电流消耗的计算方式为电池能量值除以应用的工作寿命,如
[单片机]
51单片机与串行AD转换器TLC0834的接口设计
单片机控制系统通常要用到A/D转换。根据输出的信号格式,比较常用的A/D转换方式可分为并行A/D和串行A/D。并行方式一般在转换后可直接接收,但芯片的引脚比较多;串行方式所用芯片引脚少,封装小,在PCB板上占用的空间也小,但需要软件处理才能得到所需要的数据。 1 TLC0834简介 1.1 TLC0834的主要特点 TLC0834是TI公司生产的8位逐次逼近模数转换器?具有输入可配置的多通道多路器和串形输入输出方式。其多路器可由软件配置为单端或差分输入,也可以配置为伪差分输入。另外,其输入基准电压大小可以调整。在全8位分辨率下,它允许任意小的模拟电压编码间隔。由于TLC0834采用的是串行输入结构,因此封装体积小,可节省5
[单片机]
<font color='red'>51单片机</font>与串行AD转换器TLC0834的接口设计
51单片机与上位机串口通信程序设计
51  单片机  与上位机串口通信程序设计  1. 发送:向总线上发命令  2. 接收:从总线接收命令,并分析是地址还是数据。  3. 定时发送:从内存中取数并向主机发送.  经过调试,以上功能基本实现,目前可以通过上位机对 单片机 进行实时控制。  程序如下:  //这是一个 单片机 C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收     //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的   #include  reg51.h   #include  stdio.h   #include  string.h   #define INBUF_LEN 4 //数据长度  unsigned ch
[单片机]
基于stm32的4X4矩阵键盘定时器扫描消抖法,彻底告别delay函数
经本人刻苦钻研,将51单片机上用的矩阵键盘扫描程序移植到了stm32上,同时也做了很大的改进,最大的改进莫过于消抖这块了。以前的消抖总是采用delay延时约10到20ms的时间,但这样会导致MCU在延时里空跑而造成主程序被搁置,显然,程序的实时性大打折扣,今天便在此让新手们别delay,从此走进一个崭新的扫描消抖世界!(本人也是新手——爱钻研的新手哈!^_^) //stm32矩阵键盘翻转扫描法(PB口的低8位) //将此矩阵键盘扫描程序放在定时器中断服务程序里 //每10ms进入一次中断服务程序 s8 scan_MatrixKey(void) { #define PORT GPIOB- IDR u8 colum
[单片机]
lpc1114通用定时器
LPC1114内部一共有4个定时器,2个32位定时器,2个16位定时器,使用方式都一样,只是要注意使用16位定时器时,寄存器的值不要超出65535。 给它们分别取名称为CT16B0、CT16B1、CT32B0、CT32B1。 特征: 1. 可编程预分频器 我们知道,普通51单片机定时器每递增一下,用时1微秒,固定不变的。而LPC1114的定时器有可编程预分频器,这样就可以控制定时器的时间间隔为任意值了,譬如2微秒,10微秒,0.5微秒等,最小可以为0.02微秒。这个功能在测试测量方面相当有用。 2. 可以工作在定时和计数两种模式 3. 每个定时器都有一个捕获引脚 捕获引脚可以用来感觉它上面的电平变化,实质上和中断引脚的功能类似。主
[单片机]
MSP430学习点滴——看门狗定时器
看门狗有三种工作模式:停止模式,计时器模式,看门狗模式。 控制寄存器WDTCTL由两部分组成,高8位用作口令,低8位实现对WDT的控制操作。要实现对WDT的操作控制,必须先写入高字节看门狗口令。口令为5AH,头文件里一般将WDTPW宏定义为5AH.WDTCTL寄存器各位定义如下: 15~8 7 6 5 4 3 2 1 0 口令 HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS0 IS0 IS1 选择看门狗定时器的定时输出,其中T是WDTCNT的输入时钟源周期。一般宏定义WDTIS0为0x0001,WDTIS1为0x0002. 0 T*2^15(PUC复位后的值) 1 T*2^13 2 T*2^9 3
[单片机]
8051单片机实战分析(以STC89C52RC为例) | 10 - 外部中断的使用
1 中断系统结构 以下这张图是从中断引脚到中断入口所经过的通道: 从图中不难看出INT0与INT1是中断引脚,其中经过了TCON、IE、IP这些寄存器,因此我们在写程序时得把这些寄存器功能配置好,CPU才会按照我们的想法只执行!下面分别对这些寄存器进行介绍(稍微了解一下即可,忘记的时候再查)。 1.1 TCON寄存器 TCON(Timer Control Register),中文叫定时器/计数器控制寄存器,TCON寄存器是用于中断触发方式设置以及中断标志。 各寄存器位的作用如下: TCON寄存器位 作用 1.2 IE寄存器 IE(Interrupt Enable),中文叫中断允许寄存器,它的作用是控制所有中
[单片机]
80<font color='red'>51单片机</font>实战分析(以STC89C52RC为例) | 10 - 外部中断的使用
51单片机教程:单片机延时程序分析
上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。 〈单片机延时程序〉 MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。在250前面有个#号,这又是什么意思呢?这个#就是用
[单片机]
<font color='red'>51单片机</font>教程:单片机延时程序分析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved