📄 1s.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 + -