OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5263|回复: 7

51单片机led流星雨程序小问题

[复制链接]

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-3-25
在线时间
1 小时
发表于 2015-11-1 11:17:36 | 显示全部楼层 |阅读模式
5金钱
从网上找到一个单片机led流星雨的程序,将其修改为8个led流星雨后出现小问题:当点亮最后一个led7时,led7并不是从亮到暗慢慢调节下来,而是很快熄灭.......百思不得其解,求大侠!(程序看上去很长,其实是很多重复的)


[mw_shl_code=c,true]#include<reg52.h>//MCU头文件 #define uchar unsigned char//字浮型宏定义 #define uint unsigned int//整型宏定义 #define shudu 10 //流水速度 uchar pwm0 =3; //亮度级别 uchar pwm1 =8; // uchar pwm2 =14; // uchar pwm3 =21; // uchar pwm4 =29; // uchar pwm5 =38; // uchar pwm6 =48; // uchar pwm7 =64; // sbit led0=P1^0;//16个IO口 sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit led4=P1^4; sbit led5=P1^5; sbit led6=P1^6; sbit led7=P1^7; //sbit led8=P2^0; //sbit led9=P2^1; //sbit led10=P2^2; //sbit led11=P2^3; //sbit led12=P2^4; //sbit led13=P2^5; //sbit led14=P2^6; //sbit led15=P2^7; uchar d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15;//各IO口变量 /***************************************************/ /**********************延时子程序*******************/ /***************************************************/ void delay(uint z) { uint x,y;//局部变量定义 for(x=0;x<3;x++)//延时外循环 for(y=0;y<z;y++);//延时内循环 } /**********************************************/ /**********PWM控制红绿兰3种灯亮灭时间**********/ /**********************************************/ //,uchar d8,uchar d9,uchar d10,uchar d11,uchar d12,uchar d13,uchar d14 void RGBpwm(uchar d0,uchar d1,uchar d2,uchar d3,uchar d4,uchar d5,uchar d6,uchar d7)//3个局部 变量,些部分为带参数函数 { if(d0!=0) { led0=0; //点亮led delay(d0); led0=1;//1 } if(d1!=0) { led1=0; delay(d1); led1=1;//1 } if(d2!=0) { led2=0; delay(d2); //2 led2=1; } if(d3!=0) { led3=0; delay(d3); led3=1;//3 } if(d4!=0) { led4=0; delay(d4); led4=1;//4 } if(d5!=0) { led5=0; delay(d5); led5=1;//5 } if(d6!=0) { led6=0; delay(d6); led6=1;//6 } if(d7!=0) { led7=0; delay(d7); led7=1;//7 } // if(d8!=0) // { // led8=0; // delay(d8); // led8=1;//8 // } // if(d9!=0) // { // led9=0; // delay(d9); // led9=1;//9 // } // if(d10!=0) // { // led10=0; // delay(d10); //10 // led10=1; // } // if(d11!=0) // { // led11=0; // delay(d11); // led11=1;//11 // } // if(d12!=0) // { // led12=0; // delay(d12); // led12=1;//12 // } // if(d13!=0) // { // led13=0; // delay(d13); //13 // led13=1; // } // if(d14!=0)//14 // { // led14=0; // delay(d14); // led14=1; // } // if(d15!=0)//15 // { // led15=0; // delay(d15); // led15=1; // } } /***********************************************/ /********************主程序*********************/ /***********************************************/ void main() { TMOD=0x01; EA=1; ET0=1; TR0=1; TH0=(65536-1100)/256; TL0=(65536-1100)%256; P3=0; while(1)//程序主循环 { // ,d8,d9,d10,d11,d12,d13,d14 RGBpwm(d0,d1,d2,d3,d4,d5,d6,d7);//调用RGBpwm子程序 } } /*************************************************/ /*中断服务子程序(控制LED红绿兰亮灭时间占空比例)*/ /*************************************************/ void zhong() interrupt 1//中断向量位为1 { uint num;//定时器计数变量 uint ji;//亮度等级控制变量 TH0=(65536-1100)/256;//给定时器高8位赋值 TL0=(65536-1100)%256;//给定时器低8位赋值 num++;//将定时计数变自动增加1 if(num==shudu)//如果速度变量等于定时计数器变量就执行下面大括号语句 { num=0;//将计数器清0 ji++;//将亮度等级控制变量加1 if((ji>0)&&(ji<10))// if(ji<10)//12345678 移位移动 流水..... { d0=pwm7; //点亮LED0且pwm值最大 d1=0; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>10)&&(ji<20))// if(ji<20)//23456789 { d0=pwm6; //点亮LED0、LED1,且pwm依次为次之、最大值 d1=pwm7; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>20)&&(ji<30))// else if(ji<30)//345678910 { d0=pwm5; d1=pwm6; d2=pwm7; d3=0; d4=0; d5=0; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>30)&&(ji<40))// else if(ji<40)//4567891011 { d0=pwm4; d1=pwm5; d2=pwm6; d3=pwm7; d4=0; d5=0; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>40)&&(ji<50))// else if(ji<50)//12345678 { d0=pwm3; d1=pwm4; d2=pwm5; d3=pwm6; d4=pwm7; d5=0; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>50)&&(ji<60))// else if(ji<60)//23456789 { d0=pwm2; d1=pwm3; d2=pwm4; d3=pwm5; d4=pwm6; d5=pwm7; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>60)&&(ji<70))// else if(ji<70)//345678910 { d0=pwm1; d1=pwm2; d2=pwm3; d3=pwm4; d4=pwm5; d5=pwm6; d6=pwm7; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>70)&&(ji<80))// else if(ji<80)//4567891011 { d0=pwm0; d1=pwm1; d2=pwm2; d3=pwm3; d4=pwm4; d5=pwm5; d6=pwm6; d7=pwm7; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>80)&&(ji<90))// else if(ji<90)//12345678 { d0=0; d1=pwm0; d2=pwm1; d3=pwm2; d4=pwm3; d5=pwm4; d6=pwm5; d7=pwm6; // d8=pwm7; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>90)&&(ji<100))//else if(ji<100)//345678910 { d0=0; d1=0; d2=pwm0; d3=pwm1; d4=pwm2; d5=pwm3; d6=pwm4; d7=pwm5; // d8=pwm6; // d9=pwm7; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>100)&&(ji<110))// else if(ji<110)//345678910 { d0=0; d1=0; d2=0; d3=pwm0; d4=pwm1; d5=pwm2; d6=pwm3; d7=pwm4; // d8=pwm5; // d9=pwm6; // d10=pwm7; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>110)&&(ji<120))// else if(ji<120)//4567891011 { d0=0; d1=0; d2=0; d3=0; d4=pwm0; d5=pwm1; d6=pwm2; d7=pwm3; // d8=pwm4; // d9=pwm5; // d10=pwm6; // d11=pwm7; // d12=0; // d13=0; // d14=0; // d15=0; } if((ji>120)&&(ji<130))// else if(ji<130)//56789101112 { d0=0; d1=0; d2=0; d3=0; d4=0; d5=pwm0; d6=pwm1; d7=pwm2; // d8=pwm3; // d9=pwm4; // d10=pwm5; // d11=pwm6; // d12=pwm7; // d13=0; // d14=0; // d15=0; } if((ji>130)&&(ji<140))// else if(ji<140)//678910111213 { d0=0; d1=0; d2=0; d3=0; d4=0; d5=0; d6=pwm0; d7=pwm1; // d8=pwm2; // d9=pwm3; // d10=pwm4; // d11=pwm5; // d12=pwm6; // d13=pwm7; // d14=0; // d15=0; } if((ji>140)&&(ji<150))// else if(ji<150)// { d0=0; d1=0; d2=0; d3=0; d4=0; d5=0; d6=0; d7=pwm0; // d8=pwm1; // d9=pwm2; // d10=pwm3; // d11=pwm4; // d12=pwm5; // d13=pwm6; // d14=pwm7; // d15=0; } if((ji>150)&&(ji<160))// else if(ji<160)// { d0=0; d1=0; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; // d8=pwm0; // d9=pwm1; // d10=pwm2; // d11=pwm3; // d12=pwm4; // d13=pwm5; // d14=pwm6; // d15=pwm7; } if((ji>160)&&(ji<450))// else if(ji<450)//450控制流水周期 { d0=0; d1=0; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; // d8=0; // d9=0; // d10=0; // d11=0; // d12=0; // d13=0; // d14=0; // d15=0; } if(ji>450)ji=0;// else ji=0; } } [/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2015-11-1 11:51:30 | 显示全部楼层
回复

使用道具 举报

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-3-25
在线时间
1 小时
 楼主| 发表于 2015-11-1 14:20:56 | 显示全部楼层
原子哥呢。。。。?
回复

使用道具 举报

9

主题

85

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3831
金钱
3831
注册时间
2014-7-26
在线时间
525 小时
发表于 2015-11-1 16:06:24 | 显示全部楼层
回复【3楼】pigeon226:
---------------------------------
可以,学习了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-1 21:17:49 | 显示全部楼层
帮顶.....
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-1
在线时间
0 小时
发表于 2015-11-4 10:45:25 | 显示全部楼层
看了楼主的源代码,本来这个是16灯的,做成8个灯了,因为主循环中没有其它代码执行时间,所以到最后一个灯亮后,经过一段PWM延时,关掉,下一个循环马上又开了,所以对灯的亮度没有什么,看起来好像最后一个灯亮度没有什么变化,解决方法是增加一小段延时!我实际试验下,第8个灯亮度有变化了。


if(d7!=0)
 {
 led7=0;
 delay(d7);                    
 led7=1;//7
 }

 d8=50;
 if(d8!=0)
 {
 //led8=0;
 delay(d8);                    
 //led8=1;//8
 }
回复

使用道具 举报

32

主题

223

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-9-23
在线时间
120 小时
发表于 2015-11-5 19:08:14 | 显示全部楼层
帮顶~~~~~~~~~~~~~~~
回复

使用道具 举报

22

主题

106

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2016-8-20
在线时间
91 小时
发表于 2016-8-26 20:12:54 | 显示全部楼层
好长,看的一阵头晕,帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表