avr单片机秒表Proteus仿真程序 tm1637数码管显示

2020-09-16来源: 51hei关键字:avr单片机  秒表  tm1637  数码管显示

单片机源程序如下:

/**


*版权所有(c)2018,艁ukasz Marcin Podkalicki

*2009年12月13日            

*简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。              *            

*注意,这个ATtiny13项目使用的内部时钟并不精确            

*时间可以向前或向后流动,但是嘿!            

*它仍然足够做一个好的鸡蛋计时器:)


*/



//#include


#include


#include


#include


#include "tm1637.h"




#define        BUTTON_PIN        PB2




#define        TIMER_UPDATE        (1 << 1)


#define        TIMER_STOP        (1 << 2)


#define        TIMER_START        (1 << 3)


#define        TIMER_RESET        (1 << 4)




static volatile uint8_t timer_counter;


static volatile uint8_t timer_events;


static volatile uint8_t timer_seconds;


static volatile uint8_t timer_minutes;


static volatile uint8_t timer_colon;




static void timer_init(void);


static void timer_handler(void);


static void timer_process(void);


static void timer_display(const uint8_t minutes, const uint8_t seconds, const uint8_t colon);




ISR(TIM0_COMPA_vect)


{




        timer_handler();


}




int main(void)


{


        /* setup */


        timer_init();




        /* loop */


        while (1) {


                timer_process();


        }


}




void  timer_init(void)


{




        TM1637_init(1, 4);


        DDRB &= ~_BV(BUTTON_PIN); //明确设置按钮针作为输入


        PORTB |= _BV(BUTTON_PIN); // 设置按钮销的上拉电阻器


        TCCR0A |= _BV(WGM01); // 将计时器计数器模式设置为CTC


        TCCR0B |= _BV(CS01)|_BV(CS00); // 将预分频器设置为64(CLK=1200000Hz/64/250=75Hz)


        OCR0A = 249; // 设置定时器计数器最大值(250-1)



TIMSK |= _BV(OCIE0A);// 启用定时器CTC中断


        timer_counter = timer_seconds = timer_minutes = 0; // 重置计数器


        timer_events = TIMER_UPDATE | TIMER_RESET; // 重置计时器和更新显示


        timer_colon = 1; // 显示冒号


        sei(); //启用全局中断


}




void  timer_handler(void)


{




        if (!(timer_events & TIMER_START)) {


                return;


        }




        timer_counter++;


        if (timer_counter == 38) {


                timer_colon = 1;


                timer_events |= TIMER_UPDATE;


        } else if (timer_counter == 75) {


                timer_colon = 0;


                timer_counter = 0;


                if (++timer_seconds == 60) {


                        timer_seconds = 0;


                        if (++timer_minutes == 100) {


                                timer_minutes = 0;


                        }


                }


                timer_events |= TIMER_UPDATE;


        }


}




void  timer_process(void)


{




        /* 过程启动/停止/重置 */


        if ((PINB & _BV(BUTTON_PIN)) == 0) {


                _delay_ms(10); // 去噪时间


                while((PINB & _BV(BUTTON_PIN)) == 0);


                if (timer_events & TIMER_START) {


                        timer_colon = 1;


                        timer_events = TIMER_UPDATE | TIMER_STOP;


                } else if (timer_events & TIMER_STOP) {


                        timer_minutes = timer_seconds = 0;


                        timer_colon = 1;


                        timer_events = TIMER_UPDATE | TIMER_RESET;


                } else if (timer_events & TIMER_RESET) {


                        timer_events = TIMER_START;


                }


        }




        /* 更新显示 */


        if (timer_events & TIMER_UPDATE) {


                timer_display(timer_minutes, timer_seconds, timer_colon);


                timer_events &= ~TIMER_UPDATE;


        }


}




void  timer_display(const uint8_t minutes, const uint8_t seconds, const uint8_t colon)


{




        /* 显示分钟数*/


        TM1637_display_digit(0, minutes / 10);


        TM1637_display_digit(1, minutes % 10);




        /* 显示秒数 */


        TM1637_display_digit(2, seconds / 10);


        TM1637_display_digit(3, seconds % 10);




        /* 显示/隐藏冒号 */


        TM1637_display_colon(colon);


}


关键字:avr单片机  秒表  tm1637  数码管显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic510369.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MikroC写的ATmega16驱动spi接口128x64屏例子
下一篇:AT90S8515单片机SPI驱动74LS595源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR单片机熔丝位的设置及拯救方法
AVR单片机需要设置合适的熔丝位才能实现其功能,如果熔丝位设置的不对将有可能导致单片机自锁,这是我整理的AVR单片机熔丝位的设置及拯救方,希望对大家有帮助。 
发表于 2020-09-17
<font color='red'>AVR单片机</font>熔丝位的设置及拯救方法
AVR单片机教程——PWM调光
为0到9,分别表示LED的占空比为0/9到9/9。比如,当占空比为4/9时,在9毫秒的周期中,前4毫秒LED亮,后5毫秒LED不亮。可以看见,占空比越大,LED亮度也越高。原来,在亮与暗之间,LED还有中间的状态。我们不是通过让引脚输出一个0V和5V之间的电压,而是让引脚电平迅速地在高低之间变化来实现的。这种通过电平的快速跳变来实现模拟量效果的技术,称为脉冲宽度调制,简称PWM。定时器大多数单片机的定时器都可以输出PWM波,外设丰富的AVR单片机自然不例外。上一讲提到定时器0有四种工作模式,后两种就是快速PWM模式与相位修正PWM模式。在快速PWM模式中,TCNT0寄存器的动作与普通模式相同,但还可以把OCR0A作为上限。对于非反转输出
发表于 2020-09-09
AVR单片机教程——LCD1602
7)接到一个单片机引脚上。关于为什么会有这种诡异的接法,这是设计时的失误(也可能是不得已吧,毕竟单片机的32个IO已经占满了),参见:一个低电平引发的思考。协议1602与单片机之间是通过并行总线通信的。AVR单片机硬件上不支持并行总线,需要通过软件模拟时序来实现。写操作的时序如下:进行一个写操作,需要先让RS根据写的类型设置电平,R/W输出低电平,D0~D7输出要发送的数据,然后在E的上升沿数据被对方读取,并保持R/W与D0~D7电平不变,直到E的下降沿之后。两次E的上升沿之间至少需要400us时间间隔。1602共有8条指令,都是一字节长度的。从高位到低位,每一条指令都由若干个0、一个1和有效指令组成,使得没有两条指令会有相同的二进制
发表于 2020-09-09
<font color='red'>AVR单片机</font>教程——LCD1602
AVR单片机教程——UART进阶
在第一期中,我们已经开始使用UART来实现单片机开发板与计算机之间的通信,但只是简单地讲了讲一些概念和库函数的使用。在这一篇教程中,我们将从硬件与软件等各方面更深入地了解UART。USART组件一直在讲的UART其实是USART组件的一部分,USART比UART多了同步的一部分,但这一部分用得太少(我从来没用过),而且缺乏实例,所以就略过了。然而,单片机的设计者很机智地把这个鸡肋功能升华了一下,USART组件可以支持SPI模式。SPI是一种同步串行总线,可以支持很高的传输速率。这个功能使得ATmega324PA支持最多3个SPI通道,其中一个是纯SPI,另两个就是SPI模式下的USART。我们将在下一讲中揭开SPI的神秘面纱。回到
发表于 2020-09-08
<font color='red'>AVR单片机</font>教程——UART进阶
AVR单片机教程——矩阵键盘
开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测。但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法。矩阵键盘这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动。我们先来看看它的原理。每个按键有两个引脚,当按键按下时接通。每一行的一个引脚接在一起,分别连接到左边4个端口,称为“行引脚”;每一列的另一个引脚接在一起,分别连接到右边的4个端口,称为“列引脚”。这就是矩阵键盘内部的电路连接方式。那么如何驱动它呢?首先我们简化一下,只考虑第一排:这样就很简单了吧,只要让行引脚保持低电平,4个列引脚设置为输入并开启上拉电阻,读到低电平
发表于 2020-09-08
<font color='red'>AVR单片机</font>教程——矩阵键盘
51单片机倒计时秒表/可调整时钟
(1)控制功能:①启动/停止:秒表和时钟选择功能的总开关允许位。没按或偶次按下,关闭时钟和秒表功能选择。单次按下,允许进行秒表和时钟功能选择。②暂停:秒表或时钟的停止信号。任何时候按下按钮停止秒表倒计时或停止时钟计时和撤销报警信号。③复位:秒表和时钟复位信号。任何时候按下按钮秒表显示或时钟显示恢复初始状态:00.00.00.0 。(2)调节功能:通过6位按钮可以对数码的六位显示进行调整。任何时候都可以分别可以通过HH、HL、MH、ML、SH、SL对时的十位、时的个位、分的十位、分的个位、秒的十位和秒的个位进行调节并设定。(3)显示功能:同8个8段数码管进行显示。显示精度为0.01秒;最后一段数码管显示工作状态,“H”代表
发表于 2020-09-07
51单片机倒计时<font color='red'>秒表</font>/可调整时钟
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved