⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 atmega16L定时器经典试验已经通过验证
💻 C
字号:
/*项目名称:双向计时器,计时范围0-9999s 采用动态扫描
晶振:内部1Mhz  调试方法:JTAG+实验板 采用AVRSTUDIO4.12+WINAVR GCC
PA口对应数码管的七段 PB0-PB3对应数码管的位控制
日期:2005-12-1晚20:03分
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
#define set_led1 PORTB|=0x01  //宏定义,个位选通位
#define clr_led1 PORTB&=~(1<<PB0) //关掉个位
#define set_led2 PORTB|=(1<<PB1) //选通十位
#define clr_led2 PORTB&=~(1<<PB1) //关掉十位
#define set_led3 PORTB|=(1<<PB2)  //选通百位
#define clr_led3 PORTB&=~(1<<PB2) //关掉百位
#define set_led4 PORTB|=(1<<PB3)  //选通千位
#define clr_led4 PORTB&=~(1<<PB3)  //关掉千位
unsigned char count,direction;  //定义时间计数及方向寄存器
unsigned int timer;   //计时寄存器
const unsigned char table[] PROGMEM={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //FLASH存储区显示数据
void disp(unsigned int data){   //显示程序,并将INT数转换成BCD码再表查送显示
   unsigned char temp;
   temp=data/1000;          //求千位
   if(temp) data-=1000*temp;
   PORTA=pgm_read_byte(table+temp);  //将千位送显示
   set_led4;
   _delay_ms(1);
   clr_led4;
   temp=data/100;   //求百位
   if(temp) data-=100*temp;
   PORTA=pgm_read_byte(table+temp);  //将百位送显示
   set_led3;
   _delay_ms(1);
   clr_led3;
   temp=data/10;  //求十位
   if(temp) data-=10*temp;
   PORTA=pgm_read_byte(table+temp);   //将十位送显示
   set_led2;
   _delay_ms(1);
   clr_led2;
   PORTA=pgm_read_byte(table+data);  //余数为个位,直接查表送显示
   set_led1;
   _delay_ms(1);
   clr_led1;
}
void load_timer_val(){
   TCNT0=12;    //250ms
}
void init(){
   DDRA=0xff;
   DDRB=0xff;
   DDRD=0b00011111;
   PORTD=0b11100000;
   PORTA=0xff;
   PORTB=0x10;
   TCCR0=5;    //FSYS/1024分频,普通定时模式250MS
   TIMSK=1;    //允计计数中断
   direction=1;   //上电复位时默认向上计数
   load_timer_val();
}
SIGNAL(SIG_OVERFLOW0){  //计数器0中断程序
   count++;
   if(count>4)
      { 
	    if(direction){
		    count=0;    //向上计数,最大为9999
		    timer++;
		   if(timer>9999) timer=0;
		   }
         else {
		    count=0;    //向下计数,大于65535时,自动为0
			timer--;
			if(timer==65535) timer=9999;
			}
		    load_timer_val();
		}
   }
int main(){
   init();   //初始化设置
   sei();   //开中断
  while(1){
   disp(timer); 
   if(bit_is_clear(PIND,PD7)){   //PD7为向上计数设置按键
         _delay_ms(2);
		 loop_until_bit_is_set(PORTD,PD7);
		 direction=1;
		 }
   if(bit_is_clear(PIND,PD6)){  //PD6为向下计数设置按键
         _delay_ms(2);
		 loop_until_bit_is_set(PORTD,PD6);
		 direction=0;
		 }
   if(bit_is_clear(PIND,PD5)){   //PD5为数据清零按键
         _delay_ms(2);
		 loop_until_bit_is_set(PORTD,PD5);
		 timer=0;
		 }
  }
   return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -