24小时热门版块排行榜    

查看: 422  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 341求调剂(一志愿湖南大学070300) +5 番茄头--- 2026-03-22 6/300 2026-03-23 23:45 by Txy@872106
[考研] 299求调剂 +5 某某某某位 2026-03-21 5/250 2026-03-23 23:36 by 热情沙漠
[考研] 0703化学求调剂 +4 奶油草莓. 2026-03-22 5/250 2026-03-23 19:37 by pswait
[考研] 333求调剂 +3 ALULU4408 2026-03-23 3/150 2026-03-23 19:04 by macy2011
[考研] 材料与化工考研调剂 +4 孅華 2026-03-22 4/200 2026-03-23 16:13 by 一休哥FU
[考研] 315分,诚求调剂,材料与化工085600 +3 13756423260 2026-03-22 3/150 2026-03-22 20:11 by edmund7
[考研] 一志愿华中农业071010,总分320求调剂 +5 困困困困坤坤 2026-03-20 6/300 2026-03-22 17:41 by hxsm
[考研] 求调剂院校信息 +6 CX 330 2026-03-21 6/300 2026-03-22 15:25 by 无懈可击111
[考博] 招收博士1-2人 +3 QGZDSYS 2026-03-18 4/200 2026-03-22 10:25 by QGZDSYS
[基金申请] 山东省面上项目限额评审 +4 石瑞0426 2026-03-19 4/200 2026-03-22 08:50 by Wei_ren
[考研] 资源与环境 调剂申请(333分) +5 holy J 2026-03-21 5/250 2026-03-21 22:42 by Catalysis25
[考研] 材料求调剂 +5 @taotao 2026-03-21 5/250 2026-03-21 20:55 by lbsjt
[考研] 313求调剂 +4 肆叁贰壹22 2026-03-19 4/200 2026-03-21 17:33 by ColorlessPI
[考研] 材料工程(专)一志愿985 初试335求调剂 +3 hiloiy 2026-03-17 4/200 2026-03-21 03:04 by JourneyLucky
[考研] 一志愿华中科技大学,080502,354分求调剂 +5 守候夕阳CF 2026-03-18 5/250 2026-03-21 01:06 by JourneyLucky
[考研] 一志愿西南交大,求调剂 +5 材化逐梦人 2026-03-18 5/250 2026-03-21 00:26 by JourneyLucky
[考研] 274求调剂 +10 S.H1 2026-03-18 10/500 2026-03-20 23:51 by JourneyLucky
[考研] 353求调剂 +3 拉钩不许变 2026-03-20 3/150 2026-03-20 19:56 by JourneyLucky
[考研] 招收调剂硕士 +4 lidianxing 2026-03-19 12/600 2026-03-20 12:25 by lidianxing
[考研] 一志愿中国海洋大学,生物学,301分,求调剂 +5 1孙悟空 2026-03-17 6/300 2026-03-19 23:46 by zcl123
信息提示
请填处理意见