想用c语言写一个按键控制小灯闪烁的程序,就是按一下闪烁,再按就熄灭

想用c语言写一个按键控制小灯闪烁的程序,就是按一下闪烁,再按就熄灭,第1张

具体是怎么个不行法。

像你这种按键程序

因为单片机速度非常快,在你按一下按键时,单片机已经循环了很多次程序。

因此这样就会导致,当你按下时,其实k一直==0  一直在执行动作。

所以这种按键需要判断按键是第一次按下(由d起状态下按下)。而不是一直按着导致的动作。

方法:建一个变量保存上一次按键的值

char LastKey;

LastKey = 1;

while(1)

{

    if(k == 0 && LastKey == 1)    //按下,且上一次检测按键时是d起状态

    {                             //这样才能保证每次按下时只执行一次,

                                    //而不是一直在执行

        Delay1ms(20);

        if(k == 0)                //确定是第一次按下,执行动作

        {

            if((n % 2) == 0)

            {

                LedFlash();

            }

            else

            {

                P0 = 0xFF;

            }

            n++;

        }

    }

    

    LastKey = k;                    //保存按键状态

}

单片机的P10-P13接四个发光二极管L1-L4的阴极,P14-P17接四个开关K1-K4

程序:

ORG

00H

START:

MOV

A,P1

ANL

A,#0F0H

RR

A

RR

A

RR

A

RR

A

ORl

A,#0F0H

MOV

P1,A

SJMP

START

可以检测单个按键,也可以同时检测多个按键

过程:开始——读P1口数据到A——A中的数据右移4次——A中的内容和F0H相或——A中的数据送到P1口——回到开始

如果只检测回车,input就可以搞定:

如果还检测其他按键,可以用keyboard模块:

把‘\n’换成‘a’就能检测按键a。

第二问没看明白什么意思。

程序如下

#include<reg51h>

sbit led1=P10;

sbit key=P11;

sbit key1=P12;

sbit key2=P13;

void main()

{

while(1)

{

if((key|key1|key2)==0)

{led1=~led1;while((key|key1|key2)==0);

}

}

没试过 可能有些地方不对 你自己改改 反正思路就这样了

void keydown(void)

{

P1=0xF0;

if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口

{

keyscan();

}

}

/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

评论

0

0

0

加载更多

要求用51单片机做一个风扇温控检测系统,其功能大概就是:当温度达到设定值时候,风扇电机开始转动,以达到散热的目的,题目本身没有什么意思,有意思的是想要用尽可能少的元器件来完成这项工作,要求使用两个数码管,其他没说,所以我就加了3个按键,大体思路是这样的,开机以后,正常显示温度,按下SET键位时候,进温度设置,两个按键+和-设置数值。再按一次SET保存并退出。

最有意思的在于用了两个标志位,这两个标志位简直没把我绕晕。现在完成了,发出来大家一起看看,不在于代码多好,在于一种解决问题的方法。我把文件发上来了,大家一起学习交流。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

TIM截图20181216211410jpg TIM截图20181216211656jpg TIM截图20181216211828jpg

单片机源程序如下:

代码:

#include "reg52h"

#include <intrinsh>

#define _Nop() _nop_() //定义空指令

/-----------------------------------------------

IO口定义

-----------------------------------------------/

sbit LED_R = P1^6; //红灯

sbit BEEP = P2^1; //蜂鸣器

sbit MOTOR = P2^2; //电机

sbit KEY_ADD = P2^5; //加

sbit KEY_DEC = P2^4; //减

sbit KEY_SET = P2^3; //确认

sbit ONE = P2^6; //个位位选

sbit TEN = P2^7; //十位位选

sbit DQ=P1^7; //DS18B20数据

sbit SDA=P1^1; //模拟I2C数据传送位

sbit SCL=P1^0; //模拟I2C时钟控制位

/-----------------------------------------------

定义变量

-----------------------------------------------/

unsigned char Set_Flag=0; //

unsigned char Set_Value=40; //设定值

unsigned char Tempature = 0; //温度

unsigned char num=40; //数字

unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选

unsigned char Data=0;

char Temp[12];

bit ack; //应答标志位

/-----------------------------------------------

延时函数

-----------------------------------------------/

void Delay_us(unsigned char t)

{

while(t--);

}

void Delay_ms(unsigned char t)

{

int i,j;

for(i=t;i>0;i--)

for(j=125;j>0;j--);

}

void delay_18B20(unsigned int i)//微秒级延时

{

while(i--);

}

/-----------------------------------------------

DS18B20初始化

-----------------------------------------------/

void ds1820rst(void) /ds1820复位/

{

unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(5); //延时

DQ = 0; //DQ拉低

delay_18B20(100); //精确延时大于480us

DQ = 1; //拉高

delay_18B20(40);

}

unsigned char ds1820rd(void)//从18b20读取数据

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ) dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(unsigned char wdata)/写数据/

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = wdata&0x01;

delay_18B20(25);

DQ = 1;

wdata>>=1;

}

}

//读取DS18B20温度值

//入口参数:无

//返回值:温度值

unsigned int read_18b20(void)/读取温度值并转换/

{

unsigned char a,b;

unsigned char tem;

ds1820rst();

ds1820wr(0xcc);//跳过读序列号/

ds1820wr(0x44);//启动温度转换/

ds1820rst();

ds1820wr(0xcc);//跳过读序列号/

ds1820wr(0xbe);//读取温度/

a=ds1820rd();

b=ds1820rd();

tem=((b<<4)|(a>>4)); //将高低字节组合成字

//Delay_ms(50);

return tem; //完成温度转换

}

/-----------------------------------------------

数码管

-----------------------------------------------/

//共阴数码管

//动态扫描

void display(unsigned char Data)

{

//P3 = 0;

ONE = 1; //打开个位位选

TEN = 0;

P3 = table[Data/10];//送个位

Delay_ms(5);//延时

P3 = 0; //防止重影

//Delay_us(5);

TEN = 1;

ONE = 0;

P3 = table[Data%10];

Delay_ms(5);

P3 = 0;

//Delay_us(5);

}

/-----------------------------------------------

按键处理函数

-----------------------------------------------/

char S_F=0;

unsigned char Key_Value(void)

{

if(!KEY_ADD || !KEY_DEC||!KEY_SET) // 检测是否有任意按键按下

{

Delay_ms(20);

Set_Flag = 1; //切换到显示设置值

if(!KEY_ADD) //如果检测到低电平,说明按键按下

{

Delay_ms(10); //延时去抖,一般10-20ms

if(!KEY_ADD) //再次确认按键是否按下,没有按下则退出

{

while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待

{

if(num<99) //加 *** 作

num++;

}

}

}

if(!KEY_DEC) //如果检测到低电平,说明按键按下

{

Delay_ms(10); //延时去抖,一般10-20ms

if(!KEY_DEC) //再次确认按键是否按下,没有按下则退出

{

while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待

{

if(num>0) //减 *** 作

num--;

}

}

}

if(!KEY_SET) //如果检测到低电平,说明按键按下

{

Delay_ms(10); //延时去抖,一般10-20ms

if(!KEY_SET) //再次确认按键是否按下,没有按下则退出

{

//Set_Flag = 0;

while(!KEY_SET);//如果确认按下按键等待按键释放,没有释放则一直等待

{

//将当前值作为设定值

//Set_Flag = 0; //切换到显示温度值

}

if(S_F)

Set_Flag=0;

}

}

}

Set_Value = num;

return (num);

}

/-----------------------------------------------

24C02初始化

-----------------------------------------------/

/------------------------------------------------

启动总线

------------------------------------------------/

void Start_I2c()

{

SDA=1; //发送起始条件的数据信号

_Nop();

SCL=1;

_Nop(); //起始条件建立时间大于47us,延时

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0; //发送起始信号

_Nop(); //起始条件锁定时间大于4μ

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0; //钳住I2C总线,准备发送或接收数据

_Nop();

_Nop();

}

/------------------------------------------------

结束总线

------------------------------------------------/

void Stop_I2c()

{

SDA=0; //发送结束条件的数据信号

_Nop(); //发送结束条件的时钟信号

SCL=1; //结束条件建立时间大于4μ

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1; //发送I2C总线结束信号

_Nop();

_Nop();

_Nop();

_Nop();

}

以上就是关于想用c语言写一个按键控制小灯闪烁的程序,就是按一下闪烁,再按就熄灭全部的内容,包括:想用c语言写一个按键控制小灯闪烁的程序,就是按一下闪烁,再按就熄灭、按键控制led灯的程序、python如何用按键控制程序开始等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9994862.html

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

发表评论

登录后才能评论

评论列表(0条)

保存