ATMEGA16定时器的使用

ATMEGA16定时器的使用[日期:2012-01-07 ] [来源:本站编辑作者:佚名] [字体:大中小] (投递新闻)/*本程序简单的示范了如何使用ATMEGA16的定时器AVR定时器的要点介绍T0工作于CTC模式,输出1KHz/2KHz 50%占空比的方波T1工作于快速PWM模式兼输入捕捉T2工作于相位修正PWM模式,输出490Hz的8bit PWM波出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器对于定时器,AVRstudio的软件仿真是不准确的。

*/#include <AVR/io.h>#include <AVR/signal.h>#include <AVR/interrupt.h>//时钟定为8MHz,F_CPU=8000000//管脚定义#define ICPKEY 6 //ICP1 PD6 按键模拟ICP输入#define PWM0 3 //OC0 PB3#define PWM1A 5 //OC1A PD5#define PWM1B 4 //OC1B PD4#define PWM2 7 //OC2 PD7//宏定义#define PWM1A_ON() PORTD|= (1<<PWM1A) //输出高电平,灯亮#define PWM1A_OFF() PORTD&=~(1<<PWM1A) //输出低电平,灯灭//全局变量volatile unsigned int ICP_Time; //记录ICP输入捕捉事件的发生时刻volatile unsigned char T2PWM; //设置T2的PWM值volatile unsigned char T0OCR; //设置T0的时间值//仿真时在watch窗口,监控这些变量。

void timer0_init(void) //CTC模式输出1KHz/2KHz方波{OCR0 = T0OCR; //设定TOP值//TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS)//TOP=8000000/(2*64*2000)-1=30.25 选30 2.016KHz(0.496ms)TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);//64分频,CTC模式,OC0取反输出方波}void timer1_init(void){OCR1A = 39062; //设定TOP值.时间5S(0.2Hz)//TOP=8000000/(1024*0.2)=39062.5OCR1B = 15624; //设定OC1B的PWM值约2秒钟40%TCCR1A = (1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);TCCR1B = (0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);//1024分频,WGM1=15 快速PWM模式,TOP=OCRnA,ICP下降沿触发,OC1B正向PWM输出,OC1A为普通IO}SIGNAL(SIG_INPUT_CAPTURE1) //输入捕捉中断{ICP_Time=ICR1; //读取ICP输入捕捉事件的发生时刻}SIGNAL(SIG_OUTPUT_COMPARE1A)//T1输出比较A匹配中断{//在WGM1=15 快速PWM模式下,TOP=39062等同于5S左右的定时中断T2PWM+=10;OCR2=T2PWM; //修改T2的PWM值if (T0OCR==61)T0OCR=30; //改成1KHzelseT0OCR=61; //改成2KHzOCR0=T0OCR; //修改T0的时间值}void timer2_init(void)//相位修正PWM模式{OCR2 = T2PWM; //设定PWM值(最大值固定为255,8bit)TCCR2 = (0<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<CS22)|(1<<CS21)|(1<<CS20);//32分频,相位修正PWM模式,PWM频率为490Hz,OC2正向PWM输出//fPWM=fclk_IO/(2*N*TOP)=8000000/(2*32*255)=490Hz}int main(void){//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTA =0xFF; //不用的管脚使能内部上拉电阻。

PORTC =0xFF;PORTB =~ (1<<PWM0); //低电平,灯灭DDRB = (1<<PWM0); //输出PORTD =~((1<<PWM1A)|(1<<PWM1B)|(1<<PWM2)); //低电平,灯灭DDRD = (1<<PWM1A)|(1<<PWM1B)|(1<<PWM2); //输出T2PWM=0x80;T0OCR=30;ICP_Time=0x0000;timer0_init();timer1_init();timer2_init();TIMSK = (1<<TICIE1)|(1<<OCIE1A); //使能T1输入捕捉中断,T1输出比较A匹配中断(作定时用)sei(); //使能全局中断while (1){if (ICP_Time>15624)PWM1A_ON(); //如果数值大于15624(约2秒),OC1A输出高电平elsePWM1A_OFF(); //否则输出低电平}}/*程序运行效果引脚OC0(每5秒钟切换)交替输出1KHz和2KHz的50%占空比方波,接到无源蜂鸣器上,能听到不同频率的声音引脚OC1B输出0.2Hz的40%占空比的PWM波,精度39061级(略大于15bit)引脚OC2输出490Hz的PWM波,精度8bit,每5秒钟PWM值增大10级,对应的LED 亮度将会随之变化)ICP由引脚ICP1上的按键触发,ICP_Time将会记录下时间发生的时刻(相对于T1定时器的本次计数开始时间),如果数值大于15624(约2秒),OC1A输出高电平,否则输出低电平(刚好跟OC1B反相)如果使用AVR-51实验板作本实验,注意输出电平和LED的关系。

还有蜂鸣器的声音较大,耳朵比较难受)*//*附录AVR定时器的要点介绍(大部分摘自M16中文手册,未能一一测试)M16的T1 16位定时器一共有15种工作模式,其他2个8位定时器(T0/T2)相对简单,除了T2有异步工作模式用于RTC应用外(可以利用溢出中断和比较匹配中断作定时功能)分5种工作类型1 普通模式WGM1=0跟51的普通模式差不多,有TOV1溢出中断,发生于TOP时1 采用内部计数时钟用于ICP捕捉输入场合---测量脉宽/红外解码(捕捉输入功能可以工作在多种模式下,而不单单只是普通模式)2 采用外部计数脉冲输入用于计数,测频其他的应用,采用其他模式更为方便,不需要像51般费神2 CTC模式[比较匹配时清零定时器模式] WGM1=4,12跟51的自动重载模式差不多1 用于输出50%占空比的方波信号2 用于产生准确的连续定时信号WGM1=4时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断WGM1=12时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断注:WGM=15时,也能实现从OC1A输出方波,而且具备双缓冲功能计算公式:fOCn=fclk_IO/(2*N*(1+TOP))变量N 代表预分频因子(1、8、32,64、256,1024)。

3 快速PWM模式WGM1=5,6,7,14,15单斜波计数,用于输出高频率的PWM信号(比双斜波的高一倍频率)都有TOV1溢出中断,发生于TOP时比较匹配后可以产生OCF1x比较匹配中断.WGM1=5时, 最大值为0x00FF,8位分辨率WGM1=6时, 最大值为0x01FF,9位分辨率WGM1=7时, 最大值为0x03FF,10位分辨率WGM1=14时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断(单缓冲)WGM1=15时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A 将没有PWM能力,最多只能输出方波)改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值注意,即使OCR1A/B设为0x0000,也会输出一个定时器时钟周期的窄脉冲,而不是一直为低电平计算公式:fPWM=fclk_IO/(N*(1+TOP))4 相位修正PWM模式WGM1=1,2,3,10,11双斜波计数,用于输出高精度的,相位准确的,对称的PWM信号都有TOV1溢出中断,但发生在BOOTOM时比较匹配后可以产生OCF1x比较匹配中断.WGM1=1时, 最大值为0x00FF,8位分辨率WGM1=2时, 最大值为0x01FF,9位分辨率WGM1=3时, 最大值为0x03FF,10位分辨率WGM1=10时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断(单缓冲)WGM1=11时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A 将没有PWM能力,最多只能输出方波)改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值可以输出0%~100%占空比的PWM信号若要在T/C 运行时改变TOP 值,最好用相位与频率修正模式代替相位修正模式。

若TOP 保持不变,那么这两种工作模式实际没有区别计算公式:fPWM=fclk_IO/(2*N*TOP)5 相位与频率修正PWM模式WGM1=8,9双斜波计数,用于输出高精度的、相位与频率都准确的PWM波形都有TOV1溢出中断,但发生在BOOTOM时比较匹配后可以产生OCF1x比较匹配中断.WGM1=8时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断(单缓冲)WGM1=9时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A 将没有PWM能力,最多只能输出方波)相频修正修正PWM 模式与相位修正PWM 模式的主要区别在于OCR1x 寄存器的更新时间改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值可以输出0%~100%占空比的PWM信号使用固定TOP 值时最好使用ICR1 寄存器定义TOP。

合集下载

ATmega16 的EEPROM的使用

ATmega16 的EEPROM的使用

ATmega16 包含512 字节的EEPROM 数据存储器。

它是作为一个独立的数据空间而存在的,可以按字节读写。

EEPROM 的寿命至少为100,000 次擦除周期。

EEPROM 的访问由地址寄存器、数据寄存器和控制寄存器决定。

通过SPI和JTAG及并行电缆下载EEPROM数据的操作请分别参见P260、P265及P250。

EEPROM 读/ 写访问EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。

EEPROM的写访问时间由Table 1给出。

自定时功能可以让用户软件监测何时可以开始写下一字节。

用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/ 下降速度会比较慢。

此时CPU 可能工作于低于晶振所要求的电源电压。

请参见P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的问题。

为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。

具体参看EEPROM控制寄存器的内容。

执行EEPROM 读操作时,CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时,CPU 会停止工作2 个周期,然后再执行后续指令。

EEPROM 地址寄存器-EEARH和EEARL· Bits 15..9 – Res: 保留保留位,读操作返回值为零。

· Bits 8..0 – EEAR8..0: EEPROM 地址EEPROM地址寄存器– EEARH和EEARL指定了512字节的EEPROM空间。

EEPROM地址是线性的,从0 到511。

EEAR 的初始值没有定义。

在访问EEPROM 之前必须为其赋予正确的数据。

EEPROM 数据寄存器-EEDR· Bits 7..0 – EEDR7.0: EEPROM 数据对于EEPROM 写操作,EEDR 是需要写到EEAR 单元的数据;对于读操作,EEDR 是从地址EEAR 读取的数据。

AVR单片机教程14—第十四课 ATmega16L的定时计数器学习

AVR单片机教程14—第十四课 ATmega16L的定时计数器学习

——————————————————————————第十四课ATmega16L的定时/计数器学习本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!ATmega16L有两个8位定时/计数器(T/C0、T/C2)和一个16位定时/计数器(T/C1)。

每一个计数器都支持PWM(脉冲宽度调制)输出功能。

PWM输出在电机控制、开关电源、信号发生等领域有着广泛的应用。

ATmega16L的定时/计数器时钟是可以选择的。

它的时钟部分包括预分频器和一个多路选择器。

预分频器可被认为是单片机开发中一个有多级输出的分频器。

ATmegal6L用一个10位的计数器把输入时钟分为4种可选择的分频输出。

多路选择器可设置使用某一个分频输出,或者不使用分频输出和使用外部引脚输人时钟。

图9-1为预分频器的基本结构。

——————————————————————————图9-1 预分频器的基本结构9.2 ATmega16L定时/计数器的时钟选择1.使用系统时钟这种情况下使用系统时钟作为预分频器的输入,不过系统时钟的频率一般比较高,所以一般只能实现比较短的定时。

预分频比可通过设置TCCRx的CSx2、CSxl和CSx0来选定。

表9-1给出一个预分频设置值和分频比关系。

TCCRx同步计数器0和1Pck=CK 同步/异步计数器2 Pck=f(AS2)210CSx2CSx1CSx0Tck0,Tck1Tck2000Pck(系统时钟)Pck(系统时钟/异步时钟)001Pck/8Pck/8010Pck/64Pck/32011Pck/256Pck/64100Pck/1024Pck/128101引脚Tx下降沿Pck/256110引脚Tx上升沿Pck/512111Pck Pck/1024表9-1 预分频设置值和分频比关系2.使用异步时钟ATmegal6L的T/C2可以使用外部的异步时钟作为时钟源,这时可以在单片机的TOSC1和TOSC2——————————————————————————两个引脚之间接一个石英晶体或者陶瓷振荡器,和内部的振荡器连接起来。

Atmega16的定时器time0

Atmega16的定时器time0

Atmega16的定时器time0分类:AVR 2007-09-01 05:04 3180人阅读评论(2) 收藏举报依照AVR使用范例--定时器应用范例/avr_examples/timer.html。

使用ICC application builder快速配置定时器后生成的代码如下://ICC-AVR application builder : 2007-8-28 0:55:55// Target : M16// Crystal: 7.3728Mhz#include <iom16v.h>#include <macros.h>void port_init(void){PORTA = 0x00;DDRA = 0x00;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}TIMER0 initialize - prescale:1024 /*定时器预分频,预分频由TCCRn的CS02,CS01,CS00确定,详情查看数据手册*/// WGM: Normal/*定时器,也由TCCRn确定*/// desired value: 20mSec/*定时器期望设定时间*/// actual value: 19.861mSec (0.7%)/*定时器实际定时时间,误差比例*/void timer0_init(void){/*定时器停止,TCCR0寄存器完全控制timer0的运行情况,详细可参考数据手册。

*/ TCCR0 = 0x00; //stopTCNT0 = 0x71; //set count /*定时器寄存器开始值*/OCR0 = 0x8F; //set compare /*定时器比较值*/TCCR0 = 0x05; //start timer /*定时器开始*/}#pragma interrupt_handler timer0_comp_isr:20void timer0_comp_isr(void){//compare occured TCNT0=OCR0}#pragma interrupt_handler timer0_ovf_isr:10void timer0_ovf_isr(void){TCNT0 = 0x71; //reload counter value}//call this routine to initialize all peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();timer0_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x03; //timer interrupt sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}下面我们一步一步按顺序来分析。

ATMEGA16定时器0

ATMEGA16定时器0

ATMEGA16定时器0(2013-04-09 21:51:35)转载▼分类:AVR标签:avr定时器0MEGA16定时器0T/C0 是一个八位定时器,主要有定时、外部事件计数、产生PWM 波形这几个功能,我们在使用这些功能之前,首先要设置T/C0 工作在合适的工作模式下。

T/C0 有四种工作模式,分别是普通模式、CTC 模式、快速PWM、相位可调的PWM 模式四种。

模式设置通过T/C0 的控制寄存器TCCR0 来完成。

1.普通模式在此模式下,T/C0 的计数寄存器TCNT0 在时钟的驱动下不停累加。

当计满后(计数值达到最大,8 位寄存器最大计数值为0xff),由于数值的溢出寄存器清零重新开始累加。

当计数器溢出后,TIFR 中的溢出标志位TOV0 会置位,也可触发中断。

所以我们可以通过查询或中断的方式得知定时器的溢出从而进行相关处理。

此模式适合定时与计数。

关于定时和计数,这里的定时功能是T/C0 在对时钟计数达到一定的值后引发中断,达到了定时功能,然而本质的过程是计数工作。

那么这里所说的计数功能是外部事件计数。

实例:T/C0 定时实验,将T/C0 设置为普通模式,对1024 分频的系统时钟进行计数,计满发生中断,40 次中断递增一个计数用的变量,主函数则不停显示这个变量。

第一步:开总中断,SREG |= 0X80;第二步:开T/C0 溢出中断第三步:模式设置、分频设置、匹配输出模式设置T/C0 控制寄存器用于设置工作模式,时钟分频和波形输出模式。

这里T/C0 设置为普通模式,WGM00-WGM01设置为00。

此模式下定时器的TOP 值,也就是能够达到的最大计数值为0xFF。

TOV0 在计数器计满后置位,也就是计到MAX,八位的定时器计数达到255 为计满。

低三位设置定时器时钟。

T/C0 在系统时钟的分频或外部时钟的驱动下递增或递减。

系统时钟也就是晶振的大小是11.0592MHZ。

此实验中,设置为1024 分频。

ATmega16定时计数器0,1,2的普通模式彻底应用

ATmega16定时计数器0,1,2的普通模式彻底应用
{
while(!(TIFR&0x04));
TIFR=0x04;
TCNT1H=tempH;
TCNT1L=tempL;
}
void Timer1_InterruptMode(void)//T/C1中断方式函数
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
//Timer2_NquiryMode(6);
cnt=cnt+1;
//DisplayNumber(8,0,num++);
if(cnt==10)
{
cnt=0;
PORTA=0xff;
DisplayNumber(8,1,num);
PORTA=0x00;
num++;
if(num==60)num=0;
}
}
}*/
DisplayString(0,0,Table);
while(1)
{
//DisplayNumber(8,0,num++);
if(cnt==10)//cnt=500使用Timer0,2时。cnt=10使用Timer1时
{
cnt=0;
PORTA=0xff;
DisplayNumber(8,1,num);
PORTA=0x00;
TIFR=0x01;
TCNT0=temp;
}
void Timer0_InterruptMode(void)//T/C0中断方式函数
{
//stop errant interrupts until set up
CLI(); //disable all interrupts

ATmega16定时器中断

ATmega16定时器中断

ATmega16定时器/计数器中断及编程Atmega16内部有三个定时器/计数器T/C0,T /C1.T/C2,其中T/C0,T/C2为8为定时器,T/C1为16定时器,这里从高级语言编程的使用出发,简要介绍T/C0的使用。

定时器中断的过程是:当中断发生时,程序控制立即从主程序转移到中断服务程序,执行完中断服务程序后再返回到主程序的中断处继续执行后续的程序。

利用中断可以节省CPU资源。

先了解几个寄存器。

MCUCR---MCU控制寄存器;MCUCSR-----MCU控制与状态寄存器;GICR-----通用控制寄存器;GIFR-----通用中断标志寄存器;TIFR---定时器中断标志寄存器,TIMSK----定时器中断屏蔽寄存器。

这几寄存器保留默认设置即可,需要编程时了解并设置的寄存器为TCCR0----T/C0控制寄存器,TCNT0----T/C0的计数初始值,OCR0----输出比较寄存器,OC0/PB3----输出比较引脚。

TCCR0为8位寄存器,从高位到低位的名称依次是:FOC0,WGM00,COM01,COM00,WGM01,CS02,CS01,CS00.TCCR0各个控制位的作用:(1) CS02,CS01,CS00控制时钟选择和预分频,如100表示预分频为256(2) WGM01,WGM00控制波形产生模式,分为普通模式(用于普通计时),CTC模式(用于频率发生),快速PWM模式(用于PWM调速,功率调节),相位修正PWM模式。

如10表示CTC模式。

(3) COM01,COM00控制比较匹配输出模式。

在不同的波形产生模式下其逻辑值功能表不同,如在普通模式或CTC模式下01表示比较匹配发生OC0取反。

(4)FOC0,中断标志位,设为零即可。

至于上述控制位的逻辑值功能表可查阅Atmega16的中文数据手册,在官方网上会有英文版。

完成TCCR0的设定,接下来是设置TCNT0,OCR0寄存器了。

ATmega16单片机定时器讲解

COM0[1:0]的功能依赖于WGM0[1:0]的设置。 位[2:0]: CS0[2:0]:时钟选择位
13
3.2.2、ATmega16单片机定时器的特殊功能寄存器
计数寄存器--TCNT0:
位[7:0]: T/C0计数器的值。 根据计数器的工作模式,在每一个clkT0时钟到来时,计数器进行
加1、减1或清零操作。MCU 可以对这8位数据进行读写访问。
6
3.2、ATmega16单片机定时器T/C0的组成原理及特殊功能寄存器
ATmega16单片机配置了3个定时器, 它们是8位的定时器T/C0、8位的定时器 T/C2和16位的定时器T/C1,这些定时器 的工作原理基本相同,我们主要以8位定 时器T/C0为例说ATmega16单片机定时器 使用方法。
2
N分频设计
3
编写书上的例5-6 用CTC中断和溢出中断
4
秒表两个按键一开一关
5
表两个按键
34
3.5.2、ATmega16单片机定时器的设计应用
硬件设计:5V源自AVVcccc 517 Vcc 27 Vcc 38
R1 10K
4 /RE T
C0 4.7u
ATm eg a1 6
AJ1
C7 33 OSC1 C6 33
12 PD .3(/INT1)
8 XTAL1
7 XTAL2
L1 R21~28
L2 R29~36
L3 R37~44
L4 R45~52
dp g f e d c b a
dp g f e d c b a
dp g f e d c b a
13 12 11 10 6 5 4 3 PC.6 25 1
2 U8 74HC164

ATmega16单片机的使用

ATmega16单片机的使用——实验一 Atmega16定时器T/C0实现按键扫描——实验二 ATmega16单片机的ADC使用举例指导老师:黄刚班级:0720222姓名:李锋锐学号:28试验《一》 Atmega16定时器T/C0实现按键扫描(一)实验目的:用ATmega16实现同时对两个按键定时扫描,要求扫描周期为10MS ,当AJ1按下,LED2点亮,并且BELL 蜂鸣声,当AJ1松开,LED2熄灭,BELL 不响;当AJ2按下,LED3点亮,并且BELL 发出蜂鸣声,当AJ2松开,LED3熄灭,BELL 不响。

(二)实验原理(硬件设计):如图5-37所示,端口PD.3、PD.4为输入端,分别接AJ1和AJ2;端口PD.6、PD.7为输出模式,分别接LED2和LED3;端口PA.4为输出,通过三极管T1来控制蜂鸣器。

图5-36 基于Atmega16单片机定时器的按键扫描电路图(三)实验原理(软件设计):选用外部7.3728MHz 的晶振为系统时钟,按键扫描间隔定位10ms ,定时器T/C0采用CTC 模式,T/C0时钟选择1024分频后的系统时钟,并启用中断。

利用CTC 模式的工作原理,OCR0应赋的值由以下方程确定:361010)10(1024103728.71-⨯=+⨯⨯⨯OCR 于是:)(即0x47710=OCR 。

允许比较匹配中断,在中断程序里做标志位设置,判断标志位满足条件时,程序再读取键盘的状态,确定有无键按下以及按下键的具体操作。

程序如下:(1) L5-6.c#include<iom16.h> #include"key.h"#define Led2 PORTD_Bit6//定义led2 #define Led3 PORTD_Bit7//定义led3 #define Bell PORTA_Bit4//定义bell unsigned char flag=0;void port_init(void);void timer0_init(void);//************************主程序****************************//void main(void){port_init();timer0_init();SREG_Bit7=1;//使能全局中断TCCR0=0x0D;// 定时器工作模式为CTC模式,定时器时钟源来自预分频器的1024分频 while(1){if(flag==1){flag=0;switch(read_key()){case 0:Led2 =1; // Led2灯不亮Led3=1; //Led3灯不亮Bell =0; //蜂鸣器不响break;case 1:Led2 =0; //led2灯亮Led3=1; //Led3灯不亮Bell =1; //蜂鸣器响break;case 2:Led2 =1; //led2灯不亮Led3=0; //Led3灯亮Bell =1; //蜂鸣器响break;}}}}//*******************端口初始化程序*****************************//void port_init(void){DDRD=0xc0;PORTD=0x18;//PD.3( AJ1 )和PD.4( AJ12)方向输入,上拉有效,PD.6(Led2)和//PD.7(Led3)方向输出DDRA=0x10;PORTA=0x00;//PA.4(Bell)方向输出}//******************定时器寄存器初始化程序*(***********************//void timer0_init(void){TCCR0=0x00;TCNT0=0x00;OCR0=0x47; //7.3728MHz的系统时钟(OCR0=0X48)10msTIMSK=0x02; //TC0比较匹配中断使能}//******************定时器0比较匹配中断服务程序***********************// #pragma vector=TIMER0_COMP_vect__interrupt void TIMER0_COMP_isr(void){SREG_Bit7=0;//关闭全局中断flag=1; //标志位置位SREG_Bit7=1; //打开全局中断}(2) key.h#include<iom16.h>#define AJ1 PIND_Bit3//定义按键1#define AJ2 PIND_Bit4//定义按键2unsigned char read_key(){static unsigned char key_state=0;unsigned char key_return=0;switch((key_state)){case 0:if(!AJ1||!AJ2){key_state=1;}break;case 1:if(!AJ1||!AJ2){switch((PIND&0x18)){case 0x10://AJ1按下,返回1key_return=1;break;case 0x08://AJ2按下,返回2key_return=2;break;}key_state=2;}else{key_state=0;}break;case 2:if(AJ1&&AJ2){key_state=0;}if(!AJ1){key_return=1;}if(!AJ2){key_return=2;}break;default: break;}return ( key_return);}四、实验结果:ATmega16可实现同时对两个按键定时扫描,扫描周期为10MS,当AJ1按下,LED2点亮,并且BELL蜂鸣声,当AJ1松开,LED2熄灭,BELL不响;当AJ2按下,LED3点亮,并且BELL发出蜂鸣声,当AJ2松开,LED3熄灭,BELL不响。

Almel ATmega16 ATmega16 微控制器 说明书


PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) AREF GND AVCC PC7 (TOSC2) PC6 (TOSC1) PC5 (TDI) PC4 (TDO)
声明
本数据手册的典型值来源于对器件的仿真,以及其他基于相同产生工艺的 AVR 微控制器 的标定特性。本器件经过特性化之后将给出实际的最大值和最小值。


具有 16KB 系统 内可编程 Flash 的8位 微控制器 ATmega16 ATmega16L


• • • •
本文是英文数据手册的中文 翻译,其目的是方便中国用 户的阅读。它无法自动跟随 原稿的更新,同时也可能存 在翻译上的错误。读者应该 以英文原稿为参考以获得更 准确的信息。
2466G–AVR–10/03
PA0 - PA7 VCC PC0 - PC7
PORTA DRIVERS/BUFFERS
PORTC DRIVERS/BUFFERS
GND
PORTA DIGITAL INTERFACE
PORTC DIGITAL INTERFACE
AVCC
MUX & ADC
AREF PROGRAM COUNTER
ADC INTERFACE
XTAL2 MCU CTRL. & TIMING RESET
INSTRUCTION DECODER
Y Z
CONTROL LINES
ALU
INTERRUPT UNIT
INTERNAL CALIBRATED OSCILLATOR
AVR CPU
STATUS REGISTER
EEPROM
PROGRAMMING LOGIC

Atmega16定时器


定时计数器应用例图
例1录像
例2录像
例3录像
例4录像
事件捕获原理
捕获原理框图如下图所示: 当外部捕获事件发生时,立即打开闸门电路将定 时器/计数器的当前值装入捕获寄存器。一旦定时 器/计数器的当前值被装入捕获寄存器,捕获标志 位ICF立即置1并同时产生输入捕获中断请求2。
事件捕获原理
捕获寄存器 溢出标志ICF S2 中断请求 捕获事件 S0 闸门电路
6.1.2 计数器原理
启动计数 器工作的 开关
当S1合上,若检测 到有有效脉冲输入 时,计数器加1 中断请求 开放与禁 止开关
S1
计数器 初值寄存器
S2 溢出标志TF
当S2合上并 且TF=1时, 可向CPU请 求中断
当计数器加到 256时,溢出标 志由0变成1
默认初值为0, 可根据需要 设置初值
6.1.2 计数原理
6.1.1 定时计数器概述
采用单片机定时/计数器定时:为了使用方便, 解决上述两种方式的弊端并增加单片机的控制功 能,把定时计数逻辑电路集成在单片机芯片中, 称之为定时计数器。
ATmegal6内部有3个通用定时器/计数器:2个 8位的定时器/计数器:T/CO、T/C2,1个16位的 定时器/计数:T/C1。3个通用定时器/计数器除 了能够实现通常的定时计数功能外,还具有捕获, 比较、脉宽调制输出(PWM)实时时钟等超强功能; 我们这一节主要介绍定时计数的基本原理及应用。
T0/T2控制寄存器TCCR0/TCCR2:
-
-
-
-
(T/C1)
CSn2
CSn1
CSn0
返回例1
返回例2
返回例3
M16的中断控制系统
中断标志寄存器TIFR 0 1 0 0 0 1 0 1 状态寄存器SREG|=0X80 1 0 0 0 0 0 0 0
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档