51单片机按键控制继电器和共阴七段数码管,要求四个按键各对应一个继电器和数码管,按键按一下继电器闭

51单片机按键控制继电器和共阴七段数码管,要求四个按键各对应一个继电器和数码管,按键按一下继电器闭合数码管显示对应k的数字,再嗯一下继电器断开数码管变成0。
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit JDQ1=P2^0;
sbit JDQ2=P2^1;
sbit JDQ3=P2^2;
sbit JDQ4=P2^3;
void Delay10ms( );
void main()
{
bit k1flag=0;
bit k2flag=0;
bit k3flag=0;
bit k4flag=0;
JDQ1=JDQ2=JDQ3=JDQ4=1;
while(1)
{
if(k1==0)
{
Delay10ms();
if(k1==0)
{
k1flag=!k1flag;
while(k1==0);
}
}
if(k1flag==1)
{
JDQ1=0;//继电器1吸合
}
else
{
JDQ1=1;//继电器1断开
}
if(k2==0)
{
Delay10ms();
if(k2==0)
{
k2flag=!k2flag;//转换变量
while (k2==0); //等待按键弹起
}
}
if(k2flag)
{
JDQ2=0;// 继电器2吸合
}
else
{
JDQ2=1;// 继电器2断开
}
if(k3==0)
{
Delay10ms(); //延时10ms
if(k3==0)
{
k3flag=!k3flag;
while (k3==0);
}
}
if(k3flag)
{
JDQ3=0;// 继电器3吸合
}
else
{
JDQ3=1;// 继电器3断开
}
if(k4==0)
{
Delay10ms();
if(k4==0)
{
k4flag=!k4flag;
while (k4==0);
}
}
if(k4flag)
{
JDQ4=0;// 继电器4吸合
}
else
{
JDQ4=1;// 继电器4断开
}
}
}
void Delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
} 这是控制继电器的程序,求大神改成同时控制七段数码管的,数码管P0端。

//51单片机按键控制继电器和共阴七段数码管,
//要求四个按键各对应一个继电器和数码管,按键按一下继电器闭合数码管显示对应k的数字,再嗯一下继电器断开数码管变成0。

//在源程序上,增加控制七段数码管的,4个数码管数据口共用P0端,通过P2^4、P2^5、P2^6、P2^7控制显示
#include<reg51.h>
#include <intrins.h> 
#define uint unsigned int
#define uchar unsigned char
#define SMGDAT P0//数码管数据口
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit JDQ1=P2^0; 
sbit JDQ2=P2^1; 
sbit JDQ3=P2^2; 
sbit JDQ4=P2^3;

sbit SMG1=P2^4;//数码管位控制
sbit SMG2=P2^5;//数码管位控制
sbit SMG3=P2^6;//数码管位控制
sbit SMG4=P2^7;//数码管位控制

uchar code smgsegtab[]={0X3F,0x06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//共阴数码管段码
void Delay10ms( );
void main()
{
bit k1flag=0;
bit k2flag=0;
bit k3flag=0;
bit k4flag=0;
JDQ1=JDQ2=JDQ3=JDQ4=1;
while(1)
{
if(k1==0)
{
Delay10ms();
if(k1==0)
{
k1flag=~k1flag;//k1flag=!k1flag; //【!是逻辑非,~是取反操作】
while(k1==0);
}

if(k1flag==1)
{
JDQ1=0;//继电器1吸合
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[1];//数码管显示1
SMG1 = 0;
}
else
{
JDQ1=1;//继电器1断开
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[0];//数码管显示0
SMG1 = 0;
}
if(k2==0)

Delay10ms();
if(k2==0)
{
k2flag=~k2flag;//k2flag=!k2flag;//转换变量
while (k2==0); //等待按键弹起
}

if(k2flag)
{
JDQ2=0;// 继电器2吸合

SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[2];//数码管显示2
SMG2 = 0;
}
else
{
JDQ2=1;// 继电器2断开
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[0];//数码管显示0
SMG2 = 0;
}
if(k3==0)
{
Delay10ms(); //延时10ms
if(k3==0)
{
k3flag=~k3flag;
while (k3==0);
}

if(k3flag)
{
JDQ3=0;// 继电器3吸合
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[3];//数码管显示3
SMG3 = 0;
}
else
{
JDQ3=1;// 继电器3断开
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[0];//数码管显示0
SMG3 = 0;
}
if(k4==0)
{
Delay10ms();
if(k4==0)
{
k4flag=~k4flag;
while (k4==0); 
}
}
if(k4flag) 
{
JDQ4=0;// 继电器4吸合
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[4];//数码管显示4
SMG4 = 0;
}
else
{
JDQ4=1;// 继电器4断开
SMG1 = 1;
SMG2 = 1;
SMG3 = 1;
SMG4 = 1;
SMGDAT = smgsegtab[0];//数码管显示0
SMG4 = 0;
}
}
}
void Delay10ms(void) 

unsigned char a,b,c; 
for(c=1;c>0;c--) 
for(b=38;b>0;b--) 
for(a=130;a>0;a--);
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-07-09
真的要改,需要一小时多。
相似回答