实验三实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[实验三]定时器的应用
[实验目的]
1.结合定时/计数器的应用,更深入的了解AVR中断系统原理,响应过程,以及中断服务
程序的编写。
2.掌握定时器的基本应用,了解定时器的各种用途
[基本实验内容]:
根据需要给出电原理图和程序清单。
1.了解CTC的用途,通过定时器的CTC实现LED的定时闪烁,定时时间1S。
/*****************************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include
bit time_1s_ok=0;
int time_counter=0;
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
if(time_counter>=500)
{time_counter=0;
time_1s_ok=1;
}
}
void main(void)
{
PORTC=0x01; // 显示控制I/O口初始化
DDRC=0x01;
TCCR0=0x0B; //内部时钟,64分频
TCNT0=0x00;
OCR0=0x7C;
//OCR0=0x7c(124),(124+1)/62.5KHz=2ms
TIMSK=0x01; //允许T/C0比较比配中断
#asm("sei")
while (1)
{
if(time_1s_ok){
time_1s_ok=0;
PORTC=~PORTC;
}
};
}
2.阅读器件手册,查阅定时器相关寄存器,通过使用定时器改写P188页的例6.7中的点阵LED箭头移动程序。箭头运动速度保持与原来相同。
/*********************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include
#define row 12
#define speed 25*8 //移动速度调节
flash unsigned char char_7[row]={0x10,0x38,0x7C,0xFE,0x38,0x38,0x38,0x38,0x 00,0x00,0x00,0x00};
bit time_1ms_ok;
unsigned char dis_buff[8];
interrupt [TIM0_COMP] void timer0_comp_isr(void) // 1ms 中断一次
{
time_1ms_ok = 1;
}
void display(void)
{
static unsigned char i;
PORTC = 0xFF;
PORTA = dis_buff[i];
PORTC = ~(1<
if (++i>= 8 ) i = 0;
}
void main(void)
{
unsigned char move_speed,i,j;
PORTA=0x00;
DDRA=0xFF;
PORTC=0xFF;
DDRC=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock,Clock value: 62.500 kHz
// Mode: CTC top=OCR0, OC0 output: Disconnected
TCCR0=0x0B;
TCNT0=0x00; OCR0=0x3D;
TIMSK=0x02; //允许T/C0 CTC中断
#asm("sei") // 开全局中断
for (i=0;i<=8;i++) {dis_buff[i] = char_7[i];}
j = 8;
while (1)
{
if (time_1ms_ok)
{ time_1ms_ok = 0;
display();
if (++move_speed>= speed)
{
move_speed = 0;
for (i=0;i<=6;i++)
{
dis_buff[i] = dis_buff[i+1];
}
if (++j>= row) j = 0;
dis_buff[7] = char_7[j];
}
}
}p
}