#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
unsigned char i,j;
uchar buf;
sbit moto1=P1^0; //定义电机管脚
sbit moto2=P1^1;
sbit led1=P2^0; //定义P2.0口是led1
sbit led2=P2^1;
void main()
{
SCON=0x50;//设定串口工作方式0101 0000
PCON=0x00;
TMOD=0x20;
EA=1;
ES=1;
TL1=0xfd;//波特率9600
TH1=0xfd;
TR1=1;
while(1);
}
//串行中断服务函数
void serial() interrupt 4
{
ES=0; //暂时关闭串口中断
RI=0;
buf=SBUF; //把收到的信息从SBUF放到buf中。
switch(buf)
{
case 0x31:flag1();break; //二进制 0011 0001 十进制 49 控制字符 1 16进制 0X31
case 0x32:flag2();break; //1111 1101
}
ES=1; //重新开启串口中断
}
void delay(u16 i) //延时函数
{
while(i--);
}
void door()
{
moto1=1;
led1=1;
for(i=0;i<100;i++) //循环100次,也就是大约5S
{
delay(5000); //大约延时50ms
}
moto1=0; //关闭电机
led1=0; //关闭指示灯
moto2=1;
led2=1;
for(j=0;j<200;j++)
{
delay(5000);
}
moto2=~moto2 ;
led2=~led2 ;
}
void flag1 ( )
{
moto1=0; //关闭电机
moto2=0;
while(1)
{
door( );
}
}
void flag2 ( )
{
moto1=0;
moto2=0;
led1=0;
led2=0;
}
main最后单独一个while(1);这个程序到底要干啥?
你倒是把编译结果一起扔出来啊,我单独运行看一下,是没有错误的,另外你放出来的代码里面没有控制电机
大概率我猜的你是多个文件没处理好,a.c中的函数想在b.c里面使用,现在a.h里面声明一下这个被调用的函数,然后b.h包含以下a.h,就不会有重复定义的问题。我这边编译是没问题的。正反装,你就自己摸索去吧,直流电机正反转,就是一个工作的时候另一个不工作。这个随便代码里加点打印信息什么的很容易看到,或者直接上示波器看。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632