📄 ckwl.c
字号:
//#include "stdarg.h"
#include <REG52.H>
#define Bit(i) (0x01<<i)
#define Motor P1
unsigned char code gDriveData[4]={0x03,0x06,0x0c,0x09};
unsigned char code bDriveData[4]={0x09,0x0c,0x06,0x03};
void mOtor(bit Way);
static bit tK;
#define MyAdd ('1')
sbit TX = P3^1;
sbit Light = P2^0;
static bit dRive,mDriv;
static unsigned char dRiveCnt;
void SerialInit()
{
TMOD |= 0x21;//选择定时器T1模式2,计时方式,T1工作模式1
TH0 = 0xd8;
TL0 = 0xf0;
//TR0 = 1;
ET0 = 1;
TH1 = 0xf3;//波特率6M 2400
TL1 = 0xf3;
SCON = 0xf0;//串口工作方式3 SM2 = 1;接收的第9位数据必须为1,接收才有效
SM2 = 1;
PCON = 0x80;//SMOD=1
PS = 1;//设置串口中断优先级
TR1 = 1;//启动定时器T1
ES = 1;
EA = 1;
TX = 1;
}
//串口发送一个字节
void SerialSendData(const unsigned char Dat )
{
while(TI);
SBUF = Dat;
while(!TI);
TI = 0;
}
//串口接收一个字节
unsigned char SerialRecvData(const bit rEN)
{
unsigned char Temp;
REN = rEN;
while(!RI);
Temp = SBUF;
RI = 0;
return Temp;
}
//串口发送字符串
void SerialSendStr(unsigned char *ptr)
{
while(*ptr != '\0')
{
SerialSendData(*ptr);
ptr++;
}
}
void main(void)
{
SerialInit();
mDriv = 1;
while(1)
{
mOtor(tK);
}
}
void Note_Task(void)
{
switch(SerialRecvData(1))
{
case '4':Light = 0;//开LED
SerialSendStr("Light ON ");
break;
case '5':Light = 1;//关LED
SerialSendStr("Light OFF ");
break;
case 'a':dRive = 1;//电机正转
TR0 = 1;
tK = 1;
SerialSendStr("Motor R ");
break;
case 'b':dRive = 1;//电机反转
TR0 = 1;
tK = 0;
SerialSendStr("Motor L ");
break;
case 's':dRive = 0;//电机停止
TR0 = 0;
tK = 1;
SerialSendStr("Motor Stop ");
break;
default:break;
}
}
void Serial_ISR(void) interrupt 4 using 1
{
ES = 0;//关中断
if(RI)//接收中断
{
RI = 0;
if(SBUF == MyAdd)//地址匹配则返回从机名字
{
SM2 = 0;//退出监听状态
SerialSendStr("Slave-No.1: ");
Note_Task();
SM2 = 1;
}
else
{ TX = 1;//锁定TX脚
//SM2 = 1;//地址不匹配继续监听
}
}
if(TI)//发送中断
{
TI = 0;
}
ES = 1;
}
void T0_ISR(void) interrupt 1 using 2
{
TH0 = 0xd8;
TL0 = 0xf0;
mDriv = 1;
if(++dRiveCnt == 4)
{
dRiveCnt = 0;//电机相位选择
}
}
void mOtor(bit Way)
{
if(Way)
{
if(dRive && mDriv)//启动命令dRive是否为1
{
mDriv = 0;
Motor = gDriveData[dRiveCnt];//电机正转
}
if(!dRive)
{
Motor |= 0x00;//电机停止
}
}
else
{
if(dRive && mDriv)
{
mDriv = 0;
Motor = bDriveData[dRiveCnt];//电机反转
}
if(!dRive)
{
Motor |= 0x00;//电机停止
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -