找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1599|回复: 10
打印 上一主题 下一主题
收起左侧

求大神帮忙提供一个51单片机的按键的程序设计思路(新手)

[复制链接]
跳转到指定楼层
楼主
ID:655120 发表于 2020-2-23 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想用51单片机写一个按键程序,当按键按下去时(长时间按住)执行一个函数,当按键松开时执行另一个函数。PS:要有实时性,因为一共有八个按键(要用51单片机做一个小车的遥控器,想用按键实现:当按键按住是小车一直走,当按键松开时小车停止。)拜托各位大神了,实在是写不出来了
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:648281 发表于 2020-2-23 13:03 | 只看该作者
你好!
你说的个功能可以实现,小车应该是无线的吧,用的什么无线模块
回复

使用道具 举报

板凳
ID:609989 发表于 2020-2-23 13:34 | 只看该作者
//可以参照下,因为没有上班没给你调试,你自己调试下。
void key()
{
        sbit key1   =  P2^0;//按键1
        sbit key2   =  P2^1;
        .....                                //几个按键只要IO够就行
        sbit status =  P1^0;//状态指示
        bit flag;
        int f;
        while(1)
        {
                f=1;
                switch (f)
                {
                        case 1:
                        {       
                                if(key1==0&&key2)                //你需要的功能可以继续往下写
                                        {
                                                delayms(20);                //防抖
                                                if(key1==0&&key2)
                                                {
                                                        z=2;
                                                }
                                        }
                                if(key2==0&&key1)               
                                        {
                                                delayms(20);
                                                if(key2==0&&key1)
                                                {
                                                        z=3;
                                                }
                                        }
                        }break;       
                        case 2:
                        {
                                delayms(500);
                                status=0;                //打开
                                delayms(500);
                                z=1;                        //返回第一步继续等待
                        }break;
                        case 3:
                        {
                                delayms(500);
                                status=1;                //关闭
                                delayms(500);       
                                z=1;                     //同理返回第一步继续等待
                        }break;
                }
        }
}
回复

使用道具 举报

地板
ID:94031 发表于 2020-2-23 13:47 | 只看该作者
void main()
{
  
        while(1)
        {

                读键() ;//读键
                if(键值==前进){前进();}
                if(键值==后退){后退();}
                。
                。
                。

                else{停();}
        }
}
回复

使用道具 举报

5#
ID:655120 发表于 2020-2-24 07:36 | 只看该作者
51hei**1140 发表于 2020-2-23 13:03
你好!
你说的个功能可以实现,小车应该是无线的吧,用的什么无线模块

无线数传模块,大神可知道应该怎么写这个程序吗?
回复

使用道具 举报

6#
ID:655120 发表于 2020-2-24 09:17 | 只看该作者
baiyun1234 发表于 2020-2-23 13:34
//可以参照下,因为没有上班没给你调试,你自己调试下。
void key()
{

谢谢大神,还请大神讲讲这个程序,没太看懂(新手小白)我想实现的功能是一个按键按下去执行小车前进这个函数,松开时执行小车停止这个函数,而且按键比较多,因为这个按键控制小车所以想实时性好一点(不知道是不是要用中断,还有就是程序的逻辑没想出来),再次谢谢大神了!
回复

使用道具 举报

7#
ID:601478 发表于 2020-2-24 10:26 | 只看该作者
void key_scan()
{
  static uchar a;
  if( key1 == 0)  {a++;}
  else if(key2 == 0) {a++;}
  else {a = 0;}
  if(xx<a)
  {
   if(key1 == 0) {key =1;}
   else if(key2 == 0) {key =2;}
   else {key = 0;}
  }
}
框架大概这样吧,把扫描放中断里,消抖效果根据自己的手感改时间就行,可以改一改看能不能用,我也是新手,不能保证好用
回复

使用道具 举报

8#
ID:462827 发表于 2020-2-25 01:01 | 只看该作者
用状态机的机制就行了,按键改变状态值,由主执行结构(循环或定时器中断)来动作。
回复

使用道具 举报

9#
ID:701320 发表于 2020-3-2 18:57 | 只看该作者
这个是按键控制流水灯程序,可以看看框架。希望对你有帮助。
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1 =P3^0; //按键1
sbit key2 =P3^1; //按键2
sbit key3 =P3^2; //按键3
uchar flag1=0,flag2=0,flag3=0;
void delay_ms(uint z)
{
     uint i,j;
     for(i=0;i<z;i++)
     for(j=0;j<110;j++);
}
void O_to_E() //1,3,5,7与2,4,6,8交替闪烁
{
     P2=0Xaa;
     delay_ms(200);
     P2=~0Xaa;
     delay_ms(200);
}
void key_scan()    //键盘扫描
{
     if(!key1)
     {
          delay_ms(10); //延时消抖
          if(!key1)
          flag1=1;
     }
     if(!key2)
     {
          delay_ms(10); //延时消抖
          if(!key2)
           flag2=1;
         }
     if(!key3)
     {
          delay_ms(10); //延时消抖
          if(!key3)
           flag3=1;
     }
}
void main()
{
     uchar i;
     while(1)
     {
            key_scan();
            if(flag1)                               //按键一按下?               
            {
                   for(i=0;i<8;i++)            //从左至右亮,每次一盏            
                   {
                            P2=~(0x80>>i);
                            delay_ms(100);
                            key_scan();                 //按键扫描   
                            if(flag2||flag3){flag1=0;break;}        //如果有其它按键按下响应其它按键
                   }
             }
             if(flag2)                                //按键一按下?                  
             {
                    for(i=0;i<8;i++)             //从右至左亮,每次一盏  
                   {
                            P2=~(0x01<<i);
                            delay_ms(100);
                            key_scan();
                            if(flag1||flag3){flag2=0;break;}
                   }
             }
              if(flag3)
             {
                   O_to_E();                             //奇偶交替闪烁
                   key_scan();
                   if(flag1||flag2)flag3=0;
              }
        }
}
回复

使用道具 举报

10#
ID:701321 发表于 2020-3-2 19:33 | 只看该作者
八个按键的c程序最好有程序说明
回复

使用道具 举报

11#
ID:701539 发表于 2020-3-3 09:51 | 只看该作者
区别不大,pwm是一种调制方式而已,被控制的系统接受什么样的pwm会有什么反应是由被控制的系统决定的,我们只要看懂手册输出对应的pwm波就行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表