AVR单片机Atmega16电子时钟程序+仿真,内部定时器实现

发布者:Serendipitous55最新更新时间:2019-10-18 来源: eefocus关键字:AVR单片机  Atmega16  电子时钟  定时器 手机看文章 扫描二维码
随时随地手机看文章

Atmega16电子时钟,内部定时器,有可调闹钟。

仿真原理图如下
 

单片机源程序如下:

#include

#include

#define  key_bz    0b00000111

char smg_zx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f};// 全局变量

  

char hour=12;

char min;

char sec;

char nz_hour=12;

char nz_min=1; 

char mode=0;

char set;


void delay_ms(unsigned int k)                        

{

    unsigned int i,j;

    for(i=0;i    {

      for(j=0;j<570;j++);

    }

}

// 用定时器实现定时

void T0_init(void)// 端口初始化函数

{

TIFR=0XFF;

TCCR0=0X0B; //64FENPIN, CTC MODE

TCNT0=0;

OCR0=250;

TIMSK=0X02;


}


void port_init(void)// 端口初始化函数

{

  DDRC  |= 0b11110000;  // PC4 5 OUT PUT

  PORTC |= 0b00111111; //m103 output only


PORTD = 0x00; //  上电关闭数码管, 因为上电电压不稳

DDRD  = 0xff;

DDRB  |= 0b11100000;  // PC5 6 7OUT PUT

}


//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();//smg_zx[0]=1;

  T0_init();

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

//miao=45;


void key (void)

{


if(!(PINC&0X01))

{

   delay_ms(2);

   if(!(PINC&0X01)) 

   {

    TIMSK=0X00;

    mode++;

        mode%=3;

        set=0;

        if(mode==0)TIMSK=0X02;

        while(!(PINC&0X01));

   }

}



if(!(PINC&0X02))

{

   delay_ms(2);

   if(!(PINC&0X02)) 

   {

    if(mode==1)

        {

         set++;

         set%=3;

        }

        if(mode==2)

        {

         set++;

         set%=2;

        }

        while(!(PINC&0X02));

   }

}



if(!(PINC&0X04))

{

   delay_ms(2);

   if(!(PINC&0X04)) 

   {


    if(mode==1)

        {

         if(set==0)

         {

          hour++;

          hour%=24;

         }

         if(set==1)

         {

          min++;

          min%=60;

         } 

         if(set==2)

         {

          sec++;

          sec%=60;

         }  


        }

        if(mode==2)

        {

         if(set==0)

         {

          nz_hour++;

          nz_hour%=24;

         }

         if(set==1)

         {

          nz_min++;

          nz_min%=60;

         } 

        }

        while(!(PINC&0X04));

   }

  

}


//主函数

void main()

{/// 变量声明

   

char zz;  

  // 调用初始化哈数 

//port_init();

init_devices();

// 特定代码

   while(1)

   {

   

   

if(mode==0)  

{

   

    PORTD=~smg_zx[hour/10];  // 给5的字形编码  

    PORTB|=1<        delay_ms(2);

        PORTB&=0B00111111;//        

                

   

    PORTD=~smg_zx[hour%10];  // 给5的字形编码  

         PORTB|=1<         delay_ms(2);

     PORTB&=0B00111111;//

   

   

   

     PORTD=~smg_zx[min/10];  // 给5的字形编码  

     PORTC|=1<         delay_ms(2);

         PORTC&=0B00001111;//        

                

   

    PORTD=~smg_zx[min%10];  // 给5的字形编码  

        PORTC|=1<

         delay_ms(2);

    PORTC&=0B00001111;//

   

    PORTD=~smg_zx[sec/10];  // 给5的字形编码  

    PORTC|=1<        delay_ms(2);

        PORTC&=0B00001111;//        

                

   

     PORTD=~smg_zx[sec%10];  // 给5的字形编码  

         PORTC|=1<         delay_ms(2);

     PORTC&=0B00001111;//

}


else if(mode==1)  

{

   

    PORTD=~smg_zx[hour/10];  // 给5的字形编码  

    PORTB|=1<        delay_ms(2);

        PORTB&=0B00111111;//        

                

   

    PORTD=~smg_zx[hour%10];  // 给5的字形编码  

        if(set==0)  PORTD&=0x7f;//控制小数点亮

         PORTB|=1<         delay_ms(2);

     PORTB&=0B00111111;//

   

   

   

     PORTD=~smg_zx[min/10];  // 给5的字形编码  

     PORTC|=1<         delay_ms(2);

         PORTC&=0B00001111;//        

                

   

    PORTD=~smg_zx[min%10];  // 给5的字形编码  

         if(set==1)  PORTD&=0x7f;//控制小数点亮

        PORTC|=1<

         delay_ms(2);

    PORTC&=0B00001111;//

   

    PORTD=~smg_zx[sec/10];  // 给5的字形编码  

    PORTC|=1<        delay_ms(2);

        PORTC&=0B00001111;//        

                

   

     PORTD=~smg_zx[sec%10];  // 给5的字形编码  

         if(set==2)  PORTD&=0x7f;//控制小数点亮

         PORTC|=1<         delay_ms(2);

     PORTC&=0B00001111;//

}

else if(mode==2)

{


     PORTD=~smg_zx[nz_hour/10];  // 给5的字形编码  

    PORTB|=1<        delay_ms(2);

        PORTB&=0B00111111;//        

                

   

    PORTD=~smg_zx[nz_hour%10];  // 给5的字形编码  

        if(set==0)  PORTD&=0x7f;//控制小数点亮

         PORTB|=1<         delay_ms(2);

     PORTB&=0B00111111;//

   

   

   

     PORTD=~smg_zx[nz_min/10];  // 给5的字形编码  

     PORTC|=1<         delay_ms(2);

         PORTC&=0B00001111;//        

                

   

     PORTD=~smg_zx[nz_min%10];  // 给5的字形编码  

         if(set==1)  PORTD&=0x7f;//控制小数点亮

         PORTC|=1<         delay_ms(2);

     PORTC&=0B00001111;//

   


}



   if((hour==nz_hour)&&(min==nz_min))//闹钟

   {

    if(zz++>20)

        {

     PORTB^=1<         zz=0;

        }

   }

   else

   PORTB|=1<        

    

         key ();

        

        

    



   }

  }

   //T0中断服务程序 //  2ms 进入中断

   #pragma interrupt_handler timer0_ocf_isr:20

  void timer0_ocf_isr(void)

  {static int count=0;

   if(++count>=500)

   { count=0;

     sec++;

         if(sec>=60)

         {

         sec=0;

         min++;

          if(min>=60)

         {

         min=0;

         hour++;

         hour%=24;

         }

         }

   }

}



关键字:AVR单片机  Atmega16  电子时钟  定时器 引用地址:AVR单片机Atmega16电子时钟程序+仿真,内部定时器实现

上一篇:PT6311 HT1628的avr单片机详细例程
下一篇:基于AVR的ds1302时钟代码

推荐阅读最新更新时间:2024-11-18 16:06

B001-Atmega16-位域的汇编实现
------------------------------------------------------------------------------------------------------------------------------------- 开发环境:AVR Studio 4.19 + avr-toolchain-installer-3.4.1.1195-win32.win32.x86 芯片型号:ATmega16 芯片主频:8MHz ---------------------------------------------------------------------------------------
[单片机]
C8051F020定时器中断使用
C8051F020内部有5 个计数器/定时器:其中三个16 位计数器/定时器与标准8051 中的计数器/定时器兼容,还有两个16 位自动重装载定时器可用于ADC、SMBus、 UART 1 或作为通用定时器使用。这些计数器/定时器可以用于测量时间间隔,对外部事件计数或产生 周期 性的中断请求。 将定时器与中断系统的结合将给我们编程带来很大的帮助,程序条理性强易编写易读。 下面我将利用可装载的计数器中断程序编写流程总结如下: 一:定时器初始化 1:停止定时器,清中断溢出位。 通过设置SFR中TMRnCN,停止将TMRnCN^2置0,清中断溢出位TMRnCN^7。 2:计数值和装载值的设置
[单片机]
STM32高级定时器TIM1、TIM15输出PWM
1、TIM初始化基本过程及源码 (a)GPIO、TIM结构体变量申明 (b)GPIO、TIM时钟使能 (c)GPIO基本配置 (d)TIM配置、通道设置 (e)TIM使能 源码如下: /** * @brief void TIM_Configuration(void) * @describe TIM配置 PWM输出初始化 TIM1 CH1 PA8 TIM1 CH2 PA9 TIM15 CH1 PB14 TIM15 CH2 PB15 * @param void * @retval void */ void TIM_Configuration(void) { TIM_TimeBaseInitTyp
[单片机]
STM32高级<font color='red'>定时器</font>TIM1、TIM15输出PWM
关于stm32定时器定时周期计算
1.TIMx(1-8),在库设置默认的情况下,都是72M的时钟; 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系
[单片机]
关于stm32<font color='red'>定时器</font>定时周期计算
基于stm32单片机的通用定时器配置
stm32单片机的定时器资源相当丰富,它的定时器分为高级控制定时器、通用定时器和基本定时器,具体这些定时器资源在哪个系列的片子有就得看不同的片子的手册了。他们具体有什么区别,我也是刚接触这个,看他的数据手册介绍也是茫然,主要是刚开始摸,那些功能都没用到,反正用做定时作用的话哪种定时器都行。在这我就把我自己配置通用定时器的方法及心得简短做个总结,以防以后忘记了。我配置的是定时器2(TIM2)。 通用定时器的时钟可来自于外部或内部,选用默认即是采用内部的。通用定时器的时钟来源为APB1总线,所以首先,得将APB1外设时钟打开。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)
[单片机]
基于AVR单片机的DS1302子程序
摘要: 目 的: 建立DS1302操作库 目标系统: 基于AVR单片机 应用软件: ICCAVR /********************************************************************* 目 的: 建立DS1302操作库 目标系统: 基于AVR单片机 应用软件: ICCAVR *********************************************************************/ /*01010101010101010
[单片机]
在51单片机上用定时器实现按键长按、短按功能
我们在项目中常常需要在只有一个按键的情况下,来实现长按执行某个功能,短按执行另一个功能。 鉴于此,用51搭的核心板实测,亲测可行。好了,废话少说,简单粗暴,直接贴上程序结构。 主函数() { } 在进入while大循环中,先要配置定时器。 在while中核心是:使用两个if块判断,第一个if块判断按键是否按下,在第一个if块里面只进行按键按下标志位设置和定时器计数。 在第二个if块里根据第一个if块定时器计数来执行长短按功能,记得在退出第二个if块时,按键按下标志位(press_flag)和定时器 计数变量(count)都要清零。 …… 定时器配置和中断服务程序就不贴出来了。
[单片机]
在51<font color='red'>单片机</font>上用<font color='red'>定时器</font>实现按键长按、短按功能
基于ATMEGA16的DS1302可调万年历程序
程序: main函数: /* 程序功能:DS1302实时时钟显示 作者:朱波 时间:2012年2月3日 通信方式:3线串行通信 使用说明:本程序模仿家用万年历,能够进行时间的设定 时间设定方法:1.按下设置键进入设置模式 2.按选择键对要设置的项进行选择 3.按加一键对选择项加一 4.完成全部选择后出现"please check OK!" 此时按下确定键就回到时间模式 备注:可以通过主函数中的宏定义进行时间设置 */ #include iom16v.h #include macros.h #include "delay.h" #include "d
[单片机]
基于<font color='red'>ATMEGA16</font>的DS1302可调万年历程序
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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