历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | 单片机串口控制步进电机的源程序

2020-02-22 来源:eefocus

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define LED P1

//因为步进电机是减速步进电机,减速比的1/64 ,

//所以N=64时,步进电机主轴转一圈

//使用前请短接J2跳线帽,串口助手设置为比特率9600,无校验位,停止位1,发送数据为16进制形式

uchar code CCW[8]        ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};                   //逆时钟旋转相序表

uchar code CW[8]        ={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};                   //正时钟旋转相序表

uchar code table[]        ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //数码管显示数字表

sbit P2_0 = P2^0;

sbit P2_1 = P2^1;

sbit P2_2 = P2^2;

sbit P2_3 = P2^3;

sbit FMQ=P3^6;  //蜂鸣器


uchar          flag_rec;

uint        data_rec;

/*********************************************************************

        中断服务特殊功能寄存器配置

*********************************************************************/

void init_interrupt()

{

        TMOD=0x20;                //用定时器1设置串口波特率         9600

        TH1=0xfd;                //T1定时器装初值

        TL1=0xfd;                //T1定时器装初值

        TR1=1;                    //启动T1定时器

        REN=1;          //串口初始化

        SM0=0;                        //设定串口工作方式1

        SM1=1;                        //设定串口工作方式1

        EA=1;           //开启总中断

        ES=1;                        //开启串口中断


}


/*************************************************************

                                串口中断函数

**************************************************************/

void receive() interrupt 4

{

        RI=0;                                        //RI清零;因为收到数据或者或者发送了数据会由硬件置1

        data_rec=SBUF;                        //接收数据SBUF,将SBUF中的数据读走给data_rec,即将计算机的数据接收。

        //a=SBUF;

        ES = 0;                                        //关闭串口中断

        flag_rec=1;                                //中断标志位置1

}

/*****************************************************************

                                设置延时

******************************************************************/

void delaynms(uint aa)

{

  uchar bb;

  while(aa--)

  {   

          for(bb=0;bb<115;bb++)     //1ms基准延时程序

        {    ;   }

  }


}

void delay500us()

{

  int j;

  for(j=0;j<57;j++)

  {

   ;

  }

}

/*******************************************

                                蜂鸣器

******************************************/

void beep()

{

          uchar t;

          for(t=0;t<100;t++)

          {

                   delay500us();

                 FMQ=!FMQ;   //产生脉冲

          }

          FMQ=1;    //关闭蜂鸣器

}

/***************************************

                                正反转设计

****************************************/

void motor_ccw_deta(uchar deta,uchar speed)        //电机逆时针转deta度 deta=11时30度,deta=66d时180度

{

        uchar i;

        while(deta--)

        {

                for(i=0;i<8;i++)  //数组循环一周

                {

                        P1=CCW[i];

                        delaynms(speed);   //调节转速

                }

        }

}


void motor_cw_deta(uchar deta,uchar speed)        //电机顺时针转deta度 deta=11时30度,deta=66时180度

{

        uchar i;

        while(deta--)

        {

                 for(i=0;i<8;i++)  //内部循环一周

                 {

                           P1=CW[i];

                           delaynms(speed);   //调节转速

                }

        }

}

void Digital_tube_display(uint num)

{

        //4位数码管显示控制

        

        uchar temp,count;

        temp         = 0;

        count         = 0;

        if(num > 999 || num < 0) return;

        while(num)

        {

                temp         = num % 10;

                P0                 = table[temp];

                switch(count)    //判断

                {

                        case 0:P2_3=0;break;  //点亮第1个灯

                        case 1:P2_2=0;break;  //点亮第2个灯

                        case 2:P2_1=0;break;  //点亮第3个灯

                        case 3:P2_0=0;break;  //点亮第4个灯

                }

                delaynms(5);

                switch(count)    //判断

                {

                        case 0:P2_3=1;break;  //点亮第1个灯

                        case 1:P2_2=1;break;  //点亮第2个灯

                        case 2:P2_1=1;break;  //点亮第3个灯

                        case 3:P2_0=1;break;  //点亮第4个灯

                }

                num         = num / 10;

                count++;

        }

}


/**************************************************************

                                                           中断处理函数

****************************************************************/

void deal_interrupt_Date(uint dat)

{


        SBUF=dat;                         //发送数据dat_rec到SBUF,即将单片机的数据发送到计算机

        while(!TI);

        TI = 0;


        beep();

        motor_cw_deta(11,1);        //电机顺转deta度,deta=11时30度,deta=66时180度

        delaynms(10*dat);                //由于目前还没有找到如何传输255以上的数的方法,所以先乘以10

        motor_ccw_deta(11,1);        //电机逆转deta龋琩eta=11时30度,deta=66时180度                        

        

        ES=1;                 //打开串口中断        

        flag_rec=0;

}


/**************************************************************

                                                        主程序

****************************************************************/

void main()

{        

        init_interrupt();

        Digital_tube_display(0);

        while(1)

        {

                Digital_tube_display(data_rec);

推荐阅读

史海拾趣

Corsair Electrical Connectors Inc公司的发展小趣事

在国内市场取得一定成绩后,Corsair开始将目光投向了更广阔的国际市场。公司积极参加国际电子展会,与海外客户建立联系,拓展销售渠道。同时,Corsair还根据不同国家和地区的市场需求,调整产品策略,提供定制化的解决方案。这些努力使得Corsair的产品逐渐走进了国际市场,公司的影响力也不断扩大。

City_Technology公司的发展小趣事

随着业务的不断扩展,City Technology于1990年在英国南海岸的普茨茅斯建立了生产基地,并将办公楼从伦敦中心区迁至该地。这一举措不仅提高了公司的生产效率,也为其进一步拓展国际市场提供了有力支持。此后,公司开始在全球范围内设立销售中心,包括波恩(德国)、苏黎世(瑞士)、上海及芝加哥等地,逐步实现了业务的国际化。

格科微电子(GALAXYCORE)公司的发展小趣事

为了进一步推动公司的发展,City Technology于1993年决定售出部分股份,并在1996年成功在伦敦股票交易所上市。这一举措为公司带来了更多的资金支持,也为其后续的资本运作和战略扩张提供了可能。上市后的City Technology在资金、人才和市场资源等方面得到了极大的提升,为其日后的快速发展奠定了坚实的基础。

Amphenol Thermometrics公司的发展小趣事

随着市场的不断变化和需求的日益增长,City Technology并未满足于已有的成就。在1980年代末至1990年代初,公司积极扩展产品线,相继开发了电化学有毒气体传感器和可燃气体传感器。这些新产品的推出,不仅丰富了公司的产品线,也进一步巩固了其在气体传感领域的领先地位。同时,公司还不断对已有产品进行优化升级,以满足客户日益多样化的需求。

圣邦微电子(Fangtek)公司的发展小趣事

随着业务的不断扩展,City Technology于1990年在英国南海岸的普茨茅斯建立了生产基地,并将办公楼从伦敦中心区迁至该地。这一举措不仅提高了公司的生产效率,也为其进一步拓展国际市场提供了有力支持。此后,公司开始在全球范围内设立销售中心,包括波恩(德国)、苏黎世(瑞士)、上海及芝加哥等地,逐步实现了业务的国际化。

百佳(BAIJIA)公司的发展小趣事

百佳公司的创始人蔡永权,在改革开放初期,凭借敏锐的商业洞察力和对技术的执着追求,创立了中山市古镇百佳电子电器厂。初创时期,公司面临着资金短缺、设备简陋、市场竞争激烈等多重困难。然而,蔡永权带领团队坚持不懈,以质量为核心,通过不断改进生产工艺和提升产品质量,逐渐赢得了客户的信任和市场的认可。

问答坊 | AI 解惑

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?…

查看全部问答>

中移动Ophone手机主界面曝光 5月底正式发布

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 5月11日消息,据中国移动相关人士透露,5月中下旬中移动将正式公开发布采用OMS手机操作系统(Open mobile system)的Ophone手机。这将意味着中国自主研发的OMS手机操作系统将正式走上前台,向 ...…

查看全部问答>

【FPGA 代码】

持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel 为0,则out=a ;否则out=bendmodule阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);inpu ...…

查看全部问答>

问一个笨笨的问题

请问如何在EVC build后执行某个PC上的EXE文件. 比如,我要在build aa.exe后自动调用bb.exe. 我在post-build里设置,总是不成功.…

查看全部问答>

硬件仿真

想问一下支持硬件仿真的单片机芯片都有哪些  谢谢…

查看全部问答>

WINCE6.0操作系统在三星6410开发板上完美展现!--基于立宇泰ARMSYS6410开发板

精彩测评实例图片说明:1,WINCE6.0系统启动画面(进度条动态显示内核加载进程,LOGO图片可以根据客户需要免费更换);2,WINCE6.0桌面效果;3,800x480液晶屏全屏播放H.264视频流文件(采用硬件解码)4,800x480液晶屏全屏播放MPEG4(avi后缀)音视 ...…

查看全部问答>

我UCOS项目任务优先级划分问题

我在做同步相量测量(PMU) 就是把AD采集的三项交流电压和电流值打上时标然后上传,在接收PC发送的控制命令,如控制继电器开关的命令。由于要对数据打时标(时间戳),底层的PMU采集装置散布在不同的点,每一个点(PMU)安装一个GPS 不现实 ...…

查看全部问答>

Ecan通信的中断问题

       本人在一个项目中运用Ecan进行通信,在通信过程中会碰到中断故障(具体原因说不上来)。我是将Ecan设置成中断接收的(邮箱0-15设置成接收邮箱,16邮箱设置成发送邮箱),若接收到一个合理的读写命令,则返回 ...…

查看全部问答>

g2553定时器的使用问题

#include \"msp430g2553.h\" int main( void ) {   // Stop watchdog timer to prevent time out reset     WDTCTL = WDTPW + WDTHOLD;         P1DIR |= BIT0;     P1OUT &= ~BIT0; & ...…

查看全部问答>

AVR编程软件

我的电脑是64位机,系统是win7的家庭普通版,买电脑觉得送了个win7的正版系统,就没在升旗舰了。 现在在学AVR单片机,老师需要我给编一些程序,但是下了很多相关编程软件,就是用不了(比如CVAVR,ICCAVR). 很困惑,求大神指点!!! 谢谢…

查看全部问答>