找回密码
 立即注册

QQ登录

只需一步,快速开始

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

帮我看看单片机代码到底是哪里出错了 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:798700 发表于 2020-7-6 21:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<REGX51.H>        //单片机头文件,包含相关特殊寄存器物理映射
sbit UP=P1^0;     //按键加速
sbit DOWN=P1^1;     //按键减速
sbit RIGHT=P1^2;     
sbit LEFT=P1^3;      
sbit STOP=P1^4;      
sbit IN1=P2^5;
sbit IN2=P2^6;
sbit ENA=P2^7;                                                                                                               
unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管代码表
char PWM=5;                        //占空比
char MOTO_STATE;        //电机状态
char counter;
void delay(unsigned int a)        //延时函数
{
         while(a--);        
}
void INIT()         //初始化定时计数器
{
     TMOD=0x01;     //设计定时器为定时模式,方式为1
          TH0=(65536-1000)>>8;           //初值计算                          
         TL0=(65536-1000);
         TR0=1;                        //启动定时计数器0
         ET0=1;
         EA=1;                  
}
void key_scan()     //按键扫描
{                                                      
    if(!UP)
    {
       delay(1000);
       if(!UP)                //转速加快
       {
             PWM++;if(PWM>9)PWM=9;   //转速10档
       }
       while(!UP);
        }
        if(!DOWN)                            //按下减速按钮
    {
       delay(1000);
       if(!DOWN)               //转速降低
       {
             PWM--;if(PWM<=0)PWM=0;  //转速0档
       }
       while(!DOWN);
        }
        if(!RIGHT)
    {
       delay(1000);
       if(!RIGHT)               
       {
             MOTO_STATE=1;  
       }
       while(!RIGHT);
        }
        if(!LEFT)
    {
       delay(1000);
       if(!LEFT)               
       {
             MOTO_STATE=2;  
       }
       while(!LEFT);
        if(!STOP)                            //按下停止按钮
    {
       delay(1000);
       if(!STOP)                                //转速停止为0
           {
             MOTO_STATE=0;                        //电机停止运转
           }
           while(!STOP);
        }
}         
   switch(MOTO_STATE)
   {
     case0:IN1=1;IN2=1;break;
         case1:IN1=1;IN2=0;break;
         case2:IN1=0;IN2=1;break;
         default:MOTO_STATE=0;break;
   }
void main()
{
    INIT();                       //调用INIT函数
  while(1);
   {
   key_scan();
   moto_ctrl();
   P3=num[PWM];
   }
}
void Timer0() interrupt 1
  {
    TH0=(65536-1000)/256;                                            
   TL0=(65536-1000)%256;                 //初值重装         
   counter++;
   if(counter>=5){counter=0;}
   if(counter<PWM)ENA=1;
   if(counter>=PWM)ENA=0;
  }


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

使用道具 举报

沙发
ID:270556 发表于 2020-7-7 16:53 | 只看该作者
按键扫描,一般做在定时中断里边
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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