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

📄 1s.i

📁 请认真阅读您的文件包然后写出其具体请认真阅读您的文件包然后写出其具体
💻 I
字号:
/*****************************************************
www.avrdiy.com
CodeWizardAVR V1.25.6 Professional
Chip type           : ATmega48
Clock frequency     : 7.372800 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128 
功能:LED每秒钟闪烁一次(或者驱动蜂鸣器),要求时间要精确
计算: 1秒 = 时钟 / ( 分频 * 计数 )
假设时钟 = 7372800 Hz 那么: 1秒 = 7372800 / ( 分频 * 计数 )
由于分频只有 1/8/32/64/128/256/1024 供我们选择,而计数最高只有8位(255)
为了不占用资源,中断次数尽量少一点比较好,并且中断服务程序运行时间越短越好
所以我们可以选择 计数TOP = 时钟7372800 / 分频1024 / 每秒30次中断 = 240
那么: 时间 = 时钟7372800 / 1024分频 / 每秒30次中断 / TOP 240 = 1秒
*****************************************************/

// CodeVisionAVR C Compiler
// (C) 1998-2004 Pavel Haiduc, HP InfoTech S.R.L.

// I/O registers definitions for the ATmega48(V)


#pragma used+
sfrb PINB=3;
sfrb DDRB=4;
sfrb PORTB=5;
sfrb PINC=6;
sfrb DDRC=7;
sfrb PORTC=8;
sfrb PIND=9;
sfrb DDRD=0xa;
sfrb PORTD=0xb;
sfrb TIFR0=0x15;
sfrb TIFR1=0x16;
sfrb TIFR2=0x17;
sfrb PCIFR=0x1b;
sfrb EIFR=0x1c;
sfrb EIMSK=0x1d;
sfrb GPIOR0=0x1e;
sfrb EECR=0x1f;
sfrb EEDR=0x20;
sfrb EEARL=0x21;
sfrb EEARH=0x22;
sfrw EEAR=0x21;   // 16 bit access
sfrb GTCCR=0x23;
sfrb TCCR0A=0x24;
sfrb TCCR0B=0x25;
sfrb TCNT0=0x26;
sfrb OCR0A=0x27;
sfrb OCR0B=0x28;
sfrb GPIOR1=0x2a;
sfrb GPIOR2=0x2b;
sfrb SPCR=0x2c;
sfrb SPSR=0x2d;
sfrb SPDR=0x2e;
sfrb ACSR=0x30;
sfrb MONDR=0x31;
sfrb SMCR=0x33;
sfrb MCUSR=0x34;
sfrb MCUCR=0x35;
sfrb SPMCSR=0x37;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-


// Interrupt vectors definitions


// Needed by the power management functions (sleep.h)
#asm
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x01
	.EQU __sm_mask=0x0E
	.EQU __sm_adc_noise_red=0x02
	.EQU __sm_powerdown=0x04
	.EQU __sm_powersave=0x06
	.EQU __sm_standby=0x0C
	.SET power_ctrl_reg=smcr
	#endif
#endasm


unsigned char TC2A=0;  
interrupt [8] void timer2_compa_isr(void)
{ 
  TC2A++;
  if(TC2A>=30) TC2A=0;     //中断30次就刚好是1秒钟
  if(TC2A>25) PORTD.3=1; else PORTD.3=0; 
  //在这里还可以插入如数码管的动态扫描/键盘扫描等代码
  //注意,中断运行时间必须小于 1秒 / 30次中断 = 33ms
}

void main(void)
{                                              
  (*(unsigned char *) 0xb0)|=2;               //工作于CTC模式(比较匹配时计数器TCNT2清零) 
  (*(unsigned char *) 0xb3)=240;               //设置TOP的值(计数器TCNT2的计数上限值)
  (*(unsigned char *) 0xb1)|=7;               //取系统时钟1024分频作为T/C2时钟
  (*(unsigned char *) 0x70)=2;                //使能计数器的值达到TOP时产生中断 
  DDRD.3=1;                //使用PD3每秒驱动蜂鸣器"嘀"一次 
  #asm("sei")              //插入汇编语句,打开全局中断
  while (1)
  {
    #asm("nop")            //空操作的汇编代码,等待中断发生
  };
} 

/****************************************************
假设程序还有一个3位数码管动态扫描任务,这时我们就可以这样计算
1:数码管的扫描频率在75-85Hz比较合适,太低会闪烁,太高占用资源
2:每扫描一次就必须分3次显示,分别是个位/十位/百位
3:这时我们可以计数出显示频率是225-255Hz(中断频率),在这里假设=240Hz
4:这时我们就可以顺便使用这个T/C2定数中断来保证扫描的可靠运行了***/

⌨️ 快捷键说明

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