标题:
单片机开关控制心型LED闪烁状态源程序与Proteus仿真
[打印本页]
作者:
洋洋ww
时间:
2022-6-2 14:42
标题:
单片机开关控制心型LED闪烁状态源程序与Proteus仿真
Proteus通过使用单片机C51控制流水灯的闪硕状态,语言简单
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
(93.21 KB, 下载次数: 58)
下载附件
2023-1-29 19:18 上传
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit S1=P2^0;
sbit S2=P2^1;
sbit S3=P2^2;
sbit S4=P2^3;
uchar keyval; //定义键值变量
void key_scan(); //按键扫描函数声明
void delayms(uint); //延时函数声明
void pattern1();
void pattern2();
void pattern3();
void pattern4();
void main(void)
{
keyval=0;
while(1)
{
key_scan(); //调用按键扫描函数
switch(keyval)
{
case 1:pattern1();break; //按键1被按下时执行操作
case 2:pattern2();break; //按键2被按下时执行操作
case 3:pattern3();break; //按键3被按下时执行操作
case 4:pattern4();break; //按键4被按下时执行操作
}
}
}
void key_scan(void) //按键扫描函数定义
{
P2=0xff;
if((P2&0x0f)!=0x0f)
{
delayms(100); //按键消抖
if(S1==0)
keyval=1;
if(S2==0)
keyval=2;
if(S3==0)
keyval=3;
if(S4==0)
keyval=4;
}
}
void delayms(uint j)
{
uchar i;
for(;j>0;j--)
{
i=250;
while(--i);
i=249;
while(--i);
}
}
void pattern1()
{
uchar i;
P0=0x7f;
P1=0xfe;
for(i=0;i<8;i++)
{delayms(200);
P0=_cror_(P0,1);
P1=_crol_(P1,1);
}
}
void pattern2()
{
uchar i,temp;
temp=0xfe;
for(i=0;i<8;i++)
{delayms(200);
P0=P1=temp;
temp=temp<<1;
}
}
void pattern3()
{
P0=P1=0xff;
delayms(200);
P0=P1=0x00;
delayms(200);
}
void pattern4()
{
uchar i;
P0=0x7f;
for(i=0;i<8;i++)
{delayms(200);
P0=_cror_(P0,1);
}
P0=0xff;
P1=0xfe;
for(i=0;i<8;i++)
{delayms(200);
P1=_crol_(P1,1);
}
P1=0xff;
}
复制代码
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
以上的Keil5代码工程文件和Proteus仿真8.13下载:
以上代码下载.7z
(60.43 KB, 下载次数: 17)
2022-6-2 20:03 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qsddxu
时间:
2022-6-8 16:56
刚试用了 发现要切换不同的闪烁只能在刚接通电源时才能,中途按下其他键没有反应,
作者:
164908060
时间:
2023-1-29 16:13
我的也是这样的效果 只有复位后按按键可以切换 之后就切换不了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1