独立按键与定时器的使用练习

/*

    独立按键与定时器的使用

    实验要求:

    *1:按下S2,使数码管显示的数字+1

    *2:按下S3,使数码管显示的数字-1;

    *3:按下S4,数码管清0

    *4:首次按下S5,数码管的数值定时1s加1;再次按下,数码管暂停递增,保持不变

    *5:当数码管定时递增时,其他按键按下无反应

需要掌握的:定时器的使用,按键的按下检测以及消抖,多函数的写法

*/

#include    <reg51.h>

 

#define uint unsigned int

#define uchar unsigned char

 

sbit we = P2^7;

sbit du = P2^6;

sbit S2 = P3^0;

sbit S3 = P3^1;

sbit S4 = P3^2;

sbit S5 = P3^3;

 

uint cnt; //全局变量,控制数码管显示的数字的变化

uchar code arry[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint i);//软件延时函数

void display(); //数码管显示函数

void dingshi();//定时器函数

void key_scan();//扫描固定按键函数

void check(); //检测cnt值变化函数

 

void check()

{

    if(cnt == 99)//如果cnt=99,重置0,否则对本实验而言就会有乱码

        cnt = 0;

}

void delay(uint i)//软件延时函数

{

    uint a,c;

    for(a = i;a > 0;a--){

        for(c = 114;c > 0;c--);

    }

 }

 

void display()

{

    uint ge,shi;

    ge = cnt % 10;

    shi = cnt / 10;

   

    P0 = 0xff; //消影

    we = 1;

    P0 = 0xfe;

    we = 0;

   

    du = 1;

    P0 = arry[shi];

    du = 0;

    delay(5);  //防止重影

   

    P0 = 0xff;

    we = 1;

    P0 = 0xfd;

    we = 0;

   

    du = 1;

    P0 = arry[ge];

    du = 0;

    delay(5);

}

 

void dingshi() //定时器函数,主要知道怎么给初值,怎么检测是否到1S。

{

    uchar sec;

    if(TF0 == 1){

        TH0 = 0x4b;

        TF0 = 0xfc;

        TF0 = 0;

        sec++;

        }

    if(sec == 20){

        cnt++;

        check();

        sec = 0;   

    }

}

void key_scan() //扫描按键函数

{

    if(TR0 == 0){//如果数码管正在自动递增中,按下S2,S3.S4默认不会改变数码管的值

        if(S2 == 0){  //检测是否按下按键,按下的话会置0;

            delay(5); //软件消抖,因为键盘按下的瞬间,电平信号会有抖动

            if(S2 == 0){

                cnt++; //如果按下S2,让cnt+1,因为cnt是全局变量,所以数码管也会实时更新

                check();//检测是否到了99s

            }

            while(!S2); //松手检测

        }

        if(S3 == 0){

            delay(5);

            if(S3 == 0){

            cnt--; //按下S3,cnt减1

            }

            while(!S3);

        }

        if(S4 == 0){

            delay(5);

            if(S4 == 0){

                cnt = 0;  //按下S4,cnt置0

            }while(!S4);

                     

        }

    }

    if(S5 == 0){

        delay(5);         

        if(S5 == 0){

            TR0 = ~TR0;//按下S5,TRO的状态就是取反上次TR0的状态,开始默认置0

            while(!S5);

        }

    }

 }

void main()//主函数

{

    TMOD = 0x01;

    TH0 = 0x4b;

    TL0 = 0xfc;

 

    while(1){

        dingshi();

        key_scan();

        display();

    }      

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得知独立按键是一种常见的电子元器件,它通常由四个引脚组成,其中两组间距较短,而另两组间距较长。间距长的两组引脚之间是连接在一起的,而短间距引脚之间初始状态是断开的,当按键被按下时,四个引脚被接通,可视作一根导线。在51单片机中,我们可以通过定时器来实现对独立按键的检测。 以下是51单片机定时器独立按键的实现步骤: 1. 配置定时器:选择一个合适的定时器,并设置其工作模式和计数器初值,使其能够按照一定的时间间隔产生中断。 2. 配置IO口:将独立按键的一个引脚连接到单片机的一个IO口上,并将该IO口设置为输入模式。 3. 编写中断服务程序:在定时器中断服务程序中,读取独立按键的状态,如果检测到按键被按下,则执行相应的操作。 4. 启动定时器:启动定时器,使其开始按照设定的时间间隔产生中断。 5. 等待按键事件:在主程序中,等待独立按键的事件发生,如果检测到按键被按下,则执行相应的操作。 以下是51单片机定时器独立按键的代码示例: ```c #include <reg52.h> sbit KEY = P1^0; // 独立按键连接到P1.0 void Timer0_Init() // 定时器0初始化函数 { TMOD &= 0xF0; // 设置定时器0为模式0 TH0 = 0x3C; // 设置定时器0的计数初值为0x3C TL0 = 0xB0; // 设置定时器0的计数初值为0xB0 ET0 = 1; // 使能定时器0中断 TR0 = 1; // 启动定时器0 } void main() { Timer0_Init(); // 初始化定时器0 while(1) { if(KEY == 0) // 检测独立按键是否被按下 { // 执行相应的操作 } } } void Timer0_ISR() interrupt 1 // 定时器0中断服务程序 { if(KEY == 0) // 检测独立按键是否被按下 { // 执行相应的操作 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值