我最近在搞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;
}
}
|