260 likes | 412 Views
电子跑表. 【 项目功能 】. 1 、用 ATmega16 单片机的定时 / 计数器 0 制作一个简单的电子跑表,由四个 LED 数码管显示时间,最高计时可达 9 分 59.9 秒,并由相应的“开始 / 停止”键控制。 2 、掌握 ATmega16 单片机定时 / 计数器 0 原理及基本使用方法。. 【 项目知识点与技能点 】. 1 、 ATmega16 单片机的定时 / 计数器 0 的结构、类型及其功能。 2 、 与定时 / 计数器有关的寄存器的功能及设置。 3 、 定时 / 计数器中断服务子程序的结构及基本的编程方法。
E N D
【项目功能】 1、用ATmega16单片机的定时/计数器0制作一个简单的电子跑表,由四个LED数码管显示时间,最高计时可达9分59.9秒,并由相应的“开始/停止”键控制。 2、掌握ATmega16单片机定时/计数器0原理及基本使用方法。
【项目知识点与技能点】 1、ATmega16单片机的定时/计数器0的结构、类型及其功能。 2、与定时/计数器有关的寄存器的功能及设置。 3、定时/计数器中断服务子程序的结构及基本的编程方法。 4、定时/计数器在定时/计数方面的简单应用。
一、什么是定时/计数器 • 在单片机内部,一般都会有专门的硬件电路构成可编程的定时/计数器。定时/计数器最基本的功能就是对脉冲信号(内部机器周期或外部时钟脉冲)进行自动计数,也就是说计数的过程由硬件完成,不需要MCU的干预。但是MCU可以通过指令设置定时/计数器的工作方式,以及根据定时/计数器的计数值或工作状态做必要的处理和相应。 • ATmega16单片机内配置了2个8位和1个16位共3个定时/计数器。
8位定时/计数器 ATmega16的定时/计数器共有3个: 1个16位的定时/计数器——定时/计数器1(简称T/C1) 2个8位定时/计数器——定时/计数器0(简称T/C0 )、 定时/计数器2(简称 T/C2) 这3个定时/计数器各具特点: T/C0功能普通——(8位二进制)计数、定时、PWM T/C1功能多——(16位二进制)计数、定时、PWM、输入捕获 T/C2功能少且特殊——(8位)定时(有异步定时功能,可 作为实时时钟RTC)、PWM
二、T/C0的结构图 控制寄存器 溢出 计数 计数寄存器 清除 外部时钟 方向 计数时钟 比较匹配 底部值 顶部值 输出比较寄存器
时钟源: • T/C0的计数时钟源可由来自外部引脚T0的信号提供,也可来自芯片的内部。下图为T/C0时钟源部分的内部功能图。 • T/C0的时钟源的选择由T/C0的控制寄存TCCR0中的3个标志位CS0[2:0]确定,共有8种选择。其中包括无时钟源(停止计数),外部引脚T0的上升沿或下降沿,以及内部系统时钟经过一个10位预定比例分频器分频的5种频率的时钟信号(1/1、1/8、1/64、1/256、1/1024)。
clkI/O 10位T/C预分频器 Clear CK/8 PSR10 CK/64 CK/256 CK/1024 T0 0 T1 0 CS00 CS10 CS10 CS01 CS11 CS11 CS12 CS02 T/C0时钟源clkT0 T/C1时钟源clkT1 T/C1、0的预分频器 预分频器的作用是将系统时钟(如芯片内部的系统时钟为4.000MHz)按设定的比例进行分频,以产生不同周期的时钟clkT0、clkT1,分别作为时钟源提供给T/C0和T/C1使用。
三、工作模式 普通模式: 当检测到有有效脉冲输入时,计数寄存器加1 启动计数器工作 中断开放 S1 S2 脉冲 1 0 中断请求 0xFA 0xF5 0xF6 0xF7 0xF9 0xF8 0xFF 0xFC 0xF5 0xFE 0xFD 0xFB 溢出标志TF 计数器 当计数器计数溢出时的标志 中断响应后溢出标志清“0” 单片机的计数器用户是可以控制的(可编程的),包括计数器的启动、计数脉冲的有效方式、计数器的初值、计数溢出中断请求开放或禁止等。 0xF5 初 值 初值寄存器作为计数器回0时的初始值
CTC模式: 波形发生器的频率
快速PWM模式: 256 OC0---PB3 OC0输出的PWM波形的频率: N代表分频因子(1、8、64、256或1024)。
相位修正PWM模式: 510 OC0输出的PWM波形的频率: N代表分频因子(1、8、64、256或1024)。
四、定时/计数器T/C0相关寄存器 ATmega16的8位定时/计数器T/C0用户可以控制: • TCCR0——T/C0控制寄存器 • TIMSK——T/C中断屏蔽寄存器 • TIFR——T/C中断标志寄存器 • TCNT0——T/C0计数寄存器 • OCR0——T/C0输出比较寄存器 • SFIOR——特殊功能寄存器
MSB LSB 7 6 5 4 3 2 1 0 T/C0计数寄存器 —— TCNT0 读写 复位值 T/C0是可以进行读/写访问的向上计数(加法计数)的计数器。 只要有有效脉冲输入,TCNT0就会在写入值(初值)的基础上开始计数。一旦TCNT达到0xFF,下一个计数脉冲到来时便回到0x00,并继续向上开始计数。在TCNT0回“0”的同时,溢出标志TOV0置“1”。 TOV0标志置“1”可以用于申请中断,也可以作为计数器的第“9”位使用。
7 6 5 4 3 2 1 0 T/C0输出比较寄存器 —— OCR0 读写 复位值 OCR0中的8位数据用于同TCNT0寄存器中的计数值进行连续的匹配比较。 如果TCNT0的值与OCR0相等,则比较匹配发生(比较匹配发生时,对应的定时/计数器输出引脚OC0会产生触发事件)。 比较匹配发生后,置“1”相应的中断标志OCF0。
T/C中断屏蔽寄存器 —— TIMSK 7 6 5 4 3 2 1 0 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 位1:T/C0输出匹配中断使能,为“1”时允许中断,为“0”时禁止中断。 位0:T/C0溢出中断使能,为“1”时允许中断,为“0”时禁止中断。
OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0 7 6 5 4 3 2 1 0 T/C中断标志寄存器 —— TIFR 读写 复位值 BIT1:OCF0, T/C0输出比较匹配中断标志。 BIT0:TOV0,T/C0溢出中断标志。 ATmega16的定时/计数器共有8个中断源——对应8个中断标志位,这些标志位当条件满足后,由硬件置“1”,中断响应后由硬件清“0”,也可以对这些位通过软件写“1”清“0”。
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 7 6 5 4 3 2 1 0 T/C0控制寄存器 —— TCCR0 位7:FOC0强制输出比较,该位只在WGM位被置为非PWM模式下有效。 位6、位3:计数器计数模式,用于控制T/C0的计数和工作方式。 位5~4:比较匹配输出模式,决定T/C0比较匹配发生时,输出引脚OC0(PB3)的行为方式。这是I/O的第二功能,相应的方向控制位要置“1”,以便将其配置为输出。 位2~0:T/C0的时钟选择位,用于定义T/C0的时钟源。
ADTS2 ADTS1 ADTS0 ----- ACME PUD PSR2 PSR10 7 6 5 4 3 2 1 0 特殊功能寄存器 —— SFIOR 读写 复位值 Bit0:PSR10,T/C1与T/C0预分频器复位。置位时T/C1与T/C0的预分频器复位。操作完成后这一位由硬件自动清零。写入零时不会引发任何动作。T/C1与T/C0共用同一预分频器,且预分频器复位对两个定时器均有影响。该位总是读为0。
五、硬件电路 段选线 位选线 共阳极 a b c d e f g dp QH QH QH 74LS164 74LS164 74LS164 74LS164 /CLR A B A B A B A B INT2 CLK INT1 PB0 PD3 PB1 PB2 ATmega16
【项目任务】 • 用ATmega16单片机实现一个60Hz的时钟发生器:四个LED数码管显示时间,最高计时可达9分59.9秒;当按下“开始/停止”键开始计时,再次按下时停止计时,LED显示静止。第三次按下时将继续上一次计时;当按下“复位”键时,系统复位,数码管显示为0,等待计时(开始、停止采用外部中断)。下面的参考程序运行并不完善,运行观察结果并进行修改。
【参考程序】 定时器0初始化: void time0_init() { CLI(); //关闭中断 TCCR0=0x04; //内部8M晶振,256分频 TCNT0=0x82; //4ms溢出一次,溢出25次100ms TIMSK=0X01; //溢出中断使能 SEI(); }
【参考程序】 #pragma interrupt_handler timer_ovf_isr:10 void timer_ovf_isr() //中断服务程序 { TCNT0=0x82; if(Flag) { msec_counter++; if(msec_counter>25) { dsec_counter++; msec_counter=0; } Seg_buff[0]=msec_counter; Seg_buff[1]=dsec_counter%10; dsec_counter1=dsec_counter/10; Seg_buff[2]=dsec_counter1%6; dsec_counter2=dsec_counter1/6; Seg_buff[3]=dsec_counter2%10; } }
【项目实施】 1、各小组内部进行小组分工,确定项目内容和实施计划,项目的内容要有创新点。 2、打开AVR Stdio软件建立AVR-ICC项目,编写程序,进行编译(数码管显示采用串行显示和并行显示均可,具体的时间控制和显示方式各小组自行确定,按键控制使用外部中断)。 3、编译无误,在线调试。使实训箱电源按钮处于关闭状态,IC锁紧座中放入ATmega16单片机,将DC9V/1A电源插头插入电源孔,将USB延长线接头与JTAG硬件仿真器相连接,同时将JTAG仿真器连在实训箱的JTAG接口。 4、将响应的显示和按键控制对应的拨码开关拨到ON位置。 5、按下实训箱电源开关,打开AVRstudio 4与实训箱单片机进行通信,将编译后的文件下载到实训箱单片机中,观察运行结果,运行结果达到实训要求实训完成。 6、实训完成后,切断实训箱电源,将拨动过的拔码开关拨回到原位置,将实训用到的跳线帽拔下,将实训用到的外部接线撤下,将实训用到的器件及连线完好的放回到实训箱储物阁中。 7、完成项目报告,就本组的项目进行总结。