51单片机C语言程序

#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharuinta;voidb1();voidb2(... #include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint a;
void b1 ();
void b2 ();
sbit t=P1^0;
sbit k=P3^5;
sbit reg=P3^3;
sbit bice=P3^2;

void main()
{
P3=0xff;
while (1)
{
if(k==0)
{
while(!k);
bice=0;
b1();

if(k==0)
{

bice=1;
b2();

}
}
else
bice=1;

}

}

void b1()

{
while(1)
{
a=50000;
P1=0xfe;
while(a--);
a=50000;
while(a--);
P1=0xff;
while(a--);
a=50000;
while(a--);

}
}
void b2 ()

{
while(1)
{
a=30000;
P1=0xfe;
while(a--);
a=30000;
while(a--);
P1=0xff;
while(a--);
a=30000;
while(a--);

}
}这是小弟写的一个程序,K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,我现在是想按第一次触动开关时红灯亮、b1输出,按第二次绿灯亮、为b2输出,按第三次都关闭,小弟是个初学者,现在自己学习写到了半夜还是不会写,请那位好心人帮帮忙,上面写的我试了不行,
展开
 我来答
做而论道
高能答主

推荐于2016-05-20 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
//你原来的b2,b2都是死循环,这是不行的,只有主函数才可以死循环。
//你的主函数结构也有问题。
//为你增加了一个按键检测的函数。
//下列程序通过了实验测试。
//b1输出的周期大约0.9s。
//b2输出的周期大约0.6s。

//K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,
//按第一次触动开关时红灯亮、b1输出,
//按第二次绿灯亮、为b2输出,
//按第三次都关闭.

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint a;
void b1();
void b2();
sbit t = P1^0;
sbit k = P3^5;
sbit reg = P3^3;
sbit bice = P3^2;

void delay(uchar z)
{
uint x,y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}

bit key()
{
bit kkk;
kkk = k; //读入按键.
if(kkk == 1) return 0;//没有按下.
delay(5); //延时.
if(k == kkk) return 1;//两次相等.
return 0;
}

void main()
{
while(1) {
P3 = 0xff;
while(!key()); //静等按下第一次.
reg = 0;
bice = 1;
while(!key()) b1(); //没有按下第二次就循环等待.
reg = 1;
bice = 0;
while(!key()) b2(); //没有按下第三次就循环等待.
}
}

void b1()
{
P1 = 0xfe; a = 50000; while(a--);
P1 = 0xff; a = 50000; while(a--);
}
void b2()
{
P1 = 0xfe; a = 30000; while(a--);
P1 = 0xff; a = 30000; while(a--);
}
lu1009162033
2010-02-09 · TA获得超过300个赞
知道小有建树答主
回答量:335
采纳率:0%
帮助的人:344万
展开全部
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint a;
void b1 ();
void b2 ();
sbit t=P1^0;
sbit k=P3^5;
sbit reg=P3^3;
sbit bice=P3^2;

void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
}

void main()
{
P3=0xff;
while (1)
{
if(k==0)
{
while(!k);
bice=0;
b1();
while(k);
delay(5);

//这里应该有个延时,因为你不知道按键按了多长时间
if(k==0)
{
while(!k); //+一句这个
bice=1;
b2();

}
else
bice=1;
}
}

void b1()

{
while(1)
{
a=50000;
P1=0xfe;
while(a--);
a=50000;
while(a--);
P1=0xff;
a=50000; //你望了个这个
while(a--);
a=50000;
while(a--);
}
}
void b2 ()

{
while(1)
{
a=30000;
P1=0xfe;
while(a--);
a=30000;
while(a--);
P1=0xff;
a=30000; ////你望了个这个
while(a--);
a=30000;
while(a--);
}
}

你这里的按键有点问题,其他的没什么大问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友74c9ab2
2010-02-09 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:108
采纳率:0%
帮助的人:83.1万
展开全部
朋友大体看懂你的逻辑。。。你的问题就出在void main()里,里面主要是判断按下第几次的,你在对K是否为0,1上进行了判断套用,我没仔细研究你的程序究竟会走成什么样,但是肯定是错的,方法就用错了
介意用计数器进行判断次数,如果你还没看到计数器这块知识,你随便找个教程翻下目录,看下计数器是怎么用。
方法错了所以也没法指出你程序错在哪里,算是抛砖引玉吧,祝你成功
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式