单片机C语言程序,大神快来解释,为什么灯不亮,蜂鸣器不响?

#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#definet1_h(65536-5000... #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define t1_h (65536-50000)/256
#define t1_l (65536-50000)%256
#define t0_h (65536-1000)/256
#define t0_l (65536-1000)%256
sbit beep=P2^3;//蜂鸣器
sbit D1=P1;//灯
uint f0,f1;//标志

void init()//初始化
{
TMOD=0x11;
TH1=t1_h;
TL1=t1_l;
TH0=t0_h;
TL0=t0_l;
EA=1;
ET0=1;
ET1=1;
}

void inittro()//初始化定时器t0
{
TR0=0;
TH0=t0_h;
TL0=t0_l;
f0=0;
}
void main()
{
init();
TR1=1;
while(1)
{
if(f1<100)//1ms
{
TR0=1;
if(f0==1)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
inittro();
if(f1<200&&f1>=100)//5ms周期
{
TR0=1;
if(f0==5)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
inittro();
if(f1<300&&f1>=200)//10ms周期
{
TR0=1;
if(f0==10)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
inittro();
if(f1<400&&f1>=300)//50ms周期
{
TR0=1;
if(f0==50)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
inittro();
if(f1<500&&f1>=400)//100ms周期
{
TR0=1;
if(f0==100)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
inittro();
if(f1<600&&f1>=500)//500ms周期
{
TR0=1;
if(f0==500)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
inittro();
if(f1<700&&f1>=600)//1000ms周期
{
if(f1==700)
f1=0;
else
{
TR0=1;
if(f0==1000)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
}
inittro();
}
}

void timer0() interrupt 1
{
TH0=t0_h;//赋初值
TL0=t0_l;
f0++;
}

void timer1() interrupt 3
{
TH1=t1_h;//赋初值
TL1=t1_l;
f1++;
}
展开
 我来答
Cindere鞡
2013-08-09 · TA获得超过7251个赞
知道大有可为答主
回答量:1148
采纳率:84%
帮助的人:500万
展开全部
你好,
首先问个问题,你这程序是要实现什么功能。
然后,不管你要实现什么,先要明白一点,定时器1是每50ms中断一次,也就是f1要每50ms自增一次,在
if(f1<100)//1ms
{
TR0=1;
if(f0==1)
{
f0=0;
beep=~beep;
D1=~D1;
}
}的条件下,就是在50s内,都只会执行这个if语句;每执行一次都会进入这个if,启动定时器0,而定时器0是每1ms中断一次,但执行这个if里边的程序只需要几十微妙,也就是说,还没等f0自增,这些程序就执行完了,而在这个程序执行完了之后,你又对定时器0进行了初始化,这样就导致在时间无限长的条件下,能进入每一个if(f1<)语句,但是不能进入if(f0==?)这个语句,从而LED不亮,蜂鸣器不响。
有不懂的地方随时回复我。
希望我的回答能帮助到你。
宿兴电子
2024-10-18 广告
联系我们蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H... 点击进入详情页
本回答由宿兴电子提供
百度网友3fe025987
2013-08-09 · TA获得超过1874个赞
知道小有建树答主
回答量:1055
采纳率:62%
帮助的人:541万
展开全部
 		if(f1<100)//1ms
{
TR0=1;
if(f0==1)
{
f0=0;
beep=~beep;
D1=~D1;
}
}
这样写有问题,f0 = 1的 时候往下执行,f0还没到1的时候,if(f0 == 1)这句判断应该早就做完了。所以 f0 = 1 的时候,程序执行到其他地方了,下面也是相同的情况
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式