难点:1、串口定时器T1,和T0定时器优先级
2、pwm频率与占空比的设置
按键控制
按键1——前进
按键2——后退
按键3——加速
按键4——减速
(板子上只有四个按键)
串口控制
‘1’——前进
‘2’——后退
‘3’——加速
‘4’——减速
‘5’——左转
‘6’——右转
源码:
#include 结束!
typedef unsigned char u8;
typedef unsigned int u16;
//L298N引脚定义
sbit ena = P0^0;
sbit in1 = P0^1;
sbit in2 = P0^2;
sbit in3 = P0^3;
sbit in4 = P0^4;
sbit enb = P0^5;
//按键
sbit key1 = P3^3; //模拟前进
sbit key2 = P3^4; //模拟后退
sbit key3 = P3^6; //模拟加速
sbit key4 = P3^7; //模拟减速
u16 MA = 0,MB = 0; //pwm控制用
u16 SpeedA = 20; //50%占空比
u16 SpeedB = 20;
u8 flag; //标志,1代表前进,0代表后退
u8 cmd; //串口接收的命令sbuf
void delay(u16 z); //声明延时函数
//前进
void forward()
{
flag = 1; //代表前进状态
in1=1; //l298n手册
in2=0;
in3=1;
in4=0;
}
//后退
void fallback()
{
flag = 0; //代表后退状态
in1=0;
in2=1;
in3=0;
in4=1;
}
//加速
void quick()
{
SpeedA += 1; //每次加1
if(SpeedA >= 40) //最大40
{
SpeedA = 40;
}
SpeedB += 1;
if(SpeedB >= 40)
{
SpeedB = 40;
}
}
//减速
void slow()
{
SpeedA -= 1; //每次减1
if(SpeedA <= 5)//最小5
{
SpeedA = 5;
}
SpeedB -= 1;
if(SpeedB <= 5)
{
SpeedB = 5;
}
}
//左转
void move_left() //只有前进的时候可以左转
{
if(flag == 1) //前进状态
{
in1=1;
in2=0;
in3=0;
in4=0;
delay(50000);
forward();
}
}
//右转
void move_right() //只有前进的时候可以右转
{
if(flag == 1) //前进状态
{
in1=0;
in2=0;
in3=1;
in4=0;
delay(50000);
forward();
}
}
//停止
void stop()
{
in1=0;
in2=0;
in3=0;
in4=0;
}
void delay(u16 z)
{
u16 x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void SendOneByte(u8 c) //串口发送数据
{
SBUF = c;
while(!TI);
TI = 0;
}
void main()
{
//串口定时器 定时器T0
TMOD = 0x21; //T0定时器为工作方式一,T1定时器为工作方式二
PCON = 0x00; //串口初始化相关,波特率
SCON = 0x50; //串口初始化相关,串口工作方式一,允许接收
TH1 = 0xFD; //设置初值
TL1 = 0xFD; //设置初值
TR1 = 1; //开启定时器T1
TH0 = 0xF4; //设置初值
TL0 = 0x48; //设置初值
TR0 = 1; //开启定时器T0
ES = 1;//开放串口中断
//PS = 1; //串口中断优先
PT0 = 1; //定时器0中断优先
ET0 = 1;//开放定时器T0中断
EA = 1;//开放总中断
//按键控制小车
while(1)
{
if(key1 == 0)
{
delay(10);
if(key1 == 0)
{
forward();
SendOneByte(1);
}
while(key1 == 0);
}
if(key2 == 0)
{
delay(10);
if(key2 == 0)
{
fallback();
SendOneByte(2);
}
while(key2 == 0);
}
if(key3 == 0)
{
delay(10);
if(key3 == 0)
{
quick();
SendOneByte(3);
}
while(key3 == 0);
}
if(key4 == 0)
{
delay(10);
if(key4 == 0)
{
slow();
SendOneByte(4);
}
while(key4 == 0);
}
}
}
void time0_int() interrupt 1 //T = 3ms * 40 = 120ms
{
TR0 = 0;
TH0 = 0xF4;
TL0 = 0x48; //3000; 3ms
MA++;
if(MA < SpeedA)
{
ena = 1;
}
else
ena = 0;
if(MA == 40)
{
MA = 0;
}
MB++;
if(MB < SpeedB)
{
enb = 1;
}
else
enb = 0;
if(MB == 40)
{
MB = 0;
}
TR0 = 1;
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
//add your code here!
cmd = SBUF;
SendOneByte(cmd);
//串口控制小车
switch (cmd)
{
case 1:
forward();
SendOneByte(1);
break;
case 2:
fallback();
SendOneByte(2);
break;
case 3:
quick();
SendOneByte(3);
break;
case 4:
slow();
SendOneByte(4);
break;
case 5:
move_left();
SendOneByte(5);
break;
case 6:
move_right();
SendOneByte(6);
break;
default:
SendOneByte(7);
break;
}
}
}
上一篇:第一页
下一篇:使用51单片机输出PWM控制舵机
推荐阅读
史海拾趣
本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 包含本科和专科类的题目 本科的难度稍微大一些,涉及到一些机械方面的传动知识 … 查看全部问答∨ |
|
用altium编译工程,有如下错误 [Error] 串口.SchDoc Compiler 3V3 contains Open Collector Pin and Power Pin objects (Pin CN3-1,Pin CN3-2,Pin U1-3,Pin U2 ...… 查看全部问答∨ |
大学毕业后,我和所有毕业生一样,每天忙碌着跑招聘人才市场,在网上海量投递简历,几个月下来一无所获。虽然偶尔也会有公司打来通知去面试的电话,但是面试后结果都不尽人意,大部分工作都要求有项目开发经验,这一点也就成为了我找工作的拌脚石。 ...… 查看全部问答∨ |
Linux书籍包括:Linux入门、Linux系统管理与网络管理、Linux程序开发、Linux驱动开发、Linux网络开发、嵌入式开发。 大部分作者都是异地兼职来写书,异地兼职来做是完全没有问题的。 作者可以得到如下报酬: (1) ...… 查看全部问答∨ |
|
本帖最后由 dontium 于 2015-1-23 13:20 编辑 一直都在用AD603的芯片,不知TI有没有类似的芯片,希望能够提供一些资料。 … 查看全部问答∨ |
TCP与UDP区别 TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传 ...… 查看全部问答∨ |
刚购买一块stk600-atmega2560开发板,准备通过ISP方式下载程序到atmega2560中,电脑连接STK600成功,一直出现以下提示错误: 使用软件:studio4 PC机:thinkpad E420 i5 操作系统:32位WIN7旗舰版 猜测问题可能出在跳线的连接上, ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 任性DIY,在这等你来!
- 直播已结束|Molex 和 TTI 更小型、高速、可靠的连接器推动物联网应用的新发展
- 有奖直播:英飞凌工业半导体在电机驱动行业中的应用 2020年4月21日 上午10:00-11:30 准时开启!
- 【在线研讨会讲义下载】TOF 技术介绍及产品应用
- Maxim 利用nanoPower创新技术,致力于降低系统的静态功耗 看视频答题赢好礼! 还有免费开发板等你拿
- ADI有奖下载活动之18 ADI双光束分光光度计演示系统和解决方案
- 评论赢好礼|TI SK-AM64评估套件测评
- 2021 Digikey KOL系列——亲手教你转起一台无刷电机
- 有奖直播 | ST25 NFC新产品及应用方案介绍 报名中