STC89C52RC驱动无刷电机电调程序,请大神帮忙改改。以及电路问题。
胖喵可不胖2015/06/11电子技术 IP:北京
问题是这样的。我想用STC89C52RC给电调油门输入PWM波。进而驱动无刷电机。我看了些资料,找了些例子,然而还是不太懂。舵机代码是这样的。
<code class="lang-cpp">#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></code>
来自:电子信息 / 电子技术
13
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
胖喵可不胖 作者
9年0个月前 IP:北京
772799
1:这个按钮是哪两个引脚?是P34和P35吗?P00为方波输出?
2:怎样把显示部分改成用1602显示?
3:已经按键的电路怎么做?直接接地是否可以?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年0个月前 IP:北京
772940
冷场~[s::L]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年0个月前 IP:北京
773413
引用 hansd:
代码没看,楼主确定不是电调油门保护了?
电调认为输入油门过大。所以进入编程模式了。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年0个月前 IP:北京
773414
引用 月下孤狼:
为什么不用STC12C5A60s2?这个带推挽模式输出,适合驱动MOS管。
89C52是过时的STC产品,官网都不推荐使用
哦哦,谢谢。只是我手里的52有现成的最小系统板,已经烧录器都有,所以就先用这个了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
9年0个月前 IP:北京
773415
引用 仓生木品:
对电调不熟
1602显示的代码可以参考一下
/*-----------------------------------------------
  名称:LCD1602
  编写:shifang
  日期:2009.5
  修改...
谢谢。我改改用。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
胖喵可不胖作者
8年11个月前 IP:北京
773544
引用 仓生木品:
【PERIAN作品】51单片机自制8通道2.4G遥控器简明教程!!!
推荐楼主看一下这个教程。
谢谢层主~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

所属专业
所属分类
上级专业
同级专业
胖喵可不胖
机友 笔友
文章
20
回复
229
学术分
0
2013/05/06注册,2年6个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

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