#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时
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』