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

#include<reg52.h>#defineucharunsignedcharsbitP2_0=P2^0;sbitkey1=P3^4;sbitkey2=P3^5;uc... #include<reg52.h>
#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;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
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;
}
主函数部分我没问题所以上面略去了,麻烦来个高人指导一下上面初始化函数和中断函数这两段是什么意思,谢谢
==============
中断函数部分刚才想明白了。
但是前面的初始化函数那几行65536什么的不懂什么意思·········
展开
 我来答
百度网友eff8e75
2012-05-14 · 超过31用户采纳过TA的回答
知道答主
回答量:140
采纳率:0%
帮助的人:67.9万
展开全部
定时器0为16位!它的最大计数范围为2的16次方,也就是65536,可以把定时器比作一个水桶,如果这个桶是空的,那么它装满水需要65536滴水!也就是说它最多能定时65.536毫秒 ,当然前提是在12Mhz晶振下!假如说你只要定时10ms,那么你的桶里面必须要先装(65536-10000)滴水,这就是所谓的赋初值!假设我们从水池上面接上水管!往你桶里滴水,水管上有三个水龙头,有个总龙头!所有水管要出水,这个总龙头必须要打开,就是EA=1;然后你只是想让定时器0这个方向的水管出水,那就要把这个龙头打开,也就是ET0=1;然而你总得要出水出来吧,并且要知道它还能装多少水吧!所以你还得把最后要出水的这个龙头打开,TR0=1;然后你的水就一滴一滴的往你桶里去,当滴了10000滴后,它是不是就满了,你再滴是不是溢出了,溢出是不是就引起中断了,然后你是不是要把滴进来的水又倒掉!好让下一次的再滴!这是不是就是定时器中断里面的重新赋初值啊!很好理解的
滩那手r
推荐于2017-10-06 · 超过35用户采纳过TA的回答
知道答主
回答量:89
采纳率:0%
帮助的人:71.2万
展开全部
#include<reg52.h>
#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;
}
我只能帮你回答这些了,有些我明白只是不知怎么表述!
多查查资料吧!祝你好运!
追问
TH0=(65536-10)/256;    ;高八位设置初值
TL0=(65536-10)%256; ;低八位设置初值
这两个能详细说明一下吗?以前学过有点印象但是忘了具体是怎么回事了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qqylh
2012-05-14 · TA获得超过321个赞
知道小有建树答主
回答量:123
采纳率:0%
帮助的人:155万
展开全部
65536是定时器溢出值,用它减去10就是定时器装入的初值,即65526,也就是说定时器每计数10下就进入了定时中断,执行中断服务函数。若是12MHz晶振,那么进入定时中断周期为10us,即频率为100KHz。其输出波形频率和 i 有关,i 最大值为10,所以输出脉冲波频率为10KHz。
zkb显然是“占空比”的汉语拼音缩写,那么这个函数的功能是输出一个占空比为zkb/10*100%大小的脉冲波形,其频率为10KHz。占空比可通过按键进行调节。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-05-14
展开全部
范围是0-65535就是65536了,你说的是取整数给高位TH0,取余数给低字节TL0,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sunnyjaky
2012-05-14 · 超过25用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:60.5万
展开全部
就是65536-10个计数,分别将高八位和低8位赋予THO TLO
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式