我最近在搞51单片机串口通讯和42步进电机控制,但是始终无法解决双定时器问题。 使用的是89c52芯片+步进电机驱动+42步进电机,我苦恼的是,单独使用串口通讯功能没有,单独控制42步进电机也没有问题,但是结合在一起,就不行了。
求大神指点。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit shi_neng=P1^0; // 使能控制位
sbit fang_xiang=P1^1;// 旋转方向控制位
sbit mai_chong=P1^2; // 脉冲控制位
sbit qi_dong=P2^0;// 启动按钮
sbit ting_zhi=P2^1;//停止按钮
sbit zheng_zhuan=P2^2;//正转按钮
sbit dg5=P1^5;
sbit dg6=P1^6;
sbit beep = P2^3;//蜂鸣器接口
uchar num,p1;//发送暂存变量
unsigned int m,f,s,pp,sa,xa,xb;
unsigned int p2;
void delay(uint i)//延时函数
{
uchar j,k;
for(j=0;j<i;j++)
for(k=0;k<50;k++);
}
void UART_init()
{
SCON=0X50;
TMOD = 0x20; //T1工作模式2 8位自动重装
TH1 = 0xfd;
TL1 = 0xfd; //比特率9600
TR1 = 1; //启动T1定时器
SM0 = 0;
SM1 = 1; //串口工作方式1 10位异步
REN = 1; //串口允许接收
EA = 1; //开总中断
ES = 1; //串口中断打开
}
void djzf(uint x)
{
if(x==1)
{
shi_neng=0; // 使能控制位
fang_xiang=1;// 旋转方向控制位
dg5=0;
dg6=1;
}
if(x==2)
{shi_neng=0; // 使能控制位
fang_xiang=0;// 旋转方向控制位
dg5=1;
dg6=0;
}
if(x==3)
{shi_neng=1; // 使能控制位
fang_xiang=0;// 旋转方向控制位
dg5=1;
dg6=1;
}
}
void main()
{
unsigned int p3;
UART_init(); //串口初始化
p3=p2;
switch (p2)
{
case 1:djzf(1);
case 2:djzf(2);
case 3:djzf(3);
break;
}
while(1);
{
mai_chong=1; //输出时钟脉冲
delay(3);
mai_chong=0;
delay(3);
}
}
void UART() interrupt 4
{
if(RI) //检测是否接收完成
{
num = SBUF; //num 取出接收缓存器的值
p2=(int)num;
beep = 0;
delay(100);
beep = 1;//蜂鸣器发出滴提示音
num++;//把接收的数据加1并发送
RI = 0;
SBUF = num;
EA=0;
while(!TI);
TI = 0;
}
}
|