| 查看: 420 | 回复: 2 | |||
[交流]
基于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
» 猜你喜欢
欢迎采矿、地质、岩土、计算机、人工智能等专业的同学报考
已经有5人回复
279求调剂
已经有4人回复
284求调剂
已经有8人回复
材料复试调剂
已经有4人回复
本子写完了,给DS兄弟看了,得了92分
已经有7人回复
求调剂
已经有6人回复
材料学硕318求调剂
已经有13人回复
一志愿郑大材料学硕298分,求调剂
已经有5人回复
材料化工调剂
已经有13人回复
材料学硕318求调剂
已经有5人回复
» 抢金币啦!回帖就可以得到:
有机
+1/100
福建师范大学环境与资源学院刘斯宝课题组招聘青年教师(带编)
+1/78
重庆大学李延军课题组招聘有机/药化方向青年教师、博士后和研究助理数名
+1/78
招中药学和药学专业研究生
+1/39
西安交通大学杜宝吉课题组招收2026统考硕士生
+1/30
深圳90理工男找FOR女
+1/17
电子科技大学材料学院SFT创新中心招收博士生及科研助理 长期有效
+1/12
LOOK 26届 || 计算机、电子信息类、电科、控制、通信考研T j信息醇:74o8 766 2o
+1/12
26届计算机、电子信息类、电科、控制、通信考研T j信息pp骏:74+08+76+6+20
+1/11
深圳理工大学刘鑫课题组高薪招聘博士后
+1/7
you can see 26届计算机、电子信息类、电科考研T j信息pp骏:74+08+76+6+20/
+1/7
2026年 陕西科技大学 环境学院 招收博士生(化学/材料/环境/生物 背景均可)
+1/6
香港科技大学 招生 2026 Fall全奖博士 -- 机械/电子/材料
+1/6
曲阜师范大学 化学与化工学院 赵育磊教授课题组 接收报考研究生或调剂生2人
+1/6
香港城市大学招聘博士后 (有机合成/催化/流动化学)
+1/5
大连理工大学智能系统实验室优秀博士研究生招生
+1/3
青岛科技大学高分子学院乌皓副教授招收2026年硕士研究生(含调剂)
+1/3
海南大学-国家级人才团队 招2026级全日制硕士研究生
+1/2
湖南理工学院有机合成化学方向招收化学化工类调剂学生
+1/2
青岛科技大学高分子学院--让我们一起做有趣的研究
+1/1
简单回复
2013-08-31 11:48
回复
2013-08-31 13:03
回复













回复此楼