难点: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控制舵机
推荐阅读
史海拾趣
随着LED背光驱动芯片的成功推出,启攀微电子(CHIPHOM)逐渐在市场上崭露头角。然而,公司并没有满足于现状,而是继续加大研发投入,拓展产品线。在一次国际电子展上,公司展示了音频功率放大芯片和电阻式触摸屏控制芯片,引起了众多客户的关注。通过不懈的市场推广和技术支持,启攀微电子(CHIPHOM)成功打开了国内外市场的大门,实现了销售收入的快速增长。
随着自动化技术的不断进步,传感器技术的需求也日益增长。BALLUFF公司紧跟时代潮流,不断推出创新的传感器产品。从1968年开始生产感应式接近开关BES,到1978年光学开关BOS的面世,再到后来由微型处理器控制的转换机构与角度编码器的加入,BALLUFF在传感器领域的技术实力不断增强。此外,公司还陆续推出了旋转传感器BRG、识别系统BIS和超声波位移传感器BTL等产品,进一步丰富了其传感器产品线,满足了不同行业的需求。
在电子市场竞争日益激烈的背景下,Caltron Devices Ltd公司始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料的采购到生产过程的控制,再到产品的出厂检验,每一个环节都严格把关。正是这种对品质的执着追求,使得Caltron的产品在市场上获得了良好的口碑,赢得了客户的信赖。
在电子市场竞争日益激烈的背景下,Caltron Devices Ltd公司始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料的采购到生产过程的控制,再到产品的出厂检验,每一个环节都严格把关。正是这种对品质的执着追求,使得Caltron的产品在市场上获得了良好的口碑,赢得了客户的信赖。
在通信行业,技术的不断创新和产品的持续升级是企业保持竞争力的关键。康普公司一直注重研发和创新,不断推出具有竞争力的新产品和解决方案。例如,在2004年,康普成立了CCS(连接解决方案)工厂,主要生产宽带同轴电缆、网络对绞线缆以及铜和光纤连接器系列产品。这些产品不仅满足了市场对于高速、高质量网络连接的需求,也进一步巩固了康普在通信行业的领先地位。
进入21世纪,超霸电池继续加大技术研发力度,推出了Recyko绿再系列高端绿色充电套装。这一系列产品不仅外观时尚、性能卓越,还实现了快速充电、低自放电等先进技术。其中,“十分充”产品更是将充电速度提升到了前所未有的高度,仅需10分钟即可将电池电量从0充至90%以上。Recyko绿再系列的成功推出,不仅为超霸电池赢得了更多用户的青睐,也推动了整个电池行业的技术进步。
电池短路是指电池的正负极直接用导线接成通路。首先,这要看是什么电池,或者说要看电池的“能量”有多大。 1、如果是普通的干电池,一般不会出现剧烈的现象。因为普能电池内阻大,能量小,“烧”不起劲来。例如:普通5号短路后外表看不出任何 ...… 查看全部问答∨ |
|
前两个帖子里分别以不同的方式实现的LED的闪烁,今天再以信号量的方式来实现LED的闪烁。程序里一共用到了两个信号量,分别为io_sem和delay_sem,这两个信号量就类似一个互斥的变量,使得程序交替运行延时和IO反转的进程。下面上传源代码,同样附件 ...… 查看全部问答∨ |
讨论下用热电偶测温差的问题,有的书上介绍可以用热电偶反向串联变送器测温差,我的问提是 热电偶反向串联不是线性的,变送器处理的mv值是不等的.例如100度温差,在500度与400度时是4.058mv,而1000度与900度是3.98mv;变送器如何处理???? ...… 查看全部问答∨ |
友坚6410平台,目录 D:\\WINCE600\\PLATFORM\\SMDK6410\\SRC\\BOOTLOADER\\下有以下几个子目录, \\EBOOT.WHIMORY \\NBL1.IROM_SD \\NBL1.LSB \\NBL2 这几个目录的作用是什么?,先执行哪一个目录? \\EBOOT.WHIMORY 可能是 EBoot, NBoot启开后, ...… 查看全部问答∨ |
|
正在研究 PE 文件的格式,但是对导入表的结构和用法不太明白。 已经能够从PE文件分析出导入表中的,但是不知道怎么解析系统创建的 调转表和调转地址。 我的代码里调用一个系统函数的时候,反汇编(ARM芯片)得到 ;处理参数等 0001287C EB00033 ...… 查看全部问答∨ |
|
为什么我的SST Flash的Block擦除都能够实现,但是不能实现Sector 擦除! 这是什么原因?我用的是SST 39VF6401B 我的代码: Top[0x555] = 0x00aa; &nbs ...… 查看全部问答∨ |