我想用单片机(89c51)来实现两个函数程序的同时运行,不知如何实现?请教广大朋友,谢谢

#include<reg51.h>
sbit green=P2^0;
sbit blue=P2^1;
sbit red=P2^2;
sbit shan=P1^0;
sbit shan2=P1^1;
void delay(int i)
{
while(--i)
{
;
}
}
void bianse(void)//这个函数程序是控制灯渐亮渐暗
{
int i,j;
for(i=1;i<2000;i=i+100)
{
for(j=0;j<1;j++)
{
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//红,绿,蓝一起上升
}
}
for(i=2000;i>0;i=i-100)
{
for(j=0;j<1;j++)
{
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//红蓝绿下降
}
}

}
void shanshuo(void)//这个函数程序是控制灯闪烁
{
int i,k;
for(k=0;k<10;k++)
{
shan=0;
delay(5000);
shan=1;
delay(4000);
}
for(i=0;i<10;i++)
{
shan2=0;
delay(5000);
shan2=1;
delay(4000);
}
}

void main(void)
{
while(1)
{
bianse();
green=1;
blue=1;
red=1;
shanshuo();
}
}
我的程序如上,按照以上程序运行起来的时候是先把P2口的灯先渐亮渐暗完后才轮到P1口的灯闪烁,但我想改变一下方式,就是P2口的灯渐亮渐暗的同时,P1口的灯都在闪烁,就是渐亮渐暗跟闪烁的灯都同时显示出来。程序可以怎样改?
我听说过分时控制可以达到我同时显示出来的效果,但我找很少到单片机有关分时控制的资料,找到都看不明白。
我先谢谢各位啦

你这个应该是两个功能同时实现,渐亮渐暗是用延时实现的PWM,而灯的闪烁其实就是单片机的输出为矩形波,两个功能同时实现时,就是在矩形波的波峰波谷时期加入了PWM。两个波形的叠加(将两个功能柔和在一起)。在灯渐亮渐暗子程序中,一个for循环for(i=1;i<2000;i=i+100)其实就是一个PWM的周期,是相同的、一定的,那么就可以利用判断是第几个周期来决定该周期是否要闪烁,还是关闭(也就是利用了PWM的周期来确定矩形波的周期)。
这个循环for(j=0;j<1;j++)是不是可以去掉呢。。。。。。。。
修改后的程序:调试过了(灯的端口改为P0了)
#include<reg51.h>
sbit green=P0^0;
sbit blue=P0^1;
sbit red=P0^2;
sbit shan=P0^3;
sbit shan2=P0^4;
void delay(int i)
{
while(--i)
{
;
}
}
void bianse1(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan=~shan; /*经过200个PWM周期灯的亮灭交替,改变这个参数可以改变灯的闪烁频率*/
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//红,绿,蓝一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan=~shan;
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//红蓝绿下降
}

}
void bianse2(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan2=~shan2;
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//红,绿,蓝一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan2=~shan2;
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//红蓝绿下降
}

}
void shanshuo(void)//这个函数程序是控制灯闪烁
{
int i,k;
for(k=0;k<10;k++)
{
shan=0;
delay(5000);
shan=1;
delay(4000);
}
for(i=0;i<10;i++)
{
shan2=0;
delay(5000);
shan2=1;
delay(4000);
}
}

void main(void)
{
shan=1;
shan2=1;
while(1)
{
bianse1();
bianse2(); /*****两个灯的交替闪烁*****/
green=1;
blue=1;
red=1;
//shanshuo();
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-09-08
单片机能做分时控制吗?这个好像涉及到多个线程了恐怕,单片机恐怕这种过程模式无法同时处理多个过程的。这个具体的等待高人做进一步解释。
就你现在想实现的功能,可以在主程序放那个渐亮渐暗的,然后用计数器计数,用中断来控制另外一个灯的亮和灭。
第2个回答  2010-09-15
你可以构建个UC/OS系统,然后把你的程序移植到上面去,这样应该可以实现多线程了。
第3个回答  2010-09-08
这个问题好
1

单片机工作总结
10. 如果有可能,多学习一下计算机专业的课程,例如数据结构,毕竟单片机与程序的设计也是不能分开的,这是一个综合的科目。 11. 面对一个新的项目,要先自己想下怎么做,而不是单单地找别人的代码,这是很重要的,因为只有这样做,自己才能独立去思考一个新的东西,也更有可能创造出一个更好的程序。 有时候单片机的...

程序设计中的指令是什么?有哪几种?
高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类: 解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但...

木马的工作原理是什么?
2、在注册表中的情况最复杂,在点击至:“HKEY-LOCAL-MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run”目录下,查看键值中有没有自己不熟悉的自动启动文件,扩展名为EXE,这里切记:有的“木马”程序生成的文件很像系统自身文件,想通过伪装蒙混过关,如“AcidBatteryv1.0木马”,它将注册表“HKEY-LOCAL-MACHINE\\SOFT...

JAVA是什么意思?
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上...

我QQ被朋友盗了,可过了很多天都找不到他,我想盗回来,顺便把他的也盗掉...
2、登录窗口破解 伪造QQ登录窗口的盗号方法非常简单,这是一种比较另类的木马破解方法(后面对木马破解有专门讲述)。先用盗号软件生成一个伪装的QQ主程序,它运行后会出现跟腾讯QQ一模一样的登录窗口,只要用户在这个伪登录窗口中登录,输入的QQ号及密码就会被记录下来,并通过电子邮件发送到盗号者指定的...

高科技:请问用电脑远程控制人的思想的原理及相关知识
2. 上面的身体机能干扰是指:在被植入者知道或不知道的情况下,在他的皮下、肌肉、内脏、血管内以及脑部放置微型治疗性药物缓释装置(医疗)或控制性药物投放装置(自杀或自残)或脑电波干扰装置(简单的行为控制)等。3. 这类身体机能控制或干扰,目前一般只能进行简单的人的行为和生命的控制,却不可能...

c++编译出来的程序不是直接运行在windows下的吗? 为什么又有c++运行...
因为你的程序链接的库是动态链接库,C++运行时的作用是在没有开发环境的计算机上提供同样的动态链接库

什么是中断?
中断的意思如下:1、中断,是一种法律法规术语,是指在诉讼时效期间进行中,因发生一定的法定事由,致使已经经过的时效期间统归无效,待时效中断的事由消除后,诉讼时效期间重新起算。2、中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理...

CS详细介绍
2.游戏CS起源 在1998年之前,相信几乎没有人知道世界上存在着一个名叫Valve 的游戏开发小组,然后在经历了1998年那个令人难忘的E3之夏后,相信几乎没有玩家会不知道它的名字:《半条命》所带来的震撼感觉使一些挑剔者也不得不承认它是一款具有强烈感染力的游戏,同时《半条命》获得了超过40家媒体一致公认的“年度最佳游...

C语言和C++的区别
1、面向不同 C语言是面向过程的,C++是面向对象的。函数库 C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;C++对于大多数的函数都是有集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的组合,是一个集体。但你也可能单独调用API。3...

相似回答