STC89C52RC驱动无刷电机电调程序,请大神帮忙改改。以及电路问题。
胖喵可不胖2015/06/11电子技术 IP:北京
问题是这样的。我想用STC89C52RC给电调油门输入PWM波。进而驱动无刷电机。我看了些资料,找了些例子,然而还是不太懂。舵机代码是这样的。
#include <reg51.h> 
#define uchar unsigned char 
#define uint unsigned int
  
/*
变量定义
*/
uchar key_stime_counter,hight_votage=15,timeT_counter; 
bit key_stime_ok;
  
/*
引脚定义
*/
sbit control_signal=P0^0; 
sbit turn_left=P3^4;
sbit turn_right=P3^5;
  
/*****************************************************************
名称:定时器0初始化
功能:20ms定时,11.0592M晶振
初值=65536-11059200*0.02/12=65536-18432=47104=0xB800   20ms
初值=65536-11059200*0.0001/12=65536-92.16=64430=0xFFA3 0.1ms
*****************************************************************/
void TimerInit()
{     
    control_signal=0;
    TMOD=0x01;                               //设置定时器0为工作方式1
    EA=1;                                   //开总中断
    ET0=1;                                   //定时器0中断允许
    TH0 = 0xFF;                        //定时器装初值
    TL0 = 0xA3;
    TR0=1;          //启动定时器0                                
}
  
/**********************************************
定时器0中断服务函数
***********************************************/
void timer0(void) interrupt 1 using 0 
{
    TH0=0xFF;
    TL0=0xA3; //定时器0重新装入数值
  
if (++key_stime_counter>=200)
{
    key_stime_counter=0;
    control_signal=1;
    key_stime_ok = 1;               // 20ms到 
    timeT_counter=0;
}
  
if (key_stime_ok&&(++timeT_counter>=hight_votage))
{
    key_stime_ok=0;
    timeT_counter=0;
    control_signal=0;              // hight_votage*0.1ms到 
}
}
  
/*********************************************
名称:键盘扫描
功能:在按键稳定期内判断键值,并返回键值
**********************************************/
uchar keyscan(void)
{
    static char key_state = 0;
    static char key_value = 0;
    uchar key_press, key_return = 0;
    key_press = turn_left & turn_right;     //读按键I/O电平
               
    switch (key_state) 
    {
        case 0 :     // 按键初始态
            if (key_press==0) key_state = 1; // 键被按下,但需要确认是否是干扰
            break;
        case 1 :     // 按键确认态
            if (key_press==0)//如有键按下则不是干扰,判断键值
            {                   
                if(turn_left==0)               //判断是哪一个按键被按下
                {
                    key_value=1;       //按键较多时可采用switch选择结构
                } 
                else if(turn_right==0)
                {
                    key_value=2;
               }
                else
                {
                   key_value=0;
                    key_state = 2; // 状态转换到键释放态
                }
            }
            else
            {
                key_state = 0; // 按键已抬起,属于干扰,转换到按键初始态
            }
            break;
        case 2 :
            if (key_press==1) 
            {
                key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value
                key_value=0;
                key_state = 0; //如果按键释放,转换到按键初始态
            }
            break;
    }
    return key_return; //返回键值
}
  
/*********************************************
名称:按键处理
功能:
**********************************************/
void key_operation(void)
{    
    switch (keyscan())      //根据键值不同,执行不同的内容
    {
        case 1:
            hight_votage -= 1;
            if(hight_votage < 5)
            {
                hight_votage = 5;
            }
            break;
        case 2:
            hight_votage += 1;
            if(hight_votage > 25)
            {
                hight_votage = 25;
            }
            break;
        default :
            break;
    } 
}
  
  
//LED显示函数
void diplay()
{
    if(hight_votage>=5&&hight_votage<=7) p1="0xFD;  " 1灯亮,舵机接近或到达右转极限位置     if(hight_votage>7&&hight_votage<=10) p1="0xFB;  " 2灯亮     if(hight_votage>10&&hight_votage<=13) p1="0xF7;  //3灯亮"     if(hight_votage>13&&hight_votage<=16) p1="0xEF;  //4灯亮,舵机到达中间位置"     if(hight_votage>16&&hight_votage<=19) p1="0xDF;  //5灯亮"     if(hight_votage>19&&hight_votage<=22) p1="0xBF;  //6灯亮"     if(hight_votage>22&&hight_votage<=25) p1="0x7F;  //7灯亮,舵机接近或到达左转极限位置" }    *主程序* void main(void) {     timerinit();     while(1)     {         key_operation();         diplay();     } }< code></=25)></=22)></=19)></=16)></=13)></=10)></=7)></reg51.h>
来自:电子信息 / 电子技术
13
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
胖喵可不胖 作者
9年8个月前 IP:北京
772799
1:这个按钮是哪两个引脚?是P34和P35吗?P00为方波输出?
2:怎样把显示部分改成用1602显示?
3:已经按键的电路怎么做?直接接地是否可以?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年8个月前 IP:北京
772940
冷场~[s::L]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
仓生木品
9年8个月前 IP:湖南
772998
对电调不熟
1602显示的代码可以参考一下
/*-----------------------------------------------
  名称:LCD1602
  编写:shifang
  日期:2009.5
  修改:无
  内容:通过标准程序动态显示字符
  引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
 
sbit RS = P2^4;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^6;
 
#define RS_CLR RS=0 
#define RS_SET RS=1
 
#define RW_CLR RW=0 
#define RW_SET RW=1 
 
#define EN_CLR EN=0
#define EN_SET EN=1
 
#define DataPort P0
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
      
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
 }
}
/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 bit LCD_Check_Busy(void) 
 { 
 DataPort= 0xFF; 
 RS_CLR; 
 RW_SET; 
 EN_CLR; 
 _nop_(); 
 EN_SET;
 return (bit)(DataPort & 0x80);
 }
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com) 
 {  
// while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
 { 
 //while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
 }
 
/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 LCD_Write_Com(0x01); 
 DelayMs(5);
 }
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
 if (y == 0) 
    {     
     LCD_Write_Com(0x80 + x);     
    }
 else
    {     
    LCD_Write_Com(0xC0 + x);     
    }        
 while (*s) 
    {     
 LCD_Write_Data( *s);     
 s ++;     
    }
 }
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
 if (y == 0) 
    {     
    LCD_Write_Com(0x80 + x);     
    }    
 else
    {     
    LCD_Write_Com(0xC0 + x);     
    }        
 LCD_Write_Data( Data);  
 }
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
 void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }
    
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void) 
{ 
unsigned char i; 
unsigned char *p; 
 
LCD_Init(); 
 
while (1) 
 {  
 i = 1;  
 p = "www.doflye.net";  
 LCD_Clear();  
 LCD_Write_String(2,0,"Welcome to");  
 DelayMs(250);   
 while (*p) 
    {   
    LCD_Write_Char(i,1,*p);   
    i ++;   
    p ++;   
    DelayMs(250);   
    }  
  DelayMs(250);  
 }
}</intrins.h></reg52.h>
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
不死野人
9年8个月前 IP:广东
773010
默默点个赞
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
hansd
9年7个月前 IP:浙江
773321
代码没看,楼主确定不是电调油门保护了?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
月下孤狼
9年7个月前 IP:四川
773353
为什么不用STC12C5A60s2?这个带推挽模式输出,适合驱动MOS管。
89C52是过时的STC产品,官网都不推荐使用
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年7个月前 IP:北京
773413
引用 hansd:
代码没看,楼主确定不是电调油门保护了?
电调认为输入油门过大。所以进入编程模式了。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年7个月前 IP:北京
773414
引用 月下孤狼:
为什么不用STC12C5A60s2?这个带推挽模式输出,适合驱动MOS管。
89C52是过时的STC产品,官网都不推荐使用
哦哦,谢谢。只是我手里的52有现成的最小系统板,已经烧录器都有,所以就先用这个了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年7个月前 IP:北京
773415
引用 仓生木品:
对电调不熟
1602显示的代码可以参考一下
/*-----------------------------------------------
  名称:LCD1602
  编写:shifang
  日期:2009.5
  修改...
谢谢。我改改用。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
仓生木品
9年7个月前 修改于 9年7个月前 IP:湖南
773523
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年7个月前 IP:北京
773544
引用 仓生木品:
【PERIAN作品】51单片机自制8通道2.4G遥控器简明教程!!!
推荐楼主看一下这个教程。
谢谢层主~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
osfg
9年7个月前 IP:广东
773558
引用 wjd_213:
哦哦,谢谢。只是我手里的52有现成的最小系统板,已经烧录器都有,所以就先用这个了。
别用死特惨了,贵又不稳
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
胖喵可不胖
机友 笔友
文章
20
回复
229
学术分
0
2013/05/06注册,3年2个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}