| 查看: 422 | 回复: 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
» 猜你喜欢
284求调剂
已经有10人回复
一志愿山东大学药学学硕求调剂
已经有4人回复
07化学280分求调剂
已经有4人回复
298-一志愿中国农业大学-求调剂
已经有12人回复
求材料,环境专业调剂
已经有3人回复
335求调剂
已经有5人回复
求调剂
已经有7人回复
一志愿吉大化学322求调剂
已经有4人回复
环境学硕288求调剂
已经有8人回复
341求调剂(一志愿湖南大学070300)
已经有6人回复
» 抢金币啦!回帖就可以得到:
人生已过半程,不惑之年渐近,回望来时路,满心皆是感恩。
+5/1585
2026年国基求好运!
+5/190
国自然面上祈福
+1/81
欢迎08或部分07开头的有缘人报考
+1/47
哈尔滨工业大学(深圳)-何自开教授团队诚招化学工程与技术专业博士研究生
+1/35
招收材料、化学类调剂生,专硕学硕均可
+1/33
上海交大化院功能大分子团队招2026年硕士、联培、博士后
+1/31
双一流大学湘潭大学“化工过程模拟与强化”国家地方联合工程研究中心招收各类博士生
+1/18
南昌一本市政工程接受调剂
+1/12
电子信息求调剂
+1/12
中国中医科学院中医药健康产业研究所(江西中医药健康产业研究院)2026年高层次人才等
+1/6
南医大基础医学院招收调剂生(2生信1生物))
+1/5
MDPI下IJMS投稿 pending editor decision 9天
+1/3
天津工业大学双一流高校招博士、硕士、博士后
+1/3
哈尔滨工业大学(深圳)罗文坚老师课题组2026年诚招博士生
+1/3
中国科学院上海硅酸盐研究所招聘科研助理
+1/3
中国科学院上海硅酸盐研究所招聘科研助理
+1/3
招收化工与材料学科点研究生
+1/2
【科研干货】纳米抗体凭什么成为实验室“新宠”?附优质制备服务商参考
+1/2
天津大学理学院分离分析及功能材料研究组
+1/2
简单回复
2013-08-31 11:48
回复
2013-08-31 13:03
回复













回复此楼