标题:
单片机键控淘气彩灯控制源码与proteus仿真
[打印本页]
作者:
阿姐酒啊就
时间:
2018-4-12 22:58
标题:
单片机键控淘气彩灯控制源码与proteus仿真
51单片机彩灯控制系统
有4种闪烁方式
能自动手动切换
淘气彩灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(24.54 KB, 下载次数: 50)
下载附件
2018-4-13 01:59 上传
0.jpg
(44.99 KB, 下载次数: 58)
下载附件
2018-4-13 02:00 上传
单片机淘气彩灯源程序如下:
#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)
2018-4-12 22:57 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1