智能巡线小车 51单片机完整代码 void PWMInit(void) { //while(!TF0) //{ ENA=1;//PWM 输出高电平 ENB=1; //} // ********* 用户补充单片机产生PWM初始化代码 ********** // ********* 注:初始化时将占空比设为0********* ?????/???????? } /***************************************************************定时器初始化,中断周期为 1/frq,高点平的输出时间是 1/frq */ void TimerInit(unsigned short frq) { unsigned short T=1000*(1/frq); TMOD=0x01;/* 设定T0的工作模式为方式 1*/ EA=1; /* 开中断 */ ET0=1; /* 定时器0允许中断 */ TH0=(65536-1000*T)/256; /* 装入定时器的初值 */ TL0=(65536-1000*T)%6; TR0=1; /************ 启动定时器0 ,可以考虑放在 main() 中*/ while(!TF0) { PWMInit(); 根据给定文件中的标题、描述、标签以及部分内容,我们可以从中提炼出有关巡线小车程序设计中的关键知识点,包括但不限于51单片机的PWM控制、定时器初始化、电机驱动等核心内容。 ### 关键知识点一:PWM控制原理与实现 PWM(脉冲宽度调制)是一种用于模拟信号或模拟电路的数字信号技术。通过改变脉冲宽度来调整平均输出电压,进而控制电机转速或其他负载。在51单片机中,PWM可以通过定时器中断的方式实现。例如,在给定的部分代码中,`PWMInit()`函数负责初始化PWM功能: ```c void PWMInit(void) { ENA = 0; // PWM输出低电平 ENB = 0; // } // ********* 用户补充单片机产生PWM初始化代码 ********** // ********* 注:初始化时将占空比设为0********* ?????/???????? } ``` 这里设置`ENA`和`ENB`为低电平,意味着电机停止。后续可以通过改变定时器中断的时间间隔来改变PWM的频率,从而控制电机的转速。 ### 关键知识点二:定时器初始化与中断配置 在51单片机中,定时器通常用来实现定时操作或者产生特定频率的PWM信号。给定的代码中,`TimerInit(unsigned short frq)`函数负责初始化定时器: ```c void TimerInit(unsigned short frq) { unsigned short T = 1000 * (1 / frq); TMOD = 0x01; /* 设定T0的工作模式为方式 1*/ EA = 1; /* 开中断 */ ET0 = 1; /* 定时器0允许中断 */ TH0 = (65536 - 1000 * T) / 256; /* 装入定时器的初值 */ TL0 = (65536 - 1000 * T) % 6; TR0 = 1; /* 启动定时器0 ,可以考虑放在 main() 中*/ while (!TF0) { PWMInit(); } } ``` 此段代码通过计算得出定时器的初值,并设置定时器0的工作模式为模式1(16位计数器/定时器)。当定时器计数溢出时触发中断,通过这种方式可以实现精确的定时或PWM信号的产生。 ### 关键知识点三:电机驱动与控制 为了使巡线小车能够按照预定路径行驶,需要对电机进行精确控制。这涉及到电机的方向控制及速度调节。例如,在给定的代码片段中,`Motor_LCtl(unsigned char speed, unsigned char direction)`函数就是用来控制左电机的速度和方向: ```c void Motor_LCtl(unsigned char speed, unsigned char direction) { if (speed > 100) // 取值范围限制 speed = 100; while (speed > 0) { unsigned char i = 10; // 循环十次 PWM_LGdp(); while (i > 0) { i--; } speed--; } if (direction == 1) { // 正转 IN1 = 1; IN2 = 0; PWM_LGdp(); } else if (direction == 2) { // 反转 IN1 = 0; IN2 = 1; PWM_LGdp(); } else { // 停止 IN1 = 1; IN2 = 0; } } ``` 通过改变电机驱动端口的状态(如`IN1`和`IN2`),可以控制电机正转或反转;通过改变PWM的占空比(即`PWM_LGdp()`函数),可以调节电机转速。 这些关键知识点覆盖了巡线小车程序设计的核心部分,包括PWM控制、定时器中断配置以及电机驱动和控制等方面。这些技术的应用使得巡线小车能够准确地沿着预设路线行驶,并根据需要调整速度和方向。
/*******STC89C52单片机巡线小车控制程序************ By 邹朝彬*/
/*******要求 fosc=12 MHz*/
#include <INCLUDES.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit ENA=P2^4;//L298N使能端1
sbit ENB=P2^5;//L298N使能端2
unsigned char SeeFlag=0;// 传感器返回值 我去掉了 extern 外部变量声明,不知行不行得通。
/****************************************************************PWM波的初始化函数****/
void PWMInit(void)
{
ENA=0;//PWM 输出低电平
ENB=0;
//}
// ********* 用户补充单片机产生PWM初始化代码 **********
// ********* 注:初始化时将占空比设为0*********
}
/*****************************************************************************定时器初始化*/
{
TMOD=0x11;/* 设定T0,T1的工作模式都为方式 1*/
EA=1; /* 开中断 */
ET0=1; /* 定时器0允许中断 */
TH0=0; /* 装入定时器0的初值 */
TL0=0;
TR0=0;/*关闭定时器 0*/
ET1=1; /* 定时器1允许中断 */
TH1=0; /* 装入定时器1的初值 */
TL1=0;
TR1=0;/*关闭定时器 1*/
}
/********************************************************************************左边电机高电平输出时间为 1 ms */
void PWM_LGdp(void)
{
TH0=(65536-1000)/256; // 装入定时器的初值
TL0=(65536-1000)%256;
TR0=1; //************ 启动定时器 0 ,可以考虑放在 main() 中
while(!TF0)
{
ENA=1;
}
}
/********************************************************************************右边电机高电平输出时间为 1 ms */
void PWM_RGdp(void)
{
TH1=(65536-1000)/256; // 装入定时器的初值
剩余14页未读,继续阅读
- 粉丝: 440
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助