历史上的今天
今天是: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);
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 5月11日消息,据中国移动相关人士透露,5月中下旬中移动将正式公开发布采用OMS手机操作系统(Open mobile system)的Ophone手机。这将意味着中国自主研发的OMS手机操作系统将正式走上前台,向 ...… 查看全部问答> |
|
WINCE6.0操作系统在三星6410开发板上完美展现!--基于立宇泰ARMSYS6410开发板 精彩测评实例图片说明:1,WINCE6.0系统启动画面(进度条动态显示内核加载进程,LOGO图片可以根据客户需要免费更换);2,WINCE6.0桌面效果;3,800x480液晶屏全屏播放H.264视频流文件(采用硬件解码)4,800x480液晶屏全屏播放MPEG4(avi后缀)音视 ...… 查看全部问答> |
|
我在做同步相量测量(PMU) 就是把AD采集的三项交流电压和电流值打上时标然后上传,在接收PC发送的控制命令,如控制继电器开关的命令。由于要对数据打时标(时间戳),底层的PMU采集装置散布在不同的点,每一个点(PMU)安装一个GPS 不现实 ...… 查看全部问答> |
|
本人在一个项目中运用Ecan进行通信,在通信过程中会碰到中断故障(具体原因说不上来)。我是将Ecan设置成中断接收的(邮箱0-15设置成接收邮箱,16邮箱设置成发送邮箱),若接收到一个合理的读写命令,则返回 ...… 查看全部问答> |
|
#include \"msp430g2553.h\" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0; P1OUT &= ~BIT0; & ...… 查看全部问答> |




