51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。

51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。,第1张

以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。

程序中使用了P10到P13作为控制灯的引脚,P32作为按键的引脚。每当按下按键时,通过判断状态值来切换不同的灯亮灭模式。定时器中断函数用来实现灯的闪烁,可根据需求自行调整闪烁频率。

编程不易,忘采纳

我知道是AT89S52。我是说这个单片机的外围电路。例如我的是p0控制数码管的段选,而你的可能不是p0。懂了吗,所以只能参考

#include <reg52h>

#define uint unsigned int

#define uchar unsigned char

uchar code fu[]={0xfe,0xfd,0xfb,0xf7};

uchar code duan[]={0x28, 0x7E, 0Xa2, 0X62, 0X74, 0X61, 0X21, 0X7A, 0X20, 0X60};

uchar code wei[]={0xff,0xfd,0xfb};

uint a;

void jiance();

void delay();

void xianshi();

void main()

{

while(1)

{

P2=0XFF;

jiance();

}

}

void delay()

{

uint i;

for(i=0;i<1000;i++);

}

void jiance()

{

uchar p1,j;

for(j=0;j<4;j++)

{

P1=fu[j];

p1=P1;

if(p1!=fu[j])

{

delay();

p1=P1;

while(p1!=fu[j])

{

p1=P1;

if(p1!=fu[j])

{

switch(p1)

{

case 0xee: a=1; break;

case 0xde: a=2; break;

case 0xbe: a=3; break;

case 0x7e: a=4; break;

case 0xed: a=5; break;

case 0xdd: a=6; break;

case 0xbd: a=7; break;

case 0x7d: a=8; break;

case 0xeb: a=9; break;

case 0xdb: a=10; break;

case 0xbb: a=11; break;

case 0x7b: a=12; break;

case 0xe7: a=13; break;

case 0xd7: a=14; break;

case 0xb7: a=15; break;

case 0x77: a=16; break;

}

}

xianshi();

}

}

}

}

void xianshi()

{

uchar y,z,x=10;

y=a/10;

z=a%10;

P0=duan[y];

P2=wei[y];

delay();

P0=duan[z];

P2=wei[y+1];

delay();

}

sbit KEY = P0^1;

sbit LED = P0^2;

int keyscan(void)

{

bit keyval=0;

if(KEY)

{

delay(30);//延时消抖

if(KEY)

{

keyval = ~keyval; //值取反

if(keyval )

{

LED = 1;//led亮

}

else

{

LED = 0;//led灭

}

}

}

}

具体函数没查,说说语法吧:~bit(1) 对bit(1)取反,keyScan|=C_SCN_RIGHT 对keyScan 与C_SCN_RIGHT 进行或运算,然后将值赋给keyScan

key为按键,规定按下为低电平

if(key==0)

{

delay(50); //延时50ms,消抖

if(key==0) //再判断是否按下

{

while(!key); 松手检测

··················································

该按键按下要实现的功能程序

··················································

}

}

我的习惯是这样写

/52系列单片机,晶振12MHz,P10输出100Hz方波(即周期10ms),方波由T0定时器产生

P13接按键 K1,每按一次按键,方波占空比改变一次,依次为:1/10→2/10→……→9/10→1/10,如此循环/

#include"reg52h" //包含52系列头文件

#define uchar unsigned char //定义 无符号字符型

#define uint unsigned int //定义 无符号整型

#define TRUE 1 //定义 逻辑真

#define FALSE 0 //定义 逻辑假

#define th0 0xfc //100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为 1ms

#define tl0 0x18 //1ms at 12HMz Fosc

#define DutyDeno 10 //定义 占空比分母 为:10

sbit WaveOut=P1^0; //定义 方波输出 接口

sbit Key1=P1^3; //定义 按键Key1 接口

uchar DutyNume=1; //定义 占空比分子 变量,并初始化为 1(即 占空比 为:1/10)

void Timer0() interrupt 1 //定时器T0 中断 函数

{

static uchar duty_time=0; //定义静态变量,作为 占空比 输出时间的参考值(1ms)

TL0=tl0;

TH0=th0; //重赋定时器初值,1ms

duty_time=++duty_time%DutyDeno; //该句等效于:duty_time++;duty_time%=DutyDeno;

if(duty_time<DutyDeno) WaveOut=1; //若计时时间小于 占空比分子,则输出应为 高电平

else WaveOut=0; //若计时时间大于 占空比分子,则输出应为 低电平

}

void TimerInit() //定时器初始化 函数

{

TMOD=0x01; //T0 16位定时器

EA=1; //允许系统中断

ET0=1; //允许T0中断

TH0=th0;

TL0=tl0; //1ms 初值

TR0=1; //T0开始计时

}

void KeyResp() //按键响应 函数

{

static bit KeyDownFlag,KeyReadyFlag; //定义 静态标志位,KeyDownFlag 按键按下标志,KeyReadyFlag 按键准备(响应)标志

if(!Key1) //若按键Key1 被按下

{

KeyDownFlag=TRUE; //按键按下标志 置位

KeyReadyFlag=TRUE; //按键准备标志 置位

}

else KeyDownFlag=FALSE; //若按键Key1 无按下,则清空 按键按下标志

if(!KeyDownFlag && KeyReadyFlag) //若 按键已准备,且按键无按下(即 松手状态)

{

DutyNume++; //占空比分子 加1

if(DutyNume==DutyDeno) DutyNume=1; //若 占空比分子=分母,则返回 1

KeyReadyFlag=FALSE; //按键处理完毕,清 按键准备标志

}

}

void main() //主函数

{

TimerInit(); //调用 定时器初始化 函数

while(1) //循环系统

{

KeyResp(); //调用 按键响应 函数

}

}

方波输出接口接灯;

以上就是关于51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。全部的内容,包括:51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。、谁能帮我编个按键程序(c语言):按键带锁存的、独立键盘用一个按键,控制一个灯的亮灭,用C语言怎么写程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10115076.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存