“T0中断服务程序不是一个子程序吗?但没看见在主程序中调用这个子程序啊,求讲解这个程序命令的运行过程,定时器怎么中断的?”
该子程序是在硬件产生中断的时候,跳转到相应中断入口后,再跳转到这个中断服务程序的。请注意函数后面的“interrupt x”声明,这是C51的扩展内容。
“用示波器测波形是测p1.0引脚,为什么是这个引脚,怎么确定的?p1_0不是个变量名吗?”
P1_0这个符号在前面的头文件 t89c51cc02.h 中有定义。至于“为什么是这个引脚”,是由硬件设计及本程序共同确定的。P1_0(不是你写的p1_0,C语言要区分大小写哦)代表P1口的第0管脚,在头文件中通过sbit定义。
“为什么T0中断服务程序和主程序中都有T0的初值,设置还是一样,他们有什么关系?”
主程序前面的是对Timer0初始化,赋以初值。执行 TR0 = 1; 这一句以后,Timer0就开始运行了——TL0与TH0组成的13位计数器开始不断递增。当13位全部为1之后,再递增就全部为0,此时溢出事件会触发产生定时器0,同时计数器仍然在继续计数——为了让时间间隔保持一致,就需要再度将计数器赋以初值。
1.T0定时器中断不用再程序中调用,当定时器溢出时自动申请中断,是硬件触发的。
2.KEIL中,p1_0表示P1.0,这是一个“位”变量
3.T0溢出后,如果不继续赋初值,那么将从0开始计数,所以为了保证每次定时一致,中断
服务程序里面必须重新赋值。
4.pk记录中断次数,p没什么意义。TMOD ET0 EA TR0 TL0 TH0是单片机的关键字,可以查书
针对你的问题
1 中断服务程序不需要在用户程序中调用,硬件自动处理,因为每个中断服务程序在编译的时候都会指定入口,这个入口是硬件规定死的,决定入口地址的就是中断函数的interrupt 后面那个数
2 联系你在这个变量p1_0上面点右键,goto definition of 。。。找到它的定义,最终应该是P1^0或者是对应端口寄存器
3 主程序中只要给值就行,起决定作用的是中断中的。由于你设定TMOD为0,是13位定时器,不会自动重装载,因此必须每次中断后手动赋值。
4 这俩东西我觉得没用,主程序中那个loop不如用一个while(1)代替
主程序首先设置中断,这样满足条件时主程序中断,执行中断服务程序,完成后继续执行主程序。中断有优先级。单片机编程需要了解一些硬件方面的知识。P1_0是一个位变量对应单片机的P1口的第一位,这个是在头文件定义的,当然你也可以自己定义。pk,p就两个全局变量,和硬件没关系,中断累计pk,主程序清零。主程序的T值启动时起作用,因为中断程序修改了,所以它就起作用一次。为啥中断修改呢?波形宽度可变的。中断的简单解释:你在做一件事,来了个电话,放下,处理电话,完了继续做这事。