百炼成神精校:求一小段程序中关于中断的解释(单片机)

来源:百度文库 编辑:高考问答 时间:2024/04/29 03:02:32
#include <io8515.h>
#pragma interrupt_handler Icp_timer1:4 // 设置ICP中断
/* 七段译码字形表 */
const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/* 显示缓冲区 */
unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
unsigned int oldcount;
unsigned int newcount;
/******************************
1ms延时程序
******************************/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<1142;i++)
;
}
/******************************
六路动态扫描显示电路
******************************/
void display(void)
{
unsigned char i;
for (i=0;i<6;i++)
{
PORTB=ledbuff[i]; //将显示缓冲区数据送PORTB口
PORTD=~(1<<i); //开始显示
delay_1ms(); //每一位显示保持一定时间
PORTD|=(1<<i); //关闭显示
}
}
/************************************
将count十六进制数据转换为LED七段码
************************************/
void hextobcd(unsigned int count)
{
unsigned char i,temp;
for (i=0;i<6;i++)
{temp=count%10; //a%10=?
ledbuff[i]=tabel[temp];
count=count/10; //??
}
}
/******************************
MCU初始化
******************************/
void mcu_init(void)
{
DDRD=0x3f;
DDRB=0xff;
PORTD=0xff;
PORTB=0xff;//端口初始化
TIMSK =0x08;//使能T1捕捉中断
TCCR1A=0x00;
TCCR1B=0xC2;//CK/8,捕捉周期的单位为1us
ICR1=0;
TCNT1=0;
}
/************************************************
主程序:测量ICP引脚上信号的周期
************************************************/
void main()
{
mcu_init();
SREG|=0x80; //使能全局中断
for(;;)
{
if ((newcount&0xfff8)!=(oldcount&0xfff8))
{
oldcount=newcount;
} //if语句的作用是什么?并没有对newcount和oldcount进行付值?
hextobcd(oldcount);
display(); //显示测量值
}
}
/**************************************
捕捉中断处理程序
**************************************/
void Icp_timer1(void)
{
newcount=ICR1;
ICR1=0;
TCNT1=0;
TCCR1B=0xC2;
}

请问主程序中if语句的作用是什么?

为什么没有对newcount和oldcount进行付值?

主程序是怎样进入中断的?
在MCU初始化函数中有TIMSK =0x08;
使定时器/计数器1输入捕获事件中断触发

请问什么叫输入捕获事件?
在这段程序中哪条语句与输入捕获事件有关?

newcount的赋值是在Icp_timer1中进行的,中断是单片机自动触发的,这是一个定时器中断,当定时器触发时,主程序的无限循环会被系统暂停,系统会根据中断向量调用中断服务函数Icp_timer1,在Icp_timer1中,会对newcount进行更改。中断是单片机自动调用的,不需要自己调用,也不需要关心中断什么时候发生。

主程序if的作用是判断newcount和oldcount是否相等(实际是判断了&ffff8的结果是否相等,忽略低3位判断是否相等),如果不相等,就把newcount的值给oldcount,然后把oldcount显示出来,由于是动态扫描方式显示,所以用了一个无限循环,而且在测量值变化的时候才更新oldcount。