1) 起始状态时,8个灯处于同频率“呼吸”状态。
(2) 按键1按下时,1号到8号依次由亮到暗“呼吸”。
(3) 按键2按下时,1号到8号依次由暗到亮“呼吸”。
(4)按键3按下时,恢复起始亮法。
由于是在仿真中,需要加入驱动电路才能看出来“呼吸”的效果,否则只能看到灯在闪烁。
做实物时不需要加驱动电路,直接连接单片机就可以看出来那种效果。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #define MAX 0x40 //定时上限定义
- #define MIN 0x00 //定时下限定义
- #define TIMELINE 10 //时间分频常数
- #define TRUE 1
- #define FALSE 0 //标志位常数
- sbit s1 = P2^0;
- sbit s2 = P2^1;
- sbit s3 = P2^2;
- unsigned int TimeCounter;
- bit ArrowFlg = 0; //方向标志位
- unsigned char upCounter,downCounter; //增加计数器和减少计数器
- unsigned char table1[] = {0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff} ;
- unsigned char table2[] = {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00} ;
- unsigned char k=0,j=-1;
- char key1,key=3;
- char keyscan()
- {
- if(s1==0){while(!s1);key=1;}
- if(s2==0){while(!s2);key=2;}
- if(s3==0){while(!s3);key=3;}
- return key;
- }
- //T0的中断服务子函数
- void T0Deal() interrupt 1
- {
- TH0=0xf1;
- TL0=0xf1;
- TR0=1;
- TimeCounter++; //定时计数器增加
- if(TimeCounter == TIMELINE)
- {
- if(key1==1)
- {
- upCounter++;
- downCounter--;
- if((upCounter == MAX)&&(downCounter == MIN))
- {
- upCounter = MIN;
- downCounter = MAX; //计数器初始化
- k++;if(k>=9)k=0;
- }
- }
- if(key1==2)
- {
- upCounter--;
- downCounter++;
- if((upCounter == MIN)&&(downCounter == MAX))
- {
- upCounter = MAX;
- downCounter = MIN; //计数器初始化
- j++;if(j>=9)j=0;
- }
- }
- if(key==3)
- {
- if((upCounter == MAX)&&(downCounter == MIN)) //计数方向标志位切换
- {
- ArrowFlg = FALSE;
- }
- if((upCounter == MIN)&&(downCounter == MAX))
- {
- ArrowFlg= TRUE;
- }
- if(ArrowFlg == 1) //如果是增加计数
- {
- upCounter++;
- downCounter--;
- }
- else //如果是减少计数
- {
- upCounter--;
- downCounter++;
- }
- }
- TimeCounter=0;
- }
- }
- //延时函数
- void Delay(unsigned int i)
- {
- unsigned int j;
- while(i--)
- {
- for(j=0;j<32;j++); //延时
- }
- }
- void main()
- {
- upCounter = MIN;
- downCounter = MAX; //计数器初始化
- TMOD = 0x01; //设置定时器工作方式1
- TH0 = 0xF0;
- TL0 = 0xF0; //T0初始化值
- EA = 1;
- ET0 = 1; //开中断
- TR0 = 1; //启动T0
- while(1)
- {
- key1=keyscan();
- if(key1==1){P1= table1[k-1];Delay(downCounter);P1=table1[k]; Delay(upCounter);}
- if(key1==2){P1=table2[j]; Delay(downCounter);P1=table2[j-1]; Delay(upCounter); }
- if(key1==3){P1=0x00; Delay(downCounter);P1=0xff; Delay(upCounter);}
- }
- }
复制代码
七彩呼吸灯完整源码和仿真文件.zip
(118.5 KB, 售价: 2 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|