找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是论坛上照学的一个单片机测直流电机转速的一个例子,为啥我仿真的时候电机不转

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次(中奖概率 80%)
跳转到指定楼层
楼主
图片1为原图,2为我照搬的图

附上代码-------

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit open = P2^0;
sbit close = P2^1;
sbit swap = P2^2;
sbit sub_speed = P2^3;
sbit add_speed = P2^4;
        
sbit PWM1 = P3^0;
sbit PWM2 = P3^1;
/************************液晶显示*************/
sbit E=P3^7;
sbit RW = P3^6;
sbit RS = P3^5;
sbit test = P3^4;

int time = 0;
int high = 20;
int period = 30;
int change = 0;
int flag = 0;
int num_medium = 0;
int num_display = 0;
int count_speed = 0;
uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};   
         

/*******************延时t毫秒****************/
void delay(uchar t)
  {
        uint i;
        while(t)
         {
                    /*对于11.0592MHz时钟,延时1ms*/
                  for(i=0;i<125;i++);
                  t--;
                }
}

//写命令函数LCD
void wc51r(uchar j)
{
            RS=0;
                  RW=0;
         P1=j;
                  E=1;
                  E=0;
                 delay(3);
}

//写数据函数LCD
void wc51ddr(uchar j)
{
                  
                  RS=1;
                  RW=0;
         P1=j;
                  E=1;
                  E=0;
                  delay(2);
}


//初始化函数LCD
void init()
{
         wc51r(0x01);  //清屏
         wc51r(0x38);  //使用8位数据,显示两行,使用5*7的字型
         wc51r(0x0c);  //显示器件,光标开,字符不闪烁
         wc51r(0x06);  //字符不动,光标自动右移一格
}

        
/***********8T0中断服务程序************PWM波的生成**********/
void time0_int(void) interrupt 1
{
                        
                time++;
                TH0 = 0xec;
                TL0 = 0x78;
        
                if(change == 0)
                 {
                              PWM2 = 1;                                                
                        if(time == high)
                              PWM1=0;
                        else if(time == period)
                         {
                                  PWM1 = 1;
                                  time = 0;
                          }
                                                     
                 }
               
                else
                 {            PWM1 = 1;               
                                 if(time == high)
                                       PWM2=0;
                                 else if(time == period)
                                   {
                                   PWM2 = 1;
                                            time = 0;
                               }
}
                                                  
                }
/***************************************************************/
/****T1中断服务程序********单位时间(S)方波的个数*************/
void time1_int(void) interrupt 3
{   
                count_speed++;
         if(count_speed == 20)
                {     count_speed = 0;
                           num_display = num_medium;
                           num_medium = 0;
                 }
                                                            
}
/***************************************************************/

/************************速度显示的数据处理*********************/
void datamade()
{  
uint data MM,NN;
             wc51r(0xc2);
          wc51ddr('S');
                   wc51ddr('p');
                   wc51ddr('e');
                   wc51ddr('e');
                   wc51ddr('d');
          wc51ddr(0x3a);
                   NN = num_display%100;
                   MM = num_display/100;
                    wc51ddr(wword[MM]);
        
MM = NN/10;
              NN = NN%10;
wc51ddr(wword[MM]);
wc51ddr(wword[NN]);
                                                                    
}
/*****************************************************************/

/**********通过按键实现对电机开关、调速、转向的控制***************/
void motor_control()
{
                  if(open == 1)
                                EA = 1;
                  if(close == 1)
                                EA = 0;
                  if(swap == 1)
                         {
                                        change = ~change;
                                        while(swap != 0)
                                          {}
                                                   
                           }
                          
                        if(sub_speed == 1)
                                {
                                           high++;
                                         if(high == 30)
                                                EA=0;
                                       while(sub_speed != 0)
                                                   {}
                                  }
               
                         if(add_speed == 1)
                                {
                                                   high--;
                                                if(high == 5)
                                                   high = 5;
                                       while(add_speed != 0)
                                                   {}
                                 }
        }

/******************************************************************/


/***************************主函数*********************************/
void main()
        {
                     P2 = 0x00;
                        
                         ET0 = 1;
                         ET1 = 1;
                         TMOD = 0x11;
                         TH0 = 0xec;             //定时器T0设置参数
                         TL0 = 0x78;

                         TH1 = 0x3c;            //定时器T1设置参数
                         TL1 = 0xb0;
                         TR0 = 1;
                         TR1 = 1;
        
               init();               //液晶显示初始化程序
                                                                                 
                while(1)
                {                                                
                     wc51r(0x84);
                     wc51ddr('H');
                     wc51ddr('e');
                     wc51ddr('l');
                     wc51ddr('l');
                     wc51ddr('o');   
                          if(test == 0)
                     num_medium++;
datamade();
motor_control();
                          
           }
}

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

使用道具 举报

沙发
ID:732506 发表于 2020-5-11 04:46 | 只看该作者
从图上看电机不一样。
回复

使用道具 举报

板凳
ID:773778 发表于 2020-6-9 17:23 | 只看该作者
你的激励源弄错了吧,那不是电源
回复

使用道具 举报

地板
ID:600952 发表于 2020-6-10 09:53 | 只看该作者
是啊,那个好像不是电源,再可能就是电机不一样,好像别的地方都一样啊
你照搬的真规整,Q1 D1 R1 等都对应上了。
原图没发工程文件吗?下下来直接用多好啊
希望对你有帮助
回复

使用道具 举报

5#
ID:656801 发表于 2020-6-10 14:31 | 只看该作者
P3口没有配置上拉输出吧? 单片机管脚能输出高电平么?
回复

使用道具 举报

6#
ID:633896 发表于 2020-7-7 12:10 | 只看该作者
会不会是电机的问题
回复

使用道具 举报

7#
ID:595237 发表于 2020-7-8 00:15 | 只看该作者

只是一组波工作 能够可以驱动电机吗?
理论上 上一组与下一组 是 对称的 就可以 驱动电机。
回复

使用道具 举报

8#
ID:764088 发表于 2020-7-8 15:56 | 只看该作者
不是抄软件就能驱动电机的啊!您的直流电机参数如何?如所需 驱动电流 多大啊?您现在输出配得上吗?
回复

使用道具 举报

9#
ID:235954 发表于 2020-7-12 07:14 | 只看该作者
激励源应该用错了,你用5V,它实际要用12V或者24V才能驱动,你明显是电桥的电压没有给对。
回复

使用道具 举报

10#
ID:795846 发表于 2020-7-16 10:38 | 只看该作者
你的电机需要多大电压,你的电源能供多大的电压。是不是你的电源供电不够,导致电机不会转。改一下电源的赋值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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