else
{
val-=5
P0=val//通过P0口给DA数据口赋值
if(val==0)
{
flag=0
beep=0
delayms(100)
beep=1
}
delayms(50)
}
/********//p1.0波形为:
//1、10ms为周期的方波或持续的高、低电平(与flag、p1.0初始值有关),持续2秒。
//2、持续的高、低电平或10ms为周期的方波(与flag、p1.0初始值有关),持续2秒。
//3、重复1、2步骤。
*********/
#include
unsigned
int
t02s
unsigned
char
t05ms
bit
flag
void
main(void)
{
tmod=0x01
//初始化定时器。
//可以对照单片机pdf相应章节,按位对比。
//此处设置定时器0工作于“16
位定时器/
计数器,tl0、th0
全用”模式。
th0=(65536-500)/256
//初始化定时/计数器高字节。
tl0=(65536-500)%256
//初始化。。。。。。低字节。
tr0=1
//启动定时器0。
//以下两句开启定时器中断,缺一不可。
et0=1
//允许定时器0中断。
ea=1
//开启全局中断。
while(1)
//循环,整个程序交由定时中断控制。
}
//此处为定时器中断子程序,每次定时器溢出,进入此段程序。
//根据参数定义,每5ms中断一次。
//定时器中断后,计数不停止,但是需要重新初始化定时/计数器。
void
t0(void)
interrupt
1
using
0
{
//重新“初始化定时/计数器”高、低字节。
th0=(65536-500)/256
tl0=(65536-500)%256
//每次中断,t02s
加
1。
t02s++
//增加400次后(5ms
×
400
=
2s),flag标志取反。
if(t02s==400)
{
t02s=0
flag=~flag
}
//若中断时flag标志为0,p1.0口取反。
if(flag==0)
{
p1_0=~p1_0
}
}
“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,同时计数器仍然在继续计数——为了让时间间隔保持一致,就需要再度将计数器赋以初值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)