单片机c语言语程序解释?

单片机c语言语程序解释?,第1张

程序运行时应该会先执行这一句:在这里赋值。

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,同时计数器仍然在继续计数——为了让时间间隔保持一致,就需要再度将计数器赋以初值。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11359201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存