51单片机彩灯控制系统
有4种闪烁方式
能自动手动切换
淘气彩灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机淘气彩灯源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- sbit Key1=P3^2; //切换状态按钮(外部中断0)
- sbit Key2=P3^3;
- sbit Key3=P3^4;//暂停按钮(外部中断1)
- sbit p1=P1^5;///蜂鸣器控制端口
- unsigned char state=1; //状态标志
- unsigned int aut=1; //改变手动自动模式
- char F; //定义F为外部变量
- unsigned char NUM1[4]={0x7e,0xbd,0xdb,0xe7}; //第3种亮灯方式(向内)
- unsigned char NUM2[4]={0xe7,0xdb,0xbd,0x7e}; //第3种亮灯方式(向外)
- unsigned char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第4种亮灯方式
- void Delay(unsigned int t) //延时函数
- {
- unsigned int i,j;
- for(i=0;i<t;i++) //用for循环嵌套来实现延时
- for(j=0;j<200;j++);
- }
- void Int_Init() //外部中断初始化
- {
- IT0=1; //外部中断0,边沿触发
- EX0=1; //允许中断
- IT1=1; //外部中断1,边沿触发
- EX1=1; //允许中断
- TMOD=0x06;
- TH0=0xff;
- TL0=0xff;
- ET0=1;
- TR0=1;
- EA=1; //开总中断
- }
- void first()
- {
- unsigned char n;
- for(n=0;n<35;n++)
- {
- P0=0x6d;
- P2=0x6d;
- Delay(30);
- if(F== 1) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
- }
- F = 0; //把外部变量清0
- }
- void second()
- {
- unsigned char m,n;
- for(m=0;m<4;m++)
- {
- P0=0xf0;
- P2=0x0f;
- Delay(100);
- P0=0xff;
- P2=0xff;
- Delay(100);
- if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
- }
- for(n=0;n<4;n++)
- {
- P0=0x0f;
- P2=0xf0;
- Delay(100);
- P0=0xff;
- P2=0xff;
- Delay(100);
- if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
- }
-
- F = 0; //把外部变量清0
- }
- void third()
- {
- unsigned char n;
- for(n=0;n<4;n++)
- {
- P0=NUM1[n];
- P2=NUM2[n];
- Delay(100);
- if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中
-
- }
- F = 0; //把外部变量清0
- }
- void four()
- {
- unsigned char n;
- for(n=0;n<8;n++)
- {
- P0=a[n];
- P2=a[n];
- Delay(100);
- if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
-
- }
-
- F = 0; //把外部变量清0
- }
- void five()
- {
-
- while(aut==0)
- {
- first();
- if(aut==1)break;
- second();
- if(aut==1)break;
- third();
- if(aut==1)break;
- four();
- if(aut==1)break;
- Delay(10);
- if(F==1) break;
- }
-
- F = 0; //把外部变量清0
- }
- /**************主函数*******************/
- void main()
- {
- Int_Init(); //外部中断初始化
- while(1)
- { if(!(aut && state)){
- five();
- }
- else{
- if(state==1) first(); //扫描状态标志,为1时,第一种效果
- else if(state==2) second(); //扫描状态标志,为2时,第二种效果
- else if(state==3) third(); //扫描状态标志,为3时,第三种效果
- else if(state==4) four(); //扫描状态标志,为4时,第四种效果
- else
- {P0=0x00; P2=0x00;} //其他状态,八盏灯全亮,即暂停
- }
- }
- //蜂鸣器程序
- while(1){
- p1=0;
- Delay(200);
- p1=1;
- Delay(500);
- }
- }
- /************外部中断0********************/
- void INT_0() interrupt 0
- {
- Delay(100);//消抖
- if(Key1 == 0)
- {
- F = 1;
- state++; //外部变量置1,即立即跳出效果 //按一次按钮,状态标志加1
- if(state>4) state=1;
- while(Key1 == 0); //松手检测
- }
- }
- /************外部中断1********************/
- void INT_1() interrupt 2
- {
- Delay(100);//消抖
- if(Key2 == 0)
- {
- F=1; //外部变量置1,即立即跳出效果
- state=~state; //取反状态标志,按一次可暂停,使八盏灯全亮,再按一次,继续执行之前的操作
- while(Key2 == 0); //松手检测
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
淘气的彩灯.rar
(56.93 KB, 下载次数: 33)
|