找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按下按键功能实现不灵敏

[复制链接]
跳转到指定楼层
楼主
ID:630714 发表于 2019-11-16 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机小车程序,按下按键功能实现不灵敏
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint  time=0;
uint  timer=0;
float S=0;
sbit RX=P1^0;                                                //接收端
sbit TX=P1^1;                                                //发送端
sbit jia=P3^6;           //角度增加按键检测IO口
sbit jan=P3^7;           //角度减少按键检测IO口
sbit jias=P3^3;           //角度增加按键检测IO口
sbit jans=P3^4;           //角度减少按键检测IO口
uchar jd;         //角度标识
uchar jds=0;
uchar count;
sbit pwm=P1^6;
sbit pwm1=P1^2;          //PWM信号输出
sbit pwm2=P1^3;
sbit pwm3=P1^4;
sbit pwm4=P1^5;
bit flag=0;
void counts()
{
        time=TH1*256+TL1;                                //TH0是计数器0的高八位,TL0是计数器0的低八位,
                                                            //这个公式就是把高八位向左移八位加上低八位组成一个16的数值,也就是计数值,在赋值给tim                        
        TH1=0;
        TL1=0;
        S=(time*1.87)/100;                                   //时钟周期位T0=11.0592M,机器周期为T1=1/11.0592*12us=1.08us定时器计时time1,
                                                                           //实际为t=time1*1.08,此为声波往返时间,距离要除以2,取声速346m/s,
               
                                                                //S=v*t=346*time*T1/2/1000000m'=1.868*time1/100cm得S约等于time1*1.87/100cm        
        if(S<5)
                jds=0;

}
void delay0(uint i)
{
        while(i--);
}
void keyscan0()              //按键扫描
{
        if(jias==0)               //角度增加按键是否按下
    {
            delay0(10);              //按下延时,消抖
                   if(jias==0)              //确实按下
            {
                     jds=jds+10;              
        if(jds>200)
                jds=200;         
             while(jias==0);        //等待按键放开
            }
          }
         if(jans==0)                //角度减小按键是否按下
         {
                   delay0(10);
                   if(jans==0)
            {
                     jds=jds-10;         
                     if(jds<10)
                       jds=0;               //已经是0度,则保持
             while(jans==0);
            }
          }
}
void keyscan()              //按键扫描
{
        if(jia==0)               //角度增加按键是否按下
    {
            delay0(10);              //按下延时,消抖
                   if(jia==0)              //确实按下
            {
                     jd++;                 //角度标识加1
                     count=0;              //按键按下 则20ms周期从新开始
        if(jd==26)
                jd=25;               //已经是180度,则保持
             while(jia==0);        //等待按键放开
            }
          }
         if(jan==0)                //角度减小按键是否按下
         {
                   delay0(10);
                   if(jan==0)
            {
                     jd--;                 //角度标识减1
                     count=0;
                     if(jd==4)
                       jd=5;               //已经是0度,则保持
             while(jan==0);
            }
          }
}
void delay(uint i)
{
         while(i--)
        {
                if(jia==0||jan==0)
                        keyscan();
                if(jias==0||jans==0)
                        keyscan0();               
        }
}


void  StartModule()                                  //延时,超声波模块Trig控制端给大于10us的高电平触发模块测距
{                                                                //模块就会自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
                                                                //操作简单方便;假如有信号返回,超声波模块就会通过 IO(Echo(接收端)) 输出一高电平,
                                                                //高电平持续的时间就是超声波从发射到返回的时间.那么测试距离=(高电平时间*声速(340M/S))/2;
        TX=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        TX=0;
}

void main()
{
        TMOD=0x11;
        TH1=0;
        TL1=0;
        TH0=(65536-92)/256;
        TL0=(65536-92)%256;     //11.0592MZ晶振,0.1ms
        ET0=1;                 
        ET1=1;
        TR0=1;
        EA=1;
        while(1)
        {
                StartModule();
                while(!RX);
                TR1=1;                         //开定时器位           (Echo(接收端)高电平持续的时间就是超声波从发射到返回的时间.
                                        //所以等待高电平的时间,就是定时器计时的时间。(while(RX));在等待然后关闭定时器,通过算法就能计数了。
                while(RX);
                TR1=0;                         //关定时器
                counts();                 //计数
                delay(65535);
                keyscan();               //按键扫描
                keyscan0();
        }        
}
void Time0_Int() interrupt 1 //中断程序

{
        TH0 = (65536-92)/256;             //重新赋值
        TL0 = (65536-92)%256;
    if(count< jd)              //判断0.1ms次数是否小于角度标识
            pwm=1;                  //确实小于,PWM输出高电平
    else
            pwm=0;                  //大于则输出低电平
        if(count<jds)
        {
                pwm1=1;
                pwm2=0;
                pwm3=1;
                pwm4=0;
        }
        else
        {
                pwm1=0;
                pwm2=0;
                pwm3=0;
                pwm4=0;
        }
        count++;          //0.1ms次数加1
   if(count==200)
           count=0;     //次数始终保持为200 即保持周期为20ms
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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