我想用单片机(89c51)来实现两个函数程序的同时运行,不知如何实现?请教广大朋友,谢谢
#include<reg51.h>sbitgreen=P2^0;sbitblue=P2^1;sbitred=P2^2;sbitshan=P1^0;sbitshan2=P1...
#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口的灯都在闪烁,就是渐亮渐暗跟闪烁的灯都同时显示出来。程序可以怎样改?
我听说过分时控制可以达到我同时显示出来的效果,但我找很少到单片机有关分时控制的资料,找到都看不明白。
我先谢谢各位啦 展开
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();
}
}
这个循环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();
}
}
展开全部
单片机能做分时控制吗?这个好像涉及到多个线程了恐怕,单片机恐怕这种过程模式无法同时处理多个过程的。这个具体的等待高人做进一步解释。
就你现在想实现的功能,可以在主程序放那个渐亮渐暗的,然后用计数器计数,用中断来控制另外一个灯的亮和灭。
就你现在想实现的功能,可以在主程序放那个渐亮渐暗的,然后用计数器计数,用中断来控制另外一个灯的亮和灭。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以构建个UC/OS系统,然后把你的程序移植到上面去,这样应该可以实现多线程了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个问题好
1
1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询