历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2020年02月12日 | 51单片机控制两个步进电机

2020-02-12 来源:51hei

/*-----------------------------------------------
步进电机控制
------------------------------------------------*/

#include

#define KeyPort P3
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量

sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit a1=P1^4; //定义步进电机连接端口
sbit b1=P1^5;
sbit c1=P1^6;
sbit d1=P1^7;

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#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_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

#define Coil_ab1 {a1=1;b1=1;c1=0;d1=0;}//AB相通电,其他相断电
#define Coil_bc1 {a1=0;b1=1;c1=1;d1=0;}//BC相通电,其他相断电
#define Coil_cd1 {a1=0;b1=0;c1=1;d1=1;}//CD相通电,其他相断电
#define Coil_da1 {a1=1;b1=0;c1=0;d1=1;}//D相通电,其他相断电
#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;}//全部断电

unsigned char Speed=1;
bit StopFlag;
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0(void);
unsigned char KeyScan(void);
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main()
{
unsigned int i=512;//旋转一周时间
unsigned char num;
Init_Timer0();
Coil_OFF
        Coil_OFF1
while(1)  //正向
  { 
   num=KeyScan();    //循环调用按键扫描
   if(num==1)//第一个按键,速度等级增加
      {
           if(Speed<18)
           Speed++;
          }        
   else if(num==2)//第二个按键,速度等级减小
      {
           if(Speed>1)
           Speed--;
          }        
   else if(num==3)//电机停止
     {
      Coil_OFF
                         Coil_OFF1
          StopFlag=1;
          }
   else if(num==4)//电机启动
     {
          StopFlag=0;
          }
  //分解显示信息,如要显示68,则68/10=6  68%10=8  
  TempData[0]=dofly_DuanMa[Speed/10];
  TempData[1]=dofly_DuanMa[Speed%10];
  }
}

/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示
从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
          

           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;

           i++;
       if(i==Num)
              i=0;


}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
PT0=1;           //优先级打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
static unsigned char times,i,j;
TH0=(65536-1000)/256;                  //重新赋值 1ms
TL0=(65536-1000)%256;

Display(0,8);
if(!StopFlag)
   {
  if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2
   {
   times=0;
   switch(i)
       {
          case 0:Coil_A1;i++;break;
                case 1:Coil_B1;i++;break;
                case 2:Coil_C1;i++;break;
                case 3:Coil_D1;i++;break;
                case 4:i=0;break;
            default:break;
                         }
         switch(j)
       {
          case 0:Coil_a1;j++;break;
                case 1:Coil_b1;j++;break;
                case 2:Coil_C1;j++;break;
                case 3:Coil_d1;j++;break;
                case 4:j=0;break;
            default:break;
           }
    }
times++;
  }
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
   {
    DelayMs(10);
    if(KeyPort!=0xff)
           {
            keyvalue=KeyPort;
            while(KeyPort!=0xff);
                switch(keyvalue)
                {
                 case 0xfe:return 1;break;
                 case 0xfd:return 2;break;
                 case 0xfb:return 3;break;
                 case 0xf7:return 4;break;
                 case 0xef:return 5;break;
                 case 0xdf:return 6;break;
                 case 0xbf:return 7;break;
                 case 0x7f:return 8;break;
                 default:return 0;break;
                }
          }
   }
   return 0;
}

推荐阅读

史海拾趣

驰兴电感(Coilank)公司的发展小趣事

驰兴电感始终坚持“品质第一”的原则,对产品的每一个细节都进行严格把控。公司引进了先进的生产设备和检测仪器,确保产品从原材料到成品的每一个环节都符合高标准的质量要求。这种对品质的执着追求,使得驰兴电感的产品在市场上赢得了良好的口碑,树立了高品质的品牌形象。

Califia Lighting公司的发展小趣事

在环保理念日益深入人心的背景下,Califia Lighting积极响应国家号召,致力于推动绿色照明技术的发展。公司研发了一系列环保型LED产品,降低了能源消耗和环境污染。同时,公司还关注未来照明技术的发展趋势,不断探索新的应用领域和市场机会,为公司的可持续发展奠定了坚实基础。

通过以上五个故事,我们可以看到Califia Lighting公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和绿色发展等方面的不断努力,逐渐成为了电子照明行业的佼佼者。

Cedrat Technologies公司的发展小趣事

在电子行业中,振动控制是一个至关重要的领域。Cedrat Technologies凭借其在压电技术领域的深厚积累,成功开发了一套主动振动控制系统。该系统通过精确监测机械结构或设备的振动情况,利用压电执行器产生相位相反的振动信号,有效抵消原始振动。这一技术的问世,不仅大幅提升了设备的稳定性和精度,也为机械结构的振动控制开辟了新的途径。Cedrat Technologies因此在电子行业中树立了新的技术标杆。

Cardinal Components公司的发展小趣事

2003年,Cardinal推出了首款可编程振荡器,这一创新产品为客户提供了更多的灵活性和定制性。随着技术的不断进步,公司在2006年引入了现场编程能力,进一步提升了产品的竞争力。这些技术创新不仅推动了公司的发展,也为整个电子行业带来了新的机遇。

科达嘉CODACA公司的发展小趣事

随着电子行业的快速发展,科达嘉意识到技术革新是企业持续发展的关键。因此,公司不断增加自动化生产设备,购置先进的质量测试仪器,并筹建了电感元器件分析实验室和标准的AEC-Q200可靠性实验室。这些举措大大增强了公司的研发分析能力,提升了产品质量和生产效率。科达嘉逐渐形成了以材料研发、产品研发、生产、质量及物控为基础的完整产业链。

Fedco_Batteries公司的发展小趣事

Fedco_Batteries的创始人李先生,在电子产业蓬勃发展的年代,看到了电池领域的巨大潜力。他凭借对技术的热爱和对市场的敏锐洞察,决定投身电池制造行业。创业初期,公司面临着资金短缺、技术瓶颈等重重困难。然而,李先生带领团队日夜兼程,不断研发新型电池技术,最终成功推出了一款性价比高、性能稳定的电池产品,打开了市场的大门。

问答坊 | AI 解惑

S3C6410 CE6 RAM从128M升级到256M,修改config.bib和image_cfg.h,导致无法启动系统了。

config.bib如下 IF IMGMULTIXIP ! #define     NKNAME       NK #define     RAMNAME      RAM #define     NKSTART     ...…

查看全部问答>

招聘Wince开发工程师

,地点深圳,有意发邮件到k_s@126.com…

查看全部问答>

SD卡初始化及读写问题

我在初始化时下CMD0, CMD55等命令均不能成功,不知道是什么原因? 还有CMD命令的执行是否牵涉到Interrupt,也就是说CMD命令的执行是否用到Interrupt, 我对这方面了解不多,请各位多多指点。…

查看全部问答>

请高手前来帮忙-难题!

情况如下: 开发板为AU1200,自己进行了重开发。换掉了原来的网卡芯片。换成了DM9000AE 板子启动后。在YAMON无法网络下载(问题1.这里是否可以修改YAMON的源码,将网卡配置通?如果可以请告之方法,我对此一无所知。),通过串口下载了eboot.sre ...…

查看全部问答>

IAR ARM5.20调试时光标不在源文件窗口

IAR ARM5.20调试时光标不在源文件窗口,有的项目则能在源文件窗口,很奇怪!…

查看全部问答>

LM3S811串口下载程序问题

买的LM3S811开发板中自带boot_serial中,自动检测某个GPIO引脚(该引脚的作用是接收更新程序的信号)是被屏蔽掉的。出厂的芯片中的boot_serial只检测2K(默认的应用程序起始位置)处是否存在有效的堆栈指针和复位向量,如果有的话则执行应用程序, ...…

查看全部问答>

步进增益放大(含源代码,51勿喷)

0.1v步进,利用DAC0832的倒T型电阻网络…

查看全部问答>

【最小系统板】大家用过什么样的彩色LED,能不能推荐一款

最小系统板的设计过程中,斑斑deweyled建议我加一个彩色LED到系统板上去。 我觉得挺有意思,配合PWM可以发出不同的颜色,所以在这里请大家推荐一种LED, 还是那个小要求,最好体积小,并且容易获得。…

查看全部问答>

基于瑞萨RL78/G14的车载报警器

希望 我的方案能够通过审核 谢谢网站举行的这次活动…

查看全部问答>