开题首要贴上一段操练中遇到的代码:
/*1:使用守时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪耀,设晶振频率为12MHz。*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit P1_1=P1^0;
uchar time;
void main()
{
time=0;
TMOD=0x01;////设置守时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中止
ET0=1;//开守时器0中止
TR0=1;//发动守时器0
while(1);//等候中止发生
}
void T1_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==20)
{
time=0;
P1_1=~P1_1;
}
}
hit:
在学习单片机的时分很简单依照C言语编程的格局来了解,程序在翻开中止之后会一向停留在while(1);傍边,但在实际上,程序确实会停留在while(1);里,因为敞开了中止开关而并未封闭,所以T0持续计数,所以后边一向会有中止。
进程能够了解为这样,程序一向在while(1);傍边,直到守时器计满发生中止;
发生中止后,履行中止程序,守时器从头赋值,time自加1;
回到while(1)中,等候下一次中止,守时器持续计数。
单片机怎样从主函数跳到中止函数中:
关于单片机的硬件,你了解吗?时钟和CPU是独立的,时钟中止程序时这样的:在CPU履行指令时,计数器(计时器)一起在计时,当计时器溢出时,就向CPU请求中止,假如答应呼应中止,CPU就转到中止服务程序履行相关的程序。
单片机的时钟中止相应要满意两个条件:榜首,答应中止源请求中止。第二,答应cpu呼应中止。二者缺一不可。 EA=1;//开总中止
ET0=1;//开守时器0中止
ET1=1;
TR0=1;//发动守时器0
TR1=1;
你这些句子,就答应了中止呼应,所以,当你的程序跑起来时,时钟时刻到了,CPU就转入中止服务程序了,履行完了再回来主程序。你能够在编译器顶用DEBUG检查履行进程的。假如你用汇编言语写,就更清楚了,能够看清每一步的操作的。
硬件部分是这样:在每个机器周期的S5P2,单片机会来采样,判别是否有中止请求。所以一旦时钟计数溢出,就会转入中止服务程序。
这个打个比如吧,你在上课,相当于主程序,这时时刻到了,打铃下课了,你就不读书了,跑出去玩了。这其实是相同的道理。你在上课,这和打铃不相关,并不是你让打铃的,校园的时钟在不停地走,到了时刻主动打铃,这不受你上课的影响的。可是假如你把耳朵堵上了(不答应呼应中止),便是把铃打碎了你也不知道下课了,所以你就一向读书。