51单片机c语言编程基础问题,我基础不太好,下面的程序里初始化函数和中断函数两段我看不太懂···

2024-10-29 05:51:25
推荐回答(5个)
回答1:

定时器0为16位!它的最大计数范围为2的16次方,也就是65536,可以把定时器比作一个水桶,如果这个桶是空的,那么它装满水需要65536滴水!也就是说它最多能定时65.536毫秒 ,当然前提是在12Mhz晶振下!假如说你只要定时10ms,那么你的桶里面必须要先装(65536-10000)滴水,这就是所谓的赋初值!假设我们从水池上面接上水管!往你桶里滴水,水管上有三个水龙头,有个总龙头!所有水管要出水,这个总龙头必须要打开,就是EA=1;然后你只是想让定时器0这个方向的水管出水,那就要把这个龙头打开,也就是ET0=1;然而你总得要出水出来吧,并且要知道它还能装多少水吧!所以你还得把最后要出水的这个龙头打开,TR0=1;然后你的水就一滴一滴的往你桶里去,当滴了10000滴后,它是不是就满了,你再滴是不是溢出了,溢出是不是就引起中断了,然后你是不是要把滴进来的水又倒掉!好让下一次的再滴!这是不是就是定时器中断里面的重新赋初值啊!很好理解的

回答2:

#include
#define uchar unsigned char
sbit P2_0=P2^0;
sbit key1=P3^4;
sbit key2=P3^5;
uchar abc,i;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0X01; ;定时器设置工作方式为1
TH0=(65536-10)/256; ;高八位设置初值
TL0=(65536-10)%256; ;低八位设置初值
EA=1; ;开总中断
ET0=1; ;开T0定时器
TR0=1; ;启动定时器
}
void keys01()
{

}
void main() //主函数

{
abc=2;
init();
while(1)
{
keys01();
}
}

void time0(void) interrupt 1 //中断程序
{

TH0=(65536-10)/256; //重装初值
TL0=(65536-10)%256; //重装初值
++i;
if(i>10)
{
i=0;
};

if(i<=zkb)
{
P2_0=1;
}
else P2_0=0;
}
我只能帮你回答这些了,有些我明白只是不知怎么表述!
多查查资料吧!祝你好运!

回答3:

65536是定时器溢出值,用它减去10就是定时器装入的初值,即65526,也就是说定时器每计数10下就进入了定时中断,执行中断服务函数。若是12MHz晶振,那么进入定时中断周期为10us,即频率为100KHz。其输出波形频率和 i 有关,i 最大值为10,所以输出脉冲波频率为10KHz。
zkb显然是“占空比”的汉语拼音缩写,那么这个函数的功能是输出一个占空比为zkb/10*100%大小的脉冲波形,其频率为10KHz。占空比可通过按键进行调节。

回答4:

范围是0-65535就是65536了,你说的是取整数给高位TH0,取余数给低字节TL0,

回答5:

就是65536-10个计数,分别将高八位和低8位赋予THO TLO