24小时热门版块排行榜    

查看: 452  |  回复: 2

eeds136

金虫 (著名写手)


[交流] 基于THB6128和ATMEGA8单片机的步进电机驱动程序设计

/*********************************************************************
程 序:DDC程序
版 本:   DDCdio_VER1.1
修改日期:2008.1.15
**********************************************************************/
#include <main.h>
#include "INCLUDES.h"
//***********************************************************************
//定义指针                                                              *
//************************************************************************/

/*********************************************************
*函数:void        wait(unsigned int n)
*功能:延时子程序
**********************************************************/
void        wait(unsigned int n){                        //ok
unsigned int        i;
        for(i=0;i<n;i++);
}
/*********************************************************
*函数:void        Data_ASC(unsigned char num )
*功能:数字转换为ASC码
**********************************************************/
void        Data_ASCII(unsigned char num,unsigned char * buf )
{
unsigned char a;
      a=(num>>4)&0x0f;
      if(a>9) buf[0]=a+0x37;
      else buf[0]=a+0x30;
      a=num&0x0f;
      if(a>9) buf[1]=a+0x37;
      else buf[1]=a+0x30;
}
/*********************************************************
*函数:unsigned char ASC_Data(unsigned char asch,unsigned char ascl )
*功能:ASC码转换为数字
**********************************************************/
unsigned char ASCII_Data(unsigned char* buf )
{
unsigned char a,b;
      a=buf[0]-0x30;
      if(a>9) a=a-0x07;
      b=buf[1]-0x30;
      if(b>9) b=b-0x07;
      a=(a<<4)|b;
      return (a);
}
/*********************************************************
*函数:void EEPROM_Data_Init()
*功能:EEPROM子程序
**********************************************************/
unsigned char XOR(unsigned char* buf,unsigned char Len)
{
unsigned char a,i;
    a=0;
    for(i=1;i<Len;i++)
    {
        a=a^buf;
    }
    return a;
}
/************************************************************************
*函数原型:  __interrupt void USART0_isr(void)       *
*参数说明:  外部中断1                 *
************************************************************************/
#pragma vector=USART_RXC_vect
__interrupt void USART_isr(void)
{
//__disable_interrupt();//disable all interrupts
unsigned char a;
     a=UDR;
     if(a==0x40)UART_offset=0;
     RX_buf[UART_offset]=a;
     UART_offset++;
     if(UART_offset==11)UART_message=1;
//__enable_interrupt(); //re-enable interrupts
}
/************************************************************************
*函数原型:  void timer1_init();       *
*参数说明:  timer1初始化  计数                 *
************************************************************************/
#pragma vector=TIMER0_OVF_vect
__interrupt void timer0_ovf_isr(void)
{
   
}
/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断                 *
***********************************************************************/
#pragma vector=TIMER1_OVF_vect
__interrupt void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
    TCNT1H = 0xE6; //reload counter high value
    TCNT1L = 0x23; //reload counter low value
    s_count++;
    if(LED_flag==0)
    {
        LED_L;
        LED_flag=1;
    }
    else
    {
        LED_H;
        LED_flag=0;
    }
}

/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断  
***********************************************************************/
void Dot_down( )
{
        DJ_FRE_H;                        /*6128使能*/
        DJ_UD_L;                        /*正转*/
        while((PIND&0x04)!=0x00)        /*产生clk,先加速,后匀速*/
        {
            DJ_CP_L;
            wait(1);
            DJ_CP_H;
            wait(1);
        }
        DJ_CP_L;
}
/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断  
***********************************************************************/
void step_down(unsigned int n)
{
        unsigned int i,j;
        
        DJ_FRE_H;                        /*6128使能*/
        DJ_UD_L;                        /*正转*/
        for(i=0;i<n;i++)        /*产生clk,先加速,后匀速*/
        {
          
           for(j=0;j<25600;j++)        /*产生clk,先加速,后匀速*/
           {
               if((PIND&0x04)==0x00)return;
               
                  DJ_CP_L;
                  wait(1);
                  DJ_CP_H;
                  wait(1);
               
          }
        }
      DJ_CP_L;
}
/*反转*/
void step_up(unsigned int n)
{
        unsigned int i,j;
        DJ_FRE_H;                        /*6128使能*/
        DJ_UD_H;                        /*正转*/
        for(i=0;i<n;i++)        /*产生clk,先加速,后匀速*/
        {
            for(j=0;j<25600;j++)        /*产生clk,先加速,后匀速*/
          {
            if((PIND&0x04)==0x00)return;
            
               DJ_CP_L;
                wait(1);
               DJ_CP_H;
               wait(1);
          }
        }
        DJ_CP_L;
}

/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断                 *
***********************************************************************/
void adc_init(void)
{
      DDRC&=0xfe;
      PORTC&=0xfe;
      ADCSR =0x00; //disable adc
      ADMUX = 0x40; //select adc input 0
      ACSR  = 0x80; //禁止模拟比较器
      ADCSR = 0x86;
}
/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断                 *
***********************************************************************/
unsigned char adc_IN0(void)
{
unsigned char b;
unsigned int a,i,temp[10];//
unsigned long l;

     for(i=0;i<10;i++)
      {
          ADMUX = 0x40;
          ADCSR |= 0xc0;
          wait(100);
          temp=ADC;
           
     }
     l=0;
      for(i=0;i<10;i++)
      {
            l=l+temp;//ADC_buf
      }
      a=(unsigned int)(l/10);
      b=(unsigned char)(a>>2);
      return b;
       
}
/*********************************************************
*函数:void EEPROM_Data_Init()
*功能:EEPROM子程序
**********************************************************/
void Ret_Data()
{
unsigned char a,temp[11],H[2];
    temp[0]=0x40;
    Data_ASCII(Mode_ID,H);
    temp[1]=H[0];
    temp[2]=H[1];
    Data_ASCII(4,H);
    temp[3]=H[0];
    temp[4]=H[1];
    Data_ASCII(ADC_Data,H);
    temp[5]=H[0];
    temp[6]=H[1];
    Data_ASCII(Dot_flag,H);
    temp[7]=H[0];
    temp[8]=H[1];
    a=XOR(temp,9);
    Data_ASCII(a,H);
    temp[9]=H[0];
    temp[10]=H[1];/**/
    Send_UART(temp,11);
    //Send_UART(RX_buf,11);
}
/*********************************************************
*函数:void EEPROM_Data_Init()
*功能:EEPROM子程序
**********************************************************/
void UART_Msg(unsigned char* buf)
{
unsigned char a,b;
unsigned char i,j;
unsigned char H[2],temp[15];
      H[0]=buf[1];
      H[1]=buf[2];
      b=ASCII_Data(H);
      if(b!=Mode_ID)
      {
          if(b!=0x00) return;
      }
      H[0]=buf[9];
      H[1]=buf[10];
      b=ASCII_Data(H);
      a=XOR(buf,9);
      if ( a != b )  return;//  校验正确
      j=1;
      for(i=0;i<4;i++)
      {
          H[0]=buf[j];
          j++;
          H[1]=buf[j];
          j++;
          temp=ASCII_Data(H);
      }
      
      //Send_UART(RX_buf,11);
      switch(temp[1])
      {
          case 0:
          {
              Dot_down( );  
              break;
          }
          case 1:
          {
                woke_flag=1;
                step_count=temp[2];
                cycle_count=temp[3];
                break;
          }
          case 2:
          {
                woke_flag=2;
                step_count=temp[2];
                break;
          }
          case 3:
          {
                woke_flag=3;
                //Send_UART(RX_buf,11);
                break;
          }
      }
}
/*********************************************************
*函数:void Send_com(unsigned char add,unsigned char com,unsigned char Dat,unsigned char flag)
*功能:发送命令子程序
**********************************************************/
void Send_com(unsigned char add,unsigned char com,unsigned char Dat,unsigned char flag)
{
unsigned char a,temp[15],H[2];
    temp[0]=0x40;
    Data_ASCII(add,H);
    temp[1]=H[0];
    temp[2]=H[1];
    Data_ASCII(com,H);
    temp[3]=H[0];
    temp[4]=H[1];
    Data_ASCII(Dat,H);
    temp[5]=H[0];
    temp[6]=H[1];
    Data_ASCII(flag,H);
    temp[7]=H[0];
    temp[8]=H[1];
    a=XOR(temp,9);
    Data_ASCII(a,H);
    temp[9]=H[0];
    temp[10]=H[1];
    Send_UART(temp,11);
}


/************************************************************************
*函数原型:  void main(void);       *
*参数说明:  主函数                   *
协议:0x40 地址(2)命令(2) 数据(2) 数据(2) 校验(2)
命令: 0: 回位
      1:按摩上行  数据1=高度    数据2=重复次数
      2:翻身上行
      3: 读数据
      4: 返回数据

************************************************************************/
void main(void)
{
unsigned int i;//a,
    wait(6000);
    init_devices();
    uart_init(4800);
    s_count=0;
    EN485_L;
    mS=0;
    way_flag=0;
    Mode_ID=(~PINB)&0x1f;
    for(i=0;i<Mode_ID;i++)wait(10000);
    if((PIND&0x04)!=0x00)Dot_down( );
    //Send_UART(RX_buf,9);
    while(1)
    {
          /*   Send_com(0,1,20,0);
            for(i=0;i<200;i++)wait(60000);

            Send_com(0,2,20,1);
           for(i=0;i<200;i++)wait(60000);
           */
        if((PIND&0x04)!=0x00) Dot_flag=0;
        else  Dot_flag=1;
        if((PIND&0x08)==0x00)step_up(1);
         
        if(UART_message==1)
        {
//__disable_interrupt();
            UART_Msg(RX_buf);
            //Send_UART(RX_buf,11);
            UART_message=0;
//__enable_interrupt();            
        }
        if(woke_flag==1)
        {
            if(cycle_count!=0)
            {
              step_up(step_count);
              Dot_down( );
              cycle_count--;
            }
            if(cycle_count==0)woke_flag=0;
        }
        if(woke_flag==2)
        {  
          step_down(step_count);
          woke_flag=0;
        }
        if(woke_flag==3)
        {  
           Ret_Data();
           woke_flag=0;
        }
        
        ADC_Data=adc_IN0();
        // Send_Data(ADC_Data);
    }
}
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 新建文本文档_(2).txt
  • 2013-08-31 09:29:07, 10.31 K

» 猜你喜欢

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
2013-08-31 11:48   回复  
mlanqiang3楼
2013-08-31 13:03   回复  
相关版块跳转 我要订阅楼主 eeds136 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 u1xkze8ybe 2026-07-30 7/350 2026-07-31 12:10 by syhhffkrym
[论文投稿] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 u1xkze8ybe 2026-07-30 3/150 2026-07-31 12:08 by syhhffkrym
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 u1xkze8ybe 2026-07-30 6/300 2026-07-31 12:05 by syhhffkrym
[教师之家] 基础研究怎么拉横向,学校到款任务越来越多,难以完成 拉横向,都有哪些途径啊 +6 锦衣卫寒战 2026-07-28 6/300 2026-07-31 11:27 by syl200707
[高分子] HXDI做水性聚氨酯乳液,是不是特别容易出渣 15+3 yuyusuv 2026-07-29 3/150 2026-07-31 09:21 by huizingga
[基金申请] 小木虫看见有人已经知道结果了 +15 1234567wang 2026-07-25 19/950 2026-07-31 08:30 by ZJTJZ
[基金申请] 2026年国自然面上资助率 +8 布布和一二 2026-07-30 8/400 2026-07-31 01:51 by alongwaytogo
[基金申请] 系统今天又提示维护了,估计离放榜不远了 +11 winnerche 2026-07-29 15/750 2026-07-30 23:08 by jnhyjjm
[基金申请] 微信指数没变化,科研之友没阅读 +14 wangze12014 2026-07-28 17/850 2026-07-30 20:10 by kissu88
[考博] 申请2027年材料/化学类博士 10+3 考研老狗? 2026-07-25 5/250 2026-07-30 19:33 by 白色木鱼
[基金申请] 你们的时间戳变了吗 +3 archvillain 2026-07-30 4/200 2026-07-30 18:53 by levinzhwen
[基金申请] 今年的WR进展到哪一步了? +5 wsgjhwz 2026-07-25 9/450 2026-07-30 12:59 by 可淡不可忘
[有机交流] 产物和副产物价值比较 30+4 小汤02 2026-07-27 5/250 2026-07-30 12:44 by czyzsu
[基金申请] 时间戳他又来了 +14 晓晓爱翠翠 2026-07-26 17/850 2026-07-29 16:30 by 呵呵二哥
[有机交流] 这个自发加氧反应的机理是什么? 50+4 YUAN2273 2026-07-25 7/350 2026-07-29 12:27 by xiaobenpu
[基金申请] 没消息就是被刷了呗 +13 lambert2014 2026-07-24 14/700 2026-07-29 10:38 by msh145800
[基金申请] 这种情况还有戏吗 +5 drbart 2026-07-27 11/550 2026-07-29 05:50 by drbart
[基金申请] 同事接到电话了,我却没有 +4 1234567wang 2026-07-27 4/200 2026-07-28 10:11 by GOODLUCKER
[基金申请] 准备明年的基金了 +5 Tide man 2026-07-27 5/250 2026-07-28 09:25 by newfuzzy1
[分析] 水蒸气蒸馏法乳化现象 +3 月光娇娇 2026-07-26 3/150 2026-07-26 23:25 by caiyun
信息提示
请填处理意见