早教吧 育儿知识 作业答案 考试题库 百科 知识分享

单片机怎么从主函数跳到中断函数中例如:#include#defineuintunsignedint#defineucharunsignedcharsbitdula=P2^6;sbitwela=P2^7;sbitd1=P1^0;ucharnum,num1;tt;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

题目详情
单片机怎么从主函数跳到中断函数中
例如:
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num,num1;tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
num=0;
tt=0;
TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
// EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
wela=1;//11101010
P0=0xea;
wela=0;
dula=1;
P0=0x3f;
dula=0;
while(1)
{
if(num1==25)
{
num1=0;
P1=~P1;
}
if(tt==100)
{
tt=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
void time1() interrupt 3
{
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
num1++;
}
我一不懂直搞!主函数怎么跳到定时器1中
主函数又 没有调用定时的函数~
▼优质解答
答案和解析
对于单片机的硬件,你熟悉吗?时钟和CPU是独立的,时钟中断程序时这样的:在CPU执行指令时,计数器(计时器)同时在计时,当计时器溢出时,就向CPU申请中断,如果允许响应中断,CPU就转到中断服务程序执行相关的程序.
单片机的时钟中断相应要满足两个条件:第一,允许中断源申请中断.第二,允许cpu响应中断.二者缺一不可.EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
你这些语句,就允许了中断响应,所以,当你的程序跑起来时,时钟时间到了,CPU就转入中断服务程序了,执行完了再返回主程序.你可以在编译器中用DEBUG查看执行过程的.如果你用汇编语言写,就更清楚了,可以看清每一步的操作的.
硬件部分是这样:在每个机器周期的S5P2,单片机会来采样,判断是否有中断申请.所以一旦时钟计数溢出,就会转入中断服务程序.
这个打个比方吧,你在上课,相当于主程序,这时时间到了,打铃下课了,你就不读书了,跑出去玩了.这其实是一样的道理.你在上课,这和打铃不相关,并不是你让打铃的,学校的时钟在不停地走,到了时间自动打铃,这不受你上课的影响的.但是如果你把耳朵堵上了(不允许响应中断),就是把铃打碎了你也不知道下课了,所以你就一直读书.不知你明白没?
看了 单片机怎么从主函数跳到中断函...的网友还看了以下: