注册会员
- 积分
- 22
- 威望
- 16
- 贡献
- 6
- 兑换币
- 6
- 注册时间
- 2016-8-13
- 在线时间
- 0 小时
- 毕业学校
- 安徽大学
|
2#
楼主 |
发表于 2016-8-13 22:00:38
|
只看该作者
[code]#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P1^1; //电机接口
sbit IN2=P1^2;
sbit IN3=P1^3;
sbit IN4=P1^4;
sbit ENA=P1^5;
sbit ENB=P1^6;
uchar chuankou[4]={0}; //串口接收到的值;
uchar i=0,j=0,lpwm=35,rpwm=35; //占空比标志
void go() //前进函数
{
rpwm=35;
lpwm=35;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void back() //后退函数
{
rpwm=35;
lpwm=35;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void left() //左转函数
{
lpwm=35; //调整左轮占空比 使右轮转速比左轮快 左转
rpwm=38; //调整右轮占空比
IN1=1;
IN2=1;
IN3=0;
IN4=1;
}
void right() //右转函数
{
lpwm=38; //调整左右轮占空比使左轮转速比右轮快 右转
rpwm=35;
IN1=0;
IN2=1;
IN3=1;
IN4=1;
}
void stop() //停车
{
rpwm=0;
lpwm=0;
IN1=1;
IN2=1;
IN3=1;
IN4=1;
}
void init()
{
TMOD=0x21; //设定定时器为方式2 可自动再装入的定时器
SM0=0; //设定串口工作方式1 10位异步收发器 8位数据
SM1=1; //设定串口工作方式1 10位异步收发器 8位数据
TH1=0xfd;//装入初值
TL1=0xfd; //装入初值
PCON=0x00; //设定串行口波特率
REN=1; //允许串行接收位。REN=1,启动接收数据;REN=0,禁止接收。
IP=0x10;
TH0=(65535-100)/256;
TL0=(65535-100)%256;
TR0=1; //启用T0定时器/计数器
ET0=1; //T0定时器中断开关;(开)
TR1=1; //启用T1定时器/计数器
ET1=1; //T1定时器中断开关;(开)
ES=1; //串行中断开关;(开)
EA=1; //总中断开关;(开)
ENA=1;
ENB=1;
}
void main()
{
init();
while(1)
{
switch(chuankou[0])
{
case 1:go();break;
case 2:back();break;
case 3:left();break;
case 4:right();break;
case 0:stop();break;
default:break;
}
}
}
//串口中断
void serial() interrupt 4
{
EA=0;
if(RI==1)
{
if(SBUF==0x02)
{
chuankou[0]=1;
}
if(SBUF==0x04)
{
chuankou[0]=2;
}
if(SBUF==0x06)
{
chuankou[0]=3;
}
if(SBUF==0x08)
{
chuankou[0]=4;
}
if(SBUF==0x10)
{
chuankou[0]=0;
}
RI=0;
}
EA=1;
}
void timer0() interrupt 1
{
i++;
j++;
if(i<=rpwm)
{
ENA=1;
}
else
ENA=0;
if(i==40)
{
ENA=~ENA;
i=0;
}
if(j<=lpwm)
{
ENB=1;
}
else
ENB=0;
if(j==40)
{
ENB=~ENB;
j=0;
}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
|
|