24小时热门版块排行榜    

查看: 423  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 284求调剂 +10 Zhao anqi 2026-03-22 10/500 2026-03-24 00:08 by Equinoxhua
[考研] 07化学280分求调剂 +4 722865 2026-03-23 4/200 2026-03-24 00:01 by chixmc
[考研] 求调剂 +7 十三加油 2026-03-21 7/350 2026-03-23 23:48 by 热情沙漠
[考研] 环境学硕288求调剂 +8 皮皮皮123456 2026-03-22 8/400 2026-03-23 23:47 by 热情沙漠
[考研] 299求调剂 +5 某某某某位 2026-03-21 5/250 2026-03-23 23:36 by 热情沙漠
[考研] 335分 | 材料与化工专硕 | GPA 4.07 | 有科研经历 +4 cccchenso 2026-03-23 4/200 2026-03-23 23:00 by 徐ckkk
[考研] 一志愿陕师大生物学071000,298分,求调剂 +3 SYA! 2026-03-23 3/150 2026-03-23 19:09 by macy2011
[考研] 上海电力大学材料防护与新材料重点实验室招收调剂研究生(材料、化学、电化学,环境) +3 我爱学电池 2026-03-23 3/150 2026-03-23 17:16 by AZMK
[考研] 材料与化工考研调剂 +4 孅華 2026-03-22 4/200 2026-03-23 16:13 by 一休哥FU
[考研] 308求调剂 +3 墨墨漠 2026-03-21 3/150 2026-03-22 16:54 by i_cooler
[考研] 269专硕求调剂 +6 金恩贝 2026-03-21 6/300 2026-03-22 14:31 by ColorlessPI
[考研] 求调剂 +7 Auroracx 2026-03-22 7/350 2026-03-22 12:38 by 素颜倾城1988
[考研] 材料与化工(0856)304求B区调剂 +3 邱gl 2026-03-20 7/350 2026-03-21 19:05 by 15709483992
[考研] 材料 271求调剂 +5 展信悦_ 2026-03-21 5/250 2026-03-21 17:29 by 学员8dgXkO
[考研] 302求调剂 +12 呼呼呼。。。。 2026-03-17 12/600 2026-03-21 17:29 by ColorlessPI
[基金申请] 学校已经提交到NSFC,还能修改吗? 40+4 babangida 2026-03-19 9/450 2026-03-21 16:12 by babangida
[考研] 085700资源与环境308求调剂 +12 墨墨漠 2026-03-18 13/650 2026-03-21 01:42 by JourneyLucky
[考研] 求调剂,一志愿:南京航空航天大学大学 ,080500材料科学与工程学硕,总分289分 +4 @taotao 2026-03-19 4/200 2026-03-20 22:14 by JourneyLucky
[考研] 329求调剂 +9 想上学吖吖 2026-03-19 9/450 2026-03-20 22:01 by luoyongfeng
[考研] 考研求调剂 +3 橘颂. 2026-03-17 4/200 2026-03-17 21:43 by 有只狸奴
信息提示
请填处理意见