基于运动系统的一种智能调节系统
admin 于 2013年06月07日 发表在 嵌入式开发笔记
一方面,由于同类的东西网上这方面的资料很少,而项目中大多东西都是经过自己探索或者验证过的,对于想搞单片机控制类的朋友来说,个人认为还是有很大帮助的;另一方面,源代码是自己研究了很长时间才写出来的,感觉可能会大家的编程有所帮助吧;
总之,希望能够帮助大家。
源代码:点击下载附件
#include "reg52.h" #define uchar unsigned char #define uint unsigned int sbit A1=P1^0; //定义步进电机连接端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; sbit A2=P1^4; //定义步进电机连接端口 sbit B2=P1^5; sbit C2=P1^6; sbit D2=P1^7; sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3; sbit key_up = P2^0; sbit key_right = P2^1; sbit key_left = P2^2; sbit key_down = P2^3; sbit x2 = P2^4; sbit x3 = P2^5; sbit LATCH1=P2^6; sbit LATCH2=P2^7; uint up=0; uint down=0; uint left=0; uint right=0; #define Coil_A1{A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电 #define Coil_OFF1 {A1=0;B1=0;C1=0;D1=0;}//全部断电 #define Coil_A2{A2=1;B2=0;C2=0;D2=0;}//A相通电,其他相断电 #define Coil_B2 {A2=0;B2=1;C2=0;D2=0;}//D相通电,其他相断电 #define Coil_C2 {A2=0;B2=0;C2=1;D2=0;}//C相通电,其他相断电 #define Coil_D2 {A2=0;B2=0;C2=0;D2=1;}//D相通电,其他相断电 #define Coil_OFF2 {A2=0;B2=0;C2=0;D2=0;}//全部断电 void Init_Timer0(void); uchar code Duan_Ma[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code Wei_Ma[]= {0xfe,0xfd,0xfb,0xf7}; //1~4选中数码管 uchar TempData[8]; unsigned FFW[8]= {0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转 void DelayUs2x(uchar t) { while(--t); } /* 1Ms延时 */ void Delay_Ms(uchar t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 PT0=1; //优先级打开 } void Display(unsigned char FirstBit,unsigned char Num) { static uchar i=0; P0=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0; P0=Wei_Ma[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; P0=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0; } void turn_up(num) { Coil_A1;//A相通电,其他相断电 Delay_Ms(num); Coil_B1;//B相通电,其他相断电 Delay_Ms(num); Coil_C1;//C相通电,其他相断电 Delay_Ms(num); Coil_D1;//D相通电,其他相断电 Delay_Ms(num); Coil_OFF1;//全部断电 } void turn_down(num) { Coil_D1;//D相通电,其他相断电 Delay_Ms(num); Coil_C1;//C相通电,其他相断电 Delay_Ms(num); Coil_B1;//B相通电,其他相断电 Delay_Ms(num); Coil_A1;//A相通电,其他相断电 Delay_Ms(num); Coil_OFF1;//全部断电 } void turn_right(num) { Coil_A2;//A相通电,其他相断电 Delay_Ms(num); Coil_B2;//B相通电,其他相断电 Delay_Ms(num); Coil_C2;//C相通电,其他相断电 Delay_Ms(num); Coil_D2;//D相通电,其他相断电 Delay_Ms(num); Coil_OFF2;//全部断电 } void turn_left(num) { Coil_D2;//D相通电,其他相断电 Delay_Ms(num); Coil_C2;//C相通电,其他相断电 Delay_Ms(num); Coil_B2;//B相通电,其他相断电 Delay_Ms(num); Coil_A2;//A相通电,其他相断电 Delay_Ms(num); Coil_OFF2;//全部断电 } void motorf1() { unsigned char i; unsigned int a; if(K1==1) { for (i=0; i<8; i++) //一个周期转30度 { P1 = FFW[i]&0x1f; Delay_Ms(8); } } if(K3==1) { for (i=0; i<8; i++) { a= FFW[i]&0x1f; a = (a>>4 | a<<4); P1 = a; Delay_Ms(8); } } } //调节转速 void motorf2() { unsigned char i; unsigned int a; if(K3==1) { for (i=0; i<8; i++) //一个周期转30度 { P1 = FFW[8-i]&0x1f; Delay_Ms(8); } } if(K4==1) { for (i=0; i<8; i++) { a= FFW[8-i]&0x1f; a = (a>>4 | a<<4); P1=a; } Delay_Ms(8); //调节转速 } } main() { uchar k=0; uchar num; uchar n=0; uint flag=1; Init_Timer0(); Coil_OFF1; Coil_OFF2; while(1) { motorf1(); motorf2(); if(x2 == 0) { num = 60; } if(x3 == 0) { num = 10; } else { num=30; } /* 上步进电机控制 */ if(up>down) { if(key_up == 0) { Delay_Ms(50); if(key_up==0) { k++; up++; turn_up(num); } } else if (key_down == 0) { Delay_Ms(50); if(key_down==0) { k--; down++; turn_down(num); } } } else if(up<down) { if(key_up == 0) { Delay_Ms(50); if(key_up==0) { k--; up++; turn_up(num); } } else if(key_down == 0) { Delay_Ms(50); if(key_down==0) { k++; down++; turn_down(num); } } } else if(up==down) { if(key_up == 0) { Delay_Ms(50); if(key_up==0) { k++; up++; turn_up(num); } } else if (key_down == 0) { Delay_Ms(50); if(key_down==0) { k++; down++; turn_down(num); } } } /* 左右步进电机控制 */ if(left>right) { if(key_left == 0) { Delay_Ms(50); if(key_left==0) { n++; left++; turn_left(num); } } else if (key_right == 0) { Delay_Ms(50); if(key_right==0) { n--; right++; turn_right(num); } } } else if(left<right) { if(key_left == 0) { Delay_Ms(50); if(key_left==0) { n--; left++; turn_left(num); } } else if(key_right == 0) { Delay_Ms(50); if(key_right==0) { n++; right++; turn_right(num); } } } else if(left==right) { if(key_left == 0) { Delay_Ms(50); if(key_left==0) { n++; left++; turn_left(num); } } else if (key_right == 0) { Delay_Ms(50); if(key_right==0) { n++; right++; turn_right(num); } } } TempData[0]=Duan_Ma[k/10];//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[1]=Duan_Ma[k%10]; TempData[2]=Duan_Ma[n/10];//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[3]=Duan_Ma[n%10]; } } void Timer0_isr(void) interrupt 1 { TH0=(65536-1000)/256; //重新赋值 1ms TL0=(65536-1000)%256; Display(0,8); }